{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"Άσκηση 10 Βελτιστοποίηση με ΓΑ - Solution.ipynb","provenance":[]},"kernelspec":{"name":"python3","display_name":"Python 3"}},"cells":[{"cell_type":"code","metadata":{"id":"Zn2mZTFXRyeI"},"source":["import matplotlib.pyplot as plt\n","%matplotlib inline"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"pChJPgVWUGw_"},"source":["!ls"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"0dZp7yCyRyeW"},"source":["# Εισάγουμε τις βοηθητικές συναρτήσεις απο το auxiliary.py\n","from auxiliary import *"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"1tiV25HhRyee"},"source":["# model function\n","def y(x): return 0.3*sin(x) + sin(1.3*x) + 0.9*sin(4.2*x)\n","\n","# plot model function\n","xcurve = linspace(-2, 4, 101)\n","plt.plot(xcurve, y(xcurve), label='y(x)')\n","Gll('x', 'y')\n","plt.grid(True)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"scrolled":true,"id":"k6G_5UqfRyeq"},"source":["# initialise random numbers generator\n","#seed(1234) # use a fixed seed, so every time we run this code\n"," # we will get the same results\n","\n","# population\n","ninds = 24 # number of individuals: population size\n","xmin, xmax = -2.0, 4.0# limits\n","X = Random(ninds, xmin, xmax) # generate numbers between 0 and 4*pi\n","\n","# just for the sake of showing nice numbers in this notebook:\n","#X = array(X, dtype=int) # truncate values\n","#X = array(X, dtype=float) # revert to float\n","print('Population:\\n', X)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"pL8Oe59vRye0"},"source":["plt.plot(xcurve, y(xcurve), label='y(x)')\n","plt.plot(X, y(X), 'ro', label='population')\n","Gll('x', 'y', 'upper left')\n","plt.grid(True)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"l7vce-vfRye9"},"source":["ngenes = 20\n","# compute chromosome from x\n","def cFcn(x): return SimpleChromo(x, ngenes)\n","\n","# compute x from chromosome\n","def xFcn(c): return sum(c)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"4aMmX8WIRyfE"},"source":["C = array([cFcn(x) for x in X])\n","print(C)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"qzgXmVi_RyfM"},"source":["def objFcn(c):\n"," x = xFcn(c)\n"," if x < xmin or x > xmax: return -100.0*(1.0+abs(x))\n"," return y(x)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"CQIEH8FARyfT"},"source":["Y = array([objFcn(c) for c in C]) # objective values\n","PrintPop(C, Y, xFcn, showC=True)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"wwp0fVpIUgqs"},"source":["# Ορισμός της καινούριας fitness function\n","def Fitness2(Y):\n"," ymin, ymax = min(Y), max(Y)\n"," if abs(ymax - ymin) < 1e-14: return ones(len(Y))\n"," return (Y - ymin) / (ymax - ymin)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"r_LF-150RyfY"},"source":["# compute fitness from objective values\n","F = Fitness2(Y) \n","\n","# sort in decreasing order of fitness\n","C, Y, F = SortPop(C, Y, F)\n","PrintPop(C, Y, xFcn, F)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"Et1u13qaRyfd"},"source":["# probabilities\n","P = F / sum(F)\n","\n","# cumulated probabilities\n","M = cumsum(P)\n","PrintPop(C, Y, xFcn, F, P, M)"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"RwU-AxGvRyfj"},"source":["def Evolve(C, xFcn, objFcn, ngen=10, elite=True, pc=0.8, pm=0.01, verb=False, showC=False):\n","\n"," # objective values\n"," Y = array([objFcn(c) for c in C]) # objective values\n"," ninds = len(C)\n"," nbases = len(C[0])\n","\n"," # fitness and probabilities (sorted)\n"," F = Fitness2(Y)\n"," C, Y, F = SortPop(C, Y, F)\n"," P = F / sum(F)\n"," M = cumsum(P)\n","\n"," # results\n"," OV = zeros(ngen+1)\n"," OV[0] = Y[0] # best first objective value\n","\n"," # evolution\n"," for gen in range(ngen):\n","\n"," # best individual\n"," bestC = C[0].copy()\n"," bestY = Y[0]\n","\n"," # print generation\n"," if gen==0 or verb:\n"," print\n"," PrintPop(C, Y, xFcn, F, showC=showC)\n","\n"," # selection\n"," S = RouletteSelect(M, ninds)\n"," idxA, idxB = FilterPairs(S)\n"," \n"," # reproduction\n"," Cnew = [] # new chromosomes\n"," for k in range(ninds//2):\n","\n"," # parents\n"," A, B = C[idxA[k]], C[idxB[k]]\n","\n"," # crossover\n"," if FlipCoin(pc):\n"," pos = randint(1, nbases-1)\n"," a = hstack([A[:pos], B[pos:]])\n"," b = hstack([B[:pos], A[pos:]])\n"," else:\n"," a, b = A.copy(), B.copy()\n","\n"," # mutation\n"," if FlipCoin(pm):\n"," pos = randint(0, nbases)\n"," bmax = max(a)\n"," if FlipCoin(0.5): a[pos] += bmax * 1.1\n"," else: a[pos] -= bmax * 1.1\n","\n"," # new individuals\n"," Cnew.append(a)\n"," Cnew.append(b)\n","\n"," # new population\n"," C = array(Cnew)\n"," Y = array([objFcn(c) for c in C]) # objective values\n"," F = Fitness2(Y)\n","\n"," # elitism\n"," if elite:\n"," I = F.argsort()[::-1] # the [::-1] is a trick to reverse the sorting order\n"," best = I[0]\n"," worst = I[len(I)-1]\n"," if bestY > Y[worst]:\n"," C[worst] = bestC\n"," Y[worst] = bestY\n"," F = Fitness2(Y)\n","\n"," # probabilities (sorted)\n"," C, Y, F = SortPop(C, Y, F)\n"," P = F / sum(F)\n"," M = cumsum(P)\n","\n"," # objective values\n"," OV[gen+1] = Y[0] # best current objective value\n","\n"," # results\n"," return C, Y, OV"],"execution_count":null,"outputs":[]},{"cell_type":"code","metadata":{"id":"3gI4NjNPRyfo"},"source":["# input data\n","ngen = 10 # number of generations\n","pc = 0.8 # probability of crossover\n","pm = 0.01 # probability of mutation\n","elite = 1 # use elitism\n","verb = False # verbose\n","\n","# run GA\n","C, Y, OV = Evolve(C, xFcn, objFcn, ngen, elite, verb=verb, showC=False)\n","X = [xFcn(c) for c in C]\n","\n","# print and plot\n","plt.subplot(2, 1, 1)\n","plt.plot(xcurve, y(xcurve), label='y(x)')\n","print('\\nFinal population:')\n","PrintPop(C, Y, xFcn)\n","sol = '\\nSolution: x=%g y=%g' % (X[0], Y[0])\n","print(sol)\n","\n","# plot results\n","plt.subplot(2, 1, 1)\n","plt.plot(X, Y, 'k*', label='final population')\n","Gll('x', 'y', 'upper left')\n","plt.grid(True)\n","\n","# plot convergence graph\n","plt.subplot(2, 1, 2)\n","G = range(ngen+1)\n","plt.plot(G, OV, 'b.-', label=sol)\n","Gll('generation', 'y(x)')\n","plt.grid(True)\n","plt.show()"],"execution_count":null,"outputs":[]}]}