{ "cells": [ { "cell_type": "code", "execution_count": 24, "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 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", " self.numParents = numParents;\n", " self.numChildren = numChildren;\n", " self.numGenerations = 5;\n", " self.selection = 'truncation'; \n", " self.crossover = 'uniform';\n", " self.mutation = 0.05; # std of normal distribution computed as mutation*value\n", " self.eliteCount = 1;" ] }, { "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 matrix 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 and it is OK if the same individual is chosen more than once). 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": 1, "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", " if Gcost.size != settings.numChildren:\n", " print(\"problem\")\n", " return\n", " P = np.zeros( (settings.numParents,G.shape[1]) )\n", " Pcost = np.zeros( (settings.numParents,) )\n", " Pidxs = []\n", " if settings.selection == 'truncation':\n", " for i in range(settings.numParents):\n", " idx = np.random.choice(settings.numParents)\n", " P[i,:] = G[idx,:]\n", " Pcost[i] = Gcost[idx]\n", "\n", " elif settings.selection == 'uniform':\n", " for i in range(settings.numParents):\n", " idx = np.random.choice(G.shape[0])\n", " P[i,:] = G[idx,:]\n", " Pcost[i] = Gcost[idx]\n", "\n", " else:\n", " print( \"Unknown selection operator: \", settings.selection )\n", " return (P, Pcost)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Test the selection operators" ] }, { "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": 7, "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", " '''\n", " params = np.zeros(lb.shape);\n", " cost = np.inf;\n", " for i in range( 1000 ):\n", " params = lb + np.multiply( np.random.random(lb.size), ub-lb);\n", " cost = cost_fcn(params);\n", " if np.isfinite(cost):\n", " return (params, cost);\n", " return (params, np.inf)" ] }, { "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 matrix. 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": 23, "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", "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, '*');" ] } ], "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 }