Files
Mastering-Python-2e-code_2/CH_16_machine_learning/T_06_pygad.ipynb
T
2022-05-05 18:25:55 +02:00

150 lines
28 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"pycharm": {
"name": "#%%\n"
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Generation 100 2x1, 1x5, 1x10, 2x25, price: $495\n",
"Generation 200 2x1, 1x5, 1x10, 2x25, price: $495\n",
"Generation 300 2x1, 1x5, 1x10, 2x25, price: $495\n",
"Generation 400 2x1, 1x5, 1x10, 2x25, price: $495\n",
"Generation 500 2x1, 1x5, 1x10, 2x25, price: $495\n",
"Generation 600 2x1, 1x5, 1x10, 2x25, price: $495\n",
"Generation 700 2x1, 1x5, 1x10, 2x25, price: $495\n",
"Generation 800 2x1, 1x5, 1x10, 2x25, price: $495\n",
"Generation 900 2x1, 1x5, 1x10, 2x25, price: $495\n",
"Generation 1000 2x1, 1x5, 1x10, 2x25, price: $495\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import numpy as np\n",
"import pygad\n",
"\n",
"# Combination of number of boards with the prices per board\n",
"stack_prices = np.array(\n",
" [\n",
" [1, 10], # $10 per board\n",
" [5, 5 * 9], # $9 per board\n",
" [10, 10 * 8], # $8 per board\n",
" [25, 25 * 7], # $7 per board\n",
" ]\n",
")\n",
"\n",
"# The minimum number of boards to buy\n",
"desired_boards = 67\n",
"\n",
"\n",
"def fitness_function(solution: np.ndarray, solution_index):\n",
" # We can't have a negative number of boards\n",
" if (solution < 0).any():\n",
" return float('-inf')\n",
"\n",
" # Make sure we have the minimum number of boards required\n",
" total_area = stack_prices[:, 0] * solution\n",
" if total_area.sum() < desired_boards:\n",
" return float('-inf')\n",
"\n",
" # Calculate the price of the solution\n",
" price = stack_prices[:, 1] * solution\n",
" # The fitness function maximizes so invert the price\n",
" return - price.sum()\n",
"\n",
"\n",
"def print_status(instance):\n",
" # Only print the status every 100 iterations\n",
" if instance.generations_completed % 100:\n",
" return\n",
"\n",
" total = 0\n",
" solution = instance.best_solution()[0]\n",
" # Print the generation, bulk size and the total price\n",
" print(f'Generation {instance.generations_completed}', end=' ')\n",
" for mp, (boards, price) in zip(solution, stack_prices):\n",
" print(f'{mp:2d}x{boards},', end='')\n",
" total += mp * price\n",
" print(f' price: ${total}')\n",
"\n",
"\n",
"ga_instance = pygad.GA(\n",
" num_generations=1000,\n",
" num_parents_mating=10,\n",
" # Every generation will have 100 solutions\n",
" sol_per_pop=100,\n",
" # We use 1 gene per stack size\n",
" num_genes=stack_prices.shape[0],\n",
" fitness_func=fitness_function,\n",
" on_generation=print_status,\n",
" # We can't buy half a board, so use integers\n",
" gene_type=int,\n",
" # Limit the solution space to our maximum number of boards\n",
" gene_space=np.arange(desired_boards),\n",
" # Limit how large the change in a mutation can be\n",
" random_mutation_min_val=-2,\n",
" random_mutation_max_val=2,\n",
" # Disable crossover since it does not make sense in this case\n",
" crossover_probability=0,\n",
" # Set the number of genes that are allowed to mutate at once\n",
" mutation_num_genes=stack_prices.shape[0] // 2,\n",
")\n",
"\n",
"ga_instance.run()\n",
"ga_instance.plot_fitness()\n"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.9.12"
}
},
"nbformat": 4,
"nbformat_minor": 1
}