{ "cells": [ { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "import numpy as np\n", "import os.path\n", "import scipy.linalg" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Genetic Algorithm \n", "\n", "In this notebook, we write all the code we need to run a genetic algorithm. We build it from the bottom up.\n", "\n", "### Support Code\n", "\n", "We begin by implementing a class called GASsetting that will store all the settings for the algorithm. Fields include\n", "\n", "" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "class GASettings:\n", " def __init__( self, numParents = 10, numChildren = 50 ):\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Write select_pool\n", "\n", "We will build the genetic algorith bottom-up. First, write the select_pool function, with the members of the previous generation and their costs as input (along with the settings). \n", "\n", "Select pool should return a tuple (P, Pcost)\n", "\n", "where P is the numParents x numParameter ndarray of individuals in the breeding pool and Pcost is the array of their costs.\n", "\n", "If settings.selection is 'uniform', then each member of P is chosen randomly from G (where each invidivual in G is equally likely to be chosen).\n", "\n", "If settings.selection is 'truncation', then each member of P is chosen randomly from settings.numParents lowest cost individuals in G (where each individual in that set is equally likely to be chosen). We can assume that G is sorted by cost, so this means we choose from the first settings.numParents individuals." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def select_pool( G, Gcost, settings ):\n", " \"\"\" Select a breding pool from the previous generation.\n", " G is numChildren x numParameters\n", " Gcost is numChildren long and is sorted in ascending order.\n", " Returns (P,Pcost)\n", " where \n", " P is numParents x numParameters\n", " Pcost is numParents long.\n", " \"\"\"\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Test the selection operators\n", "\n", "Create individuals with costs 0 to 500, then create breeding pools using each of the selection operators. Plot the costs as histograms. The histogram from the uniform operator should have a uniform distribution of values from 0 to 500. The historgram from the truncation operator should have a uniform distribution of values from 0 to 50." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Frequency')" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Test the selection operators\n", "# Make fake parameters, using the index as the values (so we can differentiate them)\n", "lam = 10000 # number of individuals in generation\n", "mu = 1000 # number of individuals in breeding pool\n", "NP = 5 # num of parameters per individual\n", "G = np.zeros( (lam,NP) )\n", "for i in range(lam):\n", " G[i,:] = i\n", "Gcost = np.linspace(0.1,500,lam)\n", "settings = GASettings(numParents=mu, numChildren=lam)\n", "\n", "settings.selection = 'uniform'\n", "(P, Pcost) = select_pool(G, Gcost, settings)\n", "plt.figure( figsize=(8,4) )\n", "plt.hist( Pcost );\n", "plt.title( \"Breeding Pool Chosen Uniformly\")\n", "plt.xlabel( 'Cost')\n", "plt.ylabel('Frequency')\n", "\n", "settings.selection = 'truncation'\n", "(P, Pcost) = select_pool(G, Gcost, settings)\n", "plt.figure( figsize=(8,4) )\n", "plt.hist( Pcost );\n", "plt.title( \"Breeding Pool Chosen with Truncation Selection\")\n", "plt.xlabel( 'Cost')\n", "plt.ylabel('Frequency')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Write generateIndividual\n", "\n", "Write the code that will generate a random individual in parameter space. The individual should have entries between the lower bound and upper bound and should have finite cost. We make 1000 attempts to find a parameter set that leads to a finite code before giving up and just returning np.inf." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "def generateIndividual(cost_fcn, lb,ub):\n", " '''\n", " Generate a viable individual (i.e one whos cost function is finite)\n", " and return it and its cost.\n", " If 1000 tries fails to yield an individual, then the paramets and an infinite cost\n", " are returned.\n", " Each individual is generated by randomly chosing each entry params[i] \n", " so that lb[i] <= params[i] <= ub[i]\n", " Input:\n", " cost_fcn: handle to the cost function (which should take a candidate as input)\n", " lb: lower bounds for parameters (array of length NP)\n", " ub: upper bounds for parameters (array of length NP)\n", " Returns:\n", " (params, cost)\n", " where params is the same shape as the lower bounds\n", " and cost is the cost for that set of parameters\n", " '''\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Test generateIndividual\n", "\n", "Run generateIndividual with the pattern cost function to generate 1000 individuals, storing each one as a row in a 1000x7 ndarray. Use [0,4,1,1,2,2,0] as the lower bounds and [5,6,3,2,4,4,2] as the upper bounds.\n", "\n", "Test it by plotting the result as 5 columns of values (i.e. x-axis is 1:7 and the y-axis is the parameter value). This isn't much of a test, but it makes sure that the points are in the expected ranges. We wil also plot the costs (individual's index on x-axis, cost on y-axis) just to see that it was computed within a range that makes sense. It should look like a busy rectangle full or asterisks." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "def pattern_cost_function( params ):\n", " return scipy.linalg.norm( params-np.array([1,5,2.5,2,4,3,0]) )\n", "\n", "lam = 1000 # number of individuals in generation\n", "mu = 100 # number of individuals in breeding pool\n", "NP = 7 # num of parameters per individual\n", "settings = GASettings(numParents=mu, numChildren=lam)\n", "\n", "lb = np.array([0,4,1,1,2,2,0])\n", "ub = np.array([5,6,3,2,4,4,2])\n", "G = np.zeros( (lam,NP) )\n", "Gcost = np.zeros( (lam,))\n", "for i in range(lam):\n", " (G[i,:], Gcost[i]) = generateIndividual(pattern_cost_function,lb,ub)\n", " \n", "plt.subplot( 2, 1, 1 )\n", "plt.plot( np.arange(1,NP+1), G.T, '*');\n", "plt.subplot( 2, 1, 2 )\n", "plt.plot( np.arange(1,lam+1), Gcost, '*');" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Write generateChild\n", "\n", "Write a function that take the cost function, breeding pool, lower bounds, upper bounds, and settings as input. It should generate children from the breeding pool using cross-over and mutation. \n", "\n", "
    \n", "
  • Initialize the return values (params is an np.array the same shape as lb and cost is np.inf).\n", "
  • For each attempt at making a child with finite code (allow 1000 attempts)\n", "
      \n", "
    • Choose a first parent from the breeding pool (choose an index between 0 and the number of rows in the breeding pool P).\n", "
    • Choose a second parent from the breeding pool (choose an index between 0 and the number of rows in the breeding pool P). \n", "
    • Loop through the elements of the new child, randomly choosing one of the parents to inherit from.\n", "
    • Mutate each of the values in the child by adding a number that is chosen from a normal distribution centered at zero, with a standard deviation of settings.mutation*the_value_in_the_child\n", "
    • Make sure all of the values in the child are in bounds (>= lb and <= ub).\n", "
    • Compute the cost of the child.\n", "
    • If the cost is finite, return the child and its cost\n", "
    \n", "
  • If we tried 1000 times to create a child and never found one with a finite cost, just give up and return (np.zeros((lb.size)), np.inf)\n", "
" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def generateChild(cost_fcn, P, lb, ub, settings):\n", " \"\"\"\n", " Generate a viable child (i.e one whos cost function is finite)\n", " and return it and its cost function.\n", " If 1000 tries fails to yield a parent, then an infinite cost\n", " is returned.\n", " Input Parameters:\n", " cost_fcn: handle to the cost function (which should take a candidate as input)\n", " P: parents (lam x NP ndarray of parameter values)\n", " lb: lower bounds for parameters (array of length NP)\n", " ub: upper bounds for parameters (array of length NP)\n", " settings: a GASettings object\n", " Returns:\n", " (params, cost)\n", " where params is the same shape as the lower bounds\n", " and cost is the cost for that set of parameters\n", " \"\"\"\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Test generateChild\n", "\n", "We will test it with the pattern_cost_function, so there are 7 parameters in each individual. Randomly create 2 members of the breeding pool and make their entries values between 0 and 4. Then generate a child. Print out the breeding pool and the child. Read the entries to make sure it looks like each one came from one parent and that it is slightly mutated." ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Breeding Pool\n", "[[0. 0. 0. 0. 0. 0. 0.]\n", " [1. 1. 1. 1. 1. 1. 1.]]\n", "Child\n", "[0. 1.01173377 0. 1.01692256 1.04487793 1.00201595\n", " 1.05352062]\n" ] } ], "source": [ "lam = 50 # number of individuals in generation\n", "mu = 2 # number of individuals in breeding pool\n", "NP = 7 # num of parameters per individual\n", "P = np.zeros( (mu,NP) )\n", "for i in range(mu):\n", " P[i,:] = i % 5\n", "settings = GASettings(numParents=mu, numChildren=lam)\n", "\n", "lb = np.zeros((7,))\n", "ub = 5 + np.zeros((7,))\n", "(params,cost) = generateChild( pattern_cost_function, P, lb, ub, settings )\n", "\n", "print( \"Breeding Pool\")\n", "print( P )\n", "print( \"Child\")\n", "print(params)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Write the genetic algorithm\n", "\n", "
    \n", "
  • Create an initial population of settings.numChildren individuals in a (settings.numChildren x NP) ndarray and generate their costs (putting them into an array called Gcost). (Call generateIndividual in a loop.)\n", "
  • Sort the individuals by cost (in preparation for selection). This means use argsort to get the indices and use the same set of indices to reorder G and Gcost.\n", "
  • Create lists (all_params and all_costs) to store the G and Gcost arrays for each generation and put G and Gcost from this initial generation into the lists.\n", "
  • For each generation (range(settings.numGenerations))\n", "
      \n", "
    • Create an (settings.numChildren x NP) ndarray to store the individuals from the current generation and a (NP,) array to store their costs.\n", "
    • Take the settings.eliteCount best children from the previous generation and put them into this generation.\n", "
    • Select the breeding pool P of settings.numParents individuals from the previous generation.\n", "
    • For i in range(settings.eliteCount,settings.numChildren)\n", "
        \n", "
      • Call generateChild and put the results into the G and Gcost arrays for the current generation.\n", "
      \n", "
    • Sort the individuals in G by cost (in preparation for selection)\n", "
    • Append G and Gcost ndarrays to all_params and all_costs, respectively.\n", "
    \n", "
  • Assign to params the first (lowest cost) individual of the last generation.\n", "
  • Assign to cost the first (lowest cost) cost of the last generation.\n", "
  • Return (params, cost, all_params, all_costs)\n", "
\n", "\n" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "def GA(cost_fcn, lb, ub, settings):\n", " \"\"\" Run the algorithm described in the notes to find a low-cost\n", " population of parameter sets.\n", " Input:\n", " cost_fcn: handle to cost function (should take a paramer set as input)\n", " lb: lower bounds for parameters (numpy array of length NP)\n", " ub: lower bounds for parameters (numpy array of length NP)\n", " settings: GASettings object\n", " Returns\n", " (params, cost, all_params, all_costs)\n", " where \n", " params is a 1xNP vector with the best parameter set found\n", " cost is a scalar with the cost of the best parameter set\n", " all_params is a list with a (settings.numChildren x NP) ndarray of parameters for each generation\n", " all_costs is a list with an NP-length array of costs for each generation\n", " \"\"\"\n", " pass" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Test the GA\n", "\n", "Test it with the pattern cost function. Plot the costs for all individuals in all the generations." ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best of generation 1 has cost 2.367095806882881\n", "Best of generation 2 has cost 1.7856015557357314\n", "Best of generation 3 has cost 1.7856015557357314\n", "Best of generation 4 has cost 1.4204049340723046\n", "Best of generation 5 has cost 1.0467206560778475\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "PN = 7\n", "lb = np.zeros( (PN,) );\n", "ub = 5 + np.zeros( (PN,) );\n", "cost_fcn = pattern_cost_function;\n", "settings = GASettings(numParents=10, numChildren=50)\n", "settings.numGenerations = 5;\n", "settings.eliteCount = 1;\n", "settings.selection = 'truncation';\n", "\n", "(params, cost, all_params, all_costs) = GA(pattern_cost_function, lb, ub, settings);\n", "\n", "plt.figure( figsize=(8,4) )\n", "legs = []\n", "for i in range(len(all_costs)):\n", " plt.plot( np.arange(all_costs[i].size), all_costs[i], '*' )\n", " legs.append( \"Generation\" + str(i) )\n", "plt.legend( legs );" ] } ], "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.8.5" } }, "nbformat": 4, "nbformat_minor": 4 }