Better Initialization
This commit is contained in:
		
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										1117
									
								
								EvolutionaryAlgorithm/EvolutionaryAlgorithm.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1117
									
								
								EvolutionaryAlgorithm/EvolutionaryAlgorithm.py
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										5386
									
								
								EvolutionaryAlgorithm/InitializationPlots.ipynb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5386
									
								
								EvolutionaryAlgorithm/InitializationPlots.ipynb
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										371
									
								
								EvolutionaryAlgorithm/InteractiveVersion.ipynb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										371
									
								
								EvolutionaryAlgorithm/InteractiveVersion.ipynb
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,371 @@ | ||||
| { | ||||
|  "cells": [ | ||||
|   { | ||||
|    "cell_type": "markdown", | ||||
|    "metadata": {}, | ||||
|    "source": [ | ||||
|     "# User Interface for the Evolutionary Algorithm" | ||||
|    ] | ||||
|   }, | ||||
|   { | ||||
|    "cell_type": "code", | ||||
|    "execution_count": 1, | ||||
|    "metadata": {}, | ||||
|    "outputs": [ | ||||
|     { | ||||
|      "data": { | ||||
|       "text/html": [ | ||||
|        "        <script type=\"text/javascript\">\n", | ||||
|        "        window.PlotlyConfig = {MathJaxConfig: 'local'};\n", | ||||
|        "        if (window.MathJax) {MathJax.Hub.Config({SVG: {font: \"STIX-Web\"}});}\n", | ||||
|        "        if (typeof require !== 'undefined') {\n", | ||||
|        "        require.undef(\"plotly\");\n", | ||||
|        "        requirejs.config({\n", | ||||
|        "            paths: {\n", | ||||
|        "                'plotly': ['https://cdn.plot.ly/plotly-latest.min']\n", | ||||
|        "            }\n", | ||||
|        "        });\n", | ||||
|        "        require(['plotly'], function(Plotly) {\n", | ||||
|        "            window._Plotly = Plotly;\n", | ||||
|        "        });\n", | ||||
|        "        }\n", | ||||
|        "        </script>\n", | ||||
|        "        " | ||||
|       ] | ||||
|      }, | ||||
|      "metadata": {}, | ||||
|      "output_type": "display_data" | ||||
|     }, | ||||
|     { | ||||
|      "data": { | ||||
|       "text/html": [ | ||||
|        "        <script type=\"text/javascript\">\n", | ||||
|        "        window.PlotlyConfig = {MathJaxConfig: 'local'};\n", | ||||
|        "        if (window.MathJax) {MathJax.Hub.Config({SVG: {font: \"STIX-Web\"}});}\n", | ||||
|        "        if (typeof require !== 'undefined') {\n", | ||||
|        "        require.undef(\"plotly\");\n", | ||||
|        "        requirejs.config({\n", | ||||
|        "            paths: {\n", | ||||
|        "                'plotly': ['https://cdn.plot.ly/plotly-latest.min']\n", | ||||
|        "            }\n", | ||||
|        "        });\n", | ||||
|        "        require(['plotly'], function(Plotly) {\n", | ||||
|        "            window._Plotly = Plotly;\n", | ||||
|        "        });\n", | ||||
|        "        }\n", | ||||
|        "        </script>\n", | ||||
|        "        " | ||||
|       ] | ||||
|      }, | ||||
|      "metadata": {}, | ||||
|      "output_type": "display_data" | ||||
|     }, | ||||
|     { | ||||
|      "name": "stderr", | ||||
|      "output_type": "stream", | ||||
|      "text": [ | ||||
|       "/home/jonas/Dokumente/gitRepos/master_thesis/EvolutionaryAlgorithm/EvolutionaryAlgorithm.py:58: TqdmExperimentalWarning:\n", | ||||
|       "\n", | ||||
|       "Using `tqdm.autonotebook.tqdm` in notebook mode. Use `tqdm.tqdm` instead to force console mode (e.g. in jupyter console)\n", | ||||
|       "\n" | ||||
|      ] | ||||
|     } | ||||
|    ], | ||||
|    "source": [ | ||||
|     "import EvolutionaryAlgorithm" | ||||
|    ] | ||||
|   }, | ||||
|   { | ||||
|    "cell_type": "code", | ||||
|    "execution_count": 2, | ||||
|    "metadata": {}, | ||||
|    "outputs": [], | ||||
|    "source": [ | ||||
|     "import ipywidgets as widgets\n", | ||||
|     "from IPython.display import display, HTML, Markdown" | ||||
|    ] | ||||
|   }, | ||||
|   { | ||||
|    "cell_type": "code", | ||||
|    "execution_count": 3, | ||||
|    "metadata": {}, | ||||
|    "outputs": [], | ||||
|    "source": [ | ||||
|     "# user widgets\n", | ||||
|     "w_result_out = widgets.Output()\n", | ||||
|     "w_ing_list_out = widgets.Output()" | ||||
|    ] | ||||
|   }, | ||||
|   { | ||||
|    "cell_type": "markdown", | ||||
|    "metadata": {}, | ||||
|    "source": [ | ||||
|     "**setup input ingredients:**" | ||||
|    ] | ||||
|   }, | ||||
|   { | ||||
|    "cell_type": "code", | ||||
|    "execution_count": 4, | ||||
|    "metadata": {}, | ||||
|    "outputs": [ | ||||
|     { | ||||
|      "data": { | ||||
|       "text/markdown": [ | ||||
|        "**number of input ingredients:**" | ||||
|       ], | ||||
|       "text/plain": [ | ||||
|        "<IPython.core.display.Markdown object>" | ||||
|       ] | ||||
|      }, | ||||
|      "metadata": {}, | ||||
|      "output_type": "display_data" | ||||
|     }, | ||||
|     { | ||||
|      "data": { | ||||
|       "application/vnd.jupyter.widget-view+json": { | ||||
|        "model_id": "5796ec52773740c59e747c0e5f77410e", | ||||
|        "version_major": 2, | ||||
|        "version_minor": 0 | ||||
|       }, | ||||
|       "text/plain": [ | ||||
|        "ToggleButtons(index=3, options=('1', '2', '3', '4', '5', '6', '7', '8', '9', '10'), style=ToggleButtonsStyle(b…" | ||||
|       ] | ||||
|      }, | ||||
|      "metadata": {}, | ||||
|      "output_type": "display_data" | ||||
|     }, | ||||
|     { | ||||
|      "data": { | ||||
|       "text/markdown": [ | ||||
|        "**maximum number of additional ingredients:**" | ||||
|       ], | ||||
|       "text/plain": [ | ||||
|        "<IPython.core.display.Markdown object>" | ||||
|       ] | ||||
|      }, | ||||
|      "metadata": {}, | ||||
|      "output_type": "display_data" | ||||
|     }, | ||||
|     { | ||||
|      "data": { | ||||
|       "application/vnd.jupyter.widget-view+json": { | ||||
|        "model_id": "92fd11191481475a9c40ae76201b4772", | ||||
|        "version_major": 2, | ||||
|        "version_minor": 0 | ||||
|       }, | ||||
|       "text/plain": [ | ||||
|        "ToggleButtons(index=3, options=('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'), style=ToggleButtonsStyle(bu…" | ||||
|       ] | ||||
|      }, | ||||
|      "metadata": {}, | ||||
|      "output_type": "display_data" | ||||
|     }, | ||||
|     { | ||||
|      "data": { | ||||
|       "application/vnd.jupyter.widget-view+json": { | ||||
|        "model_id": "618b5a44910843bbaed8b36c3ad2bc46", | ||||
|        "version_major": 2, | ||||
|        "version_minor": 0 | ||||
|       }, | ||||
|       "text/plain": [ | ||||
|        "Output()" | ||||
|       ] | ||||
|      }, | ||||
|      "metadata": {}, | ||||
|      "output_type": "display_data" | ||||
|     }, | ||||
|     { | ||||
|      "data": { | ||||
|       "text/markdown": [ | ||||
|        "**number of evolutionary cycles:**" | ||||
|       ], | ||||
|       "text/plain": [ | ||||
|        "<IPython.core.display.Markdown object>" | ||||
|       ] | ||||
|      }, | ||||
|      "metadata": {}, | ||||
|      "output_type": "display_data" | ||||
|     }, | ||||
|     { | ||||
|      "data": { | ||||
|       "application/vnd.jupyter.widget-view+json": { | ||||
|        "model_id": "301ebb9ed6024493ad85c2b79402345e", | ||||
|        "version_major": 2, | ||||
|        "version_minor": 0 | ||||
|       }, | ||||
|       "text/plain": [ | ||||
|        "ToggleButtons(index=1, options=('0', '5', '10', '15', '20', '25', '30', '35', '40', '45'), style=ToggleButtons…" | ||||
|       ] | ||||
|      }, | ||||
|      "metadata": {}, | ||||
|      "output_type": "display_data" | ||||
|     }, | ||||
|     { | ||||
|      "data": { | ||||
|       "text/markdown": [ | ||||
|        "**population size:**" | ||||
|       ], | ||||
|       "text/plain": [ | ||||
|        "<IPython.core.display.Markdown object>" | ||||
|       ] | ||||
|      }, | ||||
|      "metadata": {}, | ||||
|      "output_type": "display_data" | ||||
|     }, | ||||
|     { | ||||
|      "data": { | ||||
|       "application/vnd.jupyter.widget-view+json": { | ||||
|        "model_id": "c90d303cd2cb43d1aae401ac6226e3a1", | ||||
|        "version_major": 2, | ||||
|        "version_minor": 0 | ||||
|       }, | ||||
|       "text/plain": [ | ||||
|        "ToggleButtons(index=1, options=('5', '10', '15', '20', '25', '30', '35', '40', '45', '50'), style=ToggleButton…" | ||||
|       ] | ||||
|      }, | ||||
|      "metadata": {}, | ||||
|      "output_type": "display_data" | ||||
|     }, | ||||
|     { | ||||
|      "data": { | ||||
|       "application/vnd.jupyter.widget-view+json": { | ||||
|        "model_id": "cea1f9de60344298ac8417d755ad74df", | ||||
|        "version_major": 2, | ||||
|        "version_minor": 0 | ||||
|       }, | ||||
|       "text/plain": [ | ||||
|        "Button(description='run EA', style=ButtonStyle())" | ||||
|       ] | ||||
|      }, | ||||
|      "metadata": {}, | ||||
|      "output_type": "display_data" | ||||
|     }, | ||||
|     { | ||||
|      "data": { | ||||
|       "application/vnd.jupyter.widget-view+json": { | ||||
|        "model_id": "3ac8e962dfeb445fa3417dbdbfd5c44c", | ||||
|        "version_major": 2, | ||||
|        "version_minor": 0 | ||||
|       }, | ||||
|       "text/plain": [ | ||||
|        "Output()" | ||||
|       ] | ||||
|      }, | ||||
|      "metadata": {}, | ||||
|      "output_type": "display_data" | ||||
|     } | ||||
|    ], | ||||
|    "source": [ | ||||
|     "w_number_input_ings = widgets.ToggleButtons(\n", | ||||
|     "    options = [str(i+1) for i in range(10)],\n", | ||||
|     "    value='4')\n", | ||||
|     "w_number_input_ings.style.button_width=\"10px\"\n", | ||||
|     "w_number_additional_ings = widgets.ToggleButtons(options=[str(i) for i  in range(10)], value='3')\n", | ||||
|     "w_number_additional_ings.style.button_width=\"10px\"\n", | ||||
|     "\n", | ||||
|     "'''\n", | ||||
|     "containers = [\n", | ||||
|     "        widgets.Combobox(\n", | ||||
|     "            # value='John',\n", | ||||
|     "            placeholder='Choose Ingredient',\n", | ||||
|     "            options=EvolutionaryAlgorithm.m_base_mix.get_labels(),\n", | ||||
|     "            description=f'Ingredient {i}',\n", | ||||
|     "            ensure_option=True,\n", | ||||
|     "            disabled=False\n", | ||||
|     "        )\n", | ||||
|     "\n", | ||||
|     "    for i in range(10)]\n", | ||||
|     "'''\n", | ||||
|     "\n", | ||||
|     "containers = [\n", | ||||
|     "        widgets.Text(\n", | ||||
|     "            # value='John',\n", | ||||
|     "            placeholder='Choose Ingredient',\n", | ||||
|     "            description=f'Ingredient {i}',\n", | ||||
|     "            disabled=False\n", | ||||
|     "        )\n", | ||||
|     "\n", | ||||
|     "    for i in range(10)]\n", | ||||
|     "\n", | ||||
|     "ingredients = []\n", | ||||
|     "w_ing_container = widgets.VBox(ingredients)\n", | ||||
|     "\n", | ||||
|     "display(Markdown(\"**number of input ingredients:**\"))\n", | ||||
|     "display(w_number_input_ings)\n", | ||||
|     "display(Markdown(\"**maximum number of additional ingredients:**\"))\n", | ||||
|     "display(w_number_additional_ings)\n", | ||||
|     "\n", | ||||
|     "def update_ings(e=None):\n", | ||||
|     "    if len(w_ing_container.children) == int(w_number_input_ings.value):\n", | ||||
|     "        return\n", | ||||
|     "    \n", | ||||
|     "    w_ing_list_out.clear_output()\n", | ||||
|     "    with w_ing_list_out:\n", | ||||
|     "        display(widgets.VBox([containers[i] for i in range(int(w_number_input_ings.value))]))\n", | ||||
|     "\n", | ||||
|     "update_ings()\n", | ||||
|     "display(w_ing_list_out)\n", | ||||
|     "\n", | ||||
|     "# control evo cycle:\n", | ||||
|     "w_number_cycles = widgets.ToggleButtons(options=[str(i*5) for i  in range(10)], value='5')\n", | ||||
|     "w_number_cycles.style.button_width=\"10px\"\n", | ||||
|     "\n", | ||||
|     "w_population_size = widgets.ToggleButtons(options=[str((i+1)*5) for i  in range(10)], value='10')\n", | ||||
|     "w_population_size.style.button_width=\"10px\"\n", | ||||
|     "\n", | ||||
|     "display(Markdown(\"**number of evolutionary cycles:**\"))\n", | ||||
|     "display(w_number_cycles)\n", | ||||
|     "display(Markdown(\"**population size:**\"))\n", | ||||
|     "display(w_population_size)\n", | ||||
|     "\n", | ||||
|     "\n", | ||||
|     "w_run_button = widgets.Button(description=\"run EA\")\n", | ||||
|     "\n", | ||||
|     "def run(e=None):\n", | ||||
|     "    w_result_out.clear_output()\n", | ||||
|     "    with w_result_out:\n", | ||||
|     "        p = EvolutionaryAlgorithm.Population(\n", | ||||
|     "            [containers[i].value for i in range(int(w_number_input_ings.value))],\n", | ||||
|     "            max_additional_ings=int(w_number_additional_ings.value)\n", | ||||
|     "        )\n", | ||||
|     "        p.run(int(w_number_cycles.value))\n", | ||||
|     "        display(Markdown(\"**Population after running EA:**\"))\n", | ||||
|     "        p.plot_population(collect_scores=int(w_population_size.value)>0)\n", | ||||
|     "        \n", | ||||
|     "display(w_run_button)\n", | ||||
|     "display(w_result_out)\n", | ||||
|     "w_run_button.on_click(run)\n", | ||||
|     "\n", | ||||
|     "w_number_input_ings.observe(update_ings)" | ||||
|    ] | ||||
|   }, | ||||
|   { | ||||
|    "cell_type": "code", | ||||
|    "execution_count": null, | ||||
|    "metadata": {}, | ||||
|    "outputs": [], | ||||
|    "source": [] | ||||
|   } | ||||
|  ], | ||||
|  "metadata": { | ||||
|   "kernelspec": { | ||||
|    "display_name": "Python 3", | ||||
|    "language": "python", | ||||
|    "name": "python3" | ||||
|   }, | ||||
|   "language_info": { | ||||
|    "codemirror_mode": { | ||||
|     "name": "ipython", | ||||
|     "version": 3 | ||||
|    }, | ||||
|    "file_extension": ".py", | ||||
|    "mimetype": "text/x-python", | ||||
|    "name": "python", | ||||
|    "nbconvert_exporter": "python", | ||||
|    "pygments_lexer": "ipython3", | ||||
|    "version": "3.7.5" | ||||
|   } | ||||
|  }, | ||||
|  "nbformat": 4, | ||||
|  "nbformat_minor": 4 | ||||
| } | ||||
| @ -1,28 +1,8 @@ | ||||
| { | ||||
|  "nbformat": 4, | ||||
|  "nbformat_minor": 2, | ||||
|  "metadata": { | ||||
|   "language_info": { | ||||
|    "name": "python", | ||||
|    "codemirror_mode": { | ||||
|     "name": "ipython", | ||||
|     "version": 3 | ||||
|    } | ||||
|   }, | ||||
|   "orig_nbformat": 2, | ||||
|   "file_extension": ".py", | ||||
|   "mimetype": "text/x-python", | ||||
|   "name": "python", | ||||
|   "npconvert_exporter": "python", | ||||
|   "pygments_lexer": "ipython3", | ||||
|   "version": 3 | ||||
|  }, | ||||
|  "cells": [ | ||||
|   { | ||||
|    "cell_type": "markdown", | ||||
|    "execution_count": null, | ||||
|    "metadata": {}, | ||||
|    "outputs": [], | ||||
|    "source": [ | ||||
|     "# Statistical Tools" | ||||
|    ] | ||||
| @ -33,14 +13,13 @@ | ||||
|    "metadata": {}, | ||||
|    "outputs": [], | ||||
|    "source": [ | ||||
|     "import numpy as np" | ||||
|     "import numpy as np\n", | ||||
|     "import scipy.stats" | ||||
|    ] | ||||
|   }, | ||||
|   { | ||||
|    "cell_type": "markdown", | ||||
|    "execution_count": null, | ||||
|    "metadata": {}, | ||||
|    "outputs": [], | ||||
|    "source": [ | ||||
|     "* Helper function to calculate the wheel of fortune" | ||||
|    ] | ||||
| @ -61,14 +40,109 @@ | ||||
|    "metadata": {}, | ||||
|    "outputs": [], | ||||
|    "source": [ | ||||
|     "def wheel_of_fortune_selection(items: list, item_scores:list):\n", | ||||
|     "    ordering = np.argsort(item_scores)\n", | ||||
|     "    ordering = ordering + 1\n", | ||||
|     "def wheel_of_fortune_weights(items:list, item_scores:list):\n", | ||||
|     "    rank = scipy.stats.rankdata(item_scores)\n", | ||||
|     "\n", | ||||
|     "    wheel_weights = wheel_of_fortune(ordering, len(ordering))\n", | ||||
|     "    n = len(items)\n", | ||||
|     "\n", | ||||
|     "    return np.random.choice(items, p=wheel_weights)\n" | ||||
|     "    return wheel_of_fortune(rank, n)" | ||||
|    ] | ||||
|   }, | ||||
|   { | ||||
|    "cell_type": "code", | ||||
|    "execution_count": 4, | ||||
|    "metadata": {}, | ||||
|    "outputs": [], | ||||
|    "source": [ | ||||
|     "def wheel_of_fortune_selection(items: list, item_scores:list, num_choices=1):\n", | ||||
|     "    \n", | ||||
|     "    wheel_weights = wheel_of_fortune_weights(items, item_scores)\n", | ||||
|     "    \n", | ||||
|     "    n = min(len(items), num_choices)\n", | ||||
|     "    \n", | ||||
|     "    choice = np.random.choice(items, size=n, replace=False, p=wheel_weights)\n", | ||||
|     "    \n", | ||||
|     "    if num_choices == 1:\n", | ||||
|     "        return choice[0]\n", | ||||
|     "\n", | ||||
|     "    return choice\n" | ||||
|    ] | ||||
|   }, | ||||
|   { | ||||
|    "cell_type": "code", | ||||
|    "execution_count": 5, | ||||
|    "metadata": {}, | ||||
|    "outputs": [], | ||||
|    "source": [ | ||||
|     "def combined_wheel_of_fortune_selection(items_list:list, item_scores_list:list, num_choices=1):\n", | ||||
|     "    \n", | ||||
|     "    scores = {}\n", | ||||
|     "    \n", | ||||
|     "    for i in range(len(items_list)):\n", | ||||
|     "        items = items_list[i]\n", | ||||
|     "        item_scores = item_scores_list[i]\n", | ||||
|     "        \n", | ||||
|     "        w = wheel_of_fortune_weights(items, item_scores)\n", | ||||
|     "        #print(items, item_scores)\n", | ||||
|     "        #print(w)\n", | ||||
|     "        \n", | ||||
|     "        for j, item in enumerate(items):\n", | ||||
|     "            if item in scores:\n", | ||||
|     "                scores[item] += w[j]\n", | ||||
|     "            else:\n", | ||||
|     "                scores[item] = w[j]\n", | ||||
|     "        \n", | ||||
|     "    combined_items = []\n", | ||||
|     "    combined_scores = []\n", | ||||
|     "    \n", | ||||
|     "    for i,s in scores.items():\n", | ||||
|     "        combined_items.append(i)\n", | ||||
|     "        combined_scores.append(s)\n", | ||||
|     "    \n", | ||||
|     "    combined_scores = np.array(combined_scores)\n", | ||||
|     "    \n", | ||||
|     "    #print(combined_scores)\n", | ||||
|     "    #print(np.sum(combined_scores))\n", | ||||
|     "    \n", | ||||
|     "    combined_scores /= len(items_list)\n", | ||||
|     "    \n", | ||||
|     "    #print(combined_scores)\n", | ||||
|     "    \n", | ||||
|     "    #print(np.sum(combined_scores))\n", | ||||
|     "    \n", | ||||
|     "    n = min(len(combined_items), num_choices)\n", | ||||
|     "    \n", | ||||
|     "    return np.random.choice(combined_items, size=n, replace=False, p=combined_scores)\n", | ||||
|     "        \n", | ||||
|     "        " | ||||
|    ] | ||||
|   } | ||||
|  ] | ||||
| } | ||||
|  ], | ||||
|  "metadata": { | ||||
|   "file_extension": ".py", | ||||
|   "kernelspec": { | ||||
|    "display_name": "Python 3", | ||||
|    "language": "python", | ||||
|    "name": "python3" | ||||
|   }, | ||||
|   "language_info": { | ||||
|    "codemirror_mode": { | ||||
|     "name": "ipython", | ||||
|     "version": 3 | ||||
|    }, | ||||
|    "file_extension": ".py", | ||||
|    "mimetype": "text/x-python", | ||||
|    "name": "python", | ||||
|    "nbconvert_exporter": "python", | ||||
|    "pygments_lexer": "ipython3", | ||||
|    "version": "3.7.5rc1" | ||||
|   }, | ||||
|   "mimetype": "text/x-python", | ||||
|   "name": "python", | ||||
|   "npconvert_exporter": "python", | ||||
|   "pygments_lexer": "ipython3", | ||||
|   "version": 3 | ||||
|  }, | ||||
|  "nbformat": 4, | ||||
|  "nbformat_minor": 4 | ||||
| } | ||||
|  | ||||
| @ -4,6 +4,7 @@ | ||||
| # # Statistical Tools | ||||
|  | ||||
| import numpy as np | ||||
| import scipy.stats | ||||
|  | ||||
|  | ||||
| # * Helper function to calculate the wheel of fortune | ||||
| @ -12,11 +13,67 @@ def wheel_of_fortune(rank_i,n): | ||||
|     return rank_i / (0.5 * n * (n + 1)) | ||||
|  | ||||
|  | ||||
| def wheel_of_fortune_selection(items: list, item_scores:list): | ||||
|     ordering = np.argsort(item_scores) | ||||
|     ordering = ordering + 1 | ||||
| def wheel_of_fortune_weights(items:list, item_scores:list): | ||||
|     rank = scipy.stats.rankdata(item_scores) | ||||
|  | ||||
|     wheel_weights = wheel_of_fortune(ordering, len(ordering)) | ||||
|     n = len(items) | ||||
|  | ||||
|     return np.random.choice(items, p=wheel_weights) | ||||
|     return wheel_of_fortune(rank, n) | ||||
|  | ||||
|  | ||||
| def wheel_of_fortune_selection(items: list, item_scores:list, num_choices=1): | ||||
|      | ||||
|     wheel_weights = wheel_of_fortune_weights(items, item_scores) | ||||
|      | ||||
|     n = min(len(items), num_choices) | ||||
|      | ||||
|     choice = np.random.choice(items, size=n, replace=False, p=wheel_weights) | ||||
|      | ||||
|     if num_choices == 1: | ||||
|         return choice[0] | ||||
|  | ||||
|     return choice | ||||
|  | ||||
|  | ||||
| def combined_wheel_of_fortune_selection(items_list:list, item_scores_list:list, num_choices=1): | ||||
|      | ||||
|     scores = {} | ||||
|      | ||||
|     for i in range(len(items_list)): | ||||
|         items = items_list[i] | ||||
|         item_scores = item_scores_list[i] | ||||
|          | ||||
|         w = wheel_of_fortune_weights(items, item_scores) | ||||
|         #print(items, item_scores) | ||||
|         #print(w) | ||||
|          | ||||
|         for j, item in enumerate(items): | ||||
|             if item in scores: | ||||
|                 scores[item] += w[j] | ||||
|             else: | ||||
|                 scores[item] = w[j] | ||||
|          | ||||
|     combined_items = [] | ||||
|     combined_scores = [] | ||||
|      | ||||
|     for i,s in scores.items(): | ||||
|         combined_items.append(i) | ||||
|         combined_scores.append(s) | ||||
|      | ||||
|     combined_scores = np.array(combined_scores) | ||||
|      | ||||
|     #print(combined_scores) | ||||
|     #print(np.sum(combined_scores)) | ||||
|      | ||||
|     combined_scores /= len(items_list) | ||||
|      | ||||
|     #print(combined_scores) | ||||
|      | ||||
|     #print(np.sum(combined_scores)) | ||||
|      | ||||
|     n = min(len(combined_items), num_choices) | ||||
|      | ||||
|     return np.random.choice(combined_items, size=n, replace=False, p=combined_scores) | ||||
|          | ||||
|          | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user