From de023f6bb2d2d6c4cc438fc0dea3b7400c7a7320 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Thu, 24 Feb 2022 23:08:09 +0100 Subject: [PATCH 1/3] Isolate cal_pop_fitness method --- __pycache__/pygad.cpython-39.pyc | Bin 0 -> 98543 bytes pygad.egg-info/PKG-INFO | 346 ++++++++++++++++++++++++++++ pygad.egg-info/SOURCES.txt | 7 + pygad.egg-info/dependency_links.txt | 1 + pygad.egg-info/requires.txt | 2 + pygad.egg-info/top_level.txt | 1 + pygad.py | 33 ++- 7 files changed, 380 insertions(+), 10 deletions(-) create mode 100644 __pycache__/pygad.cpython-39.pyc create mode 100644 pygad.egg-info/PKG-INFO create mode 100644 pygad.egg-info/SOURCES.txt create mode 100644 pygad.egg-info/dependency_links.txt create mode 100644 pygad.egg-info/requires.txt create mode 100644 pygad.egg-info/top_level.txt diff --git a/__pycache__/pygad.cpython-39.pyc b/__pycache__/pygad.cpython-39.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b42526108d4072a731b184e7231570cda37f11d5 GIT binary patch literal 98543 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 SZ=KpE<{Qff=kMmPKlI 0): + if (last_generation_parents is not None) and len(numpy.where(numpy.all(last_generation_parents == sol, axis=1))[0] > 0): # Index of the parent in the parents array (self.last_generation_parents). This is not its index within the population. - parent_idx = numpy.where(numpy.all(self.last_generation_parents == sol, axis=1))[0][0] + parent_idx = numpy.where(numpy.all(last_generation_parents == sol, axis=1))[0][0] # Index of the parent in the population. - parent_idx = self.last_generation_parents_indices[parent_idx] + parent_idx = last_generation_parents_indices[parent_idx] # Use the parent's index to return its pre-calculated fitness value. - fitness = self.previous_generation_fitness[parent_idx] + fitness = previous_generation_fitness[parent_idx] else: - fitness = self.fitness_func(sol, sol_idx) + fitness = fitness_func(sol, sol_idx) if type(fitness) in GA.supported_int_float_types: pass else: From 441c841688ff4090feed6f70877807e63449d721 Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Thu, 24 Feb 2022 23:25:27 +0100 Subject: [PATCH 2/3] Isolate best_solution method --- __pycache__/pygad.cpython-39.pyc | Bin 98543 -> 98663 bytes pygad.py | 7 +++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/__pycache__/pygad.cpython-39.pyc b/__pycache__/pygad.cpython-39.pyc index b42526108d4072a731b184e7231570cda37f11d5..3b57549b613f9cbced9f395023365ee58201979e 100644 GIT binary patch delta 3671 zcmaJ@eNa@_6@TZweao`2d<9s*j8_V2l#X2E2=cc7eMK8hvDA z)J{6p4w={XjrxbXosK%%=``6)UY*!zMVnTuEjFQM+d5t=YUU}8(Xm&X468^od=C$m5-LW0g-q_U#K|gz%eP;_aPGbR9&lV!} z1nXvt*kYunvmW*gYd~rSTgR5LXOXIA>)BHF98xvxCAN$$M`|W(WY2Gr8fUQ$tc9&a z&Xa5-W6X=xQ%qy4SsPNbSug8gok-QPF2+&+8w@NBlKbVz9{Kr$a)GKJF|&2&p{<$c zdR0wo&tgh9@HaInl%>COXiV@7^3;$6(G~`f0*@e-y&3rDsF6clT)CPQR+?l@@;Gtj z`3jIXB4g@yIUz$yK1JvQUWFd=H3>P+unhFS03{MizK8S}T&^_`#BC#~Fe@>)%K511 zDfCqaibBQ2$CVb7(XPFOS@WeliS%0KFbLfyk#xak3i=BSS{k>b5RbNE+F?cLQQD(q zESR*N>MBH0Sv>EL&_$WZyD*-2c|31ClXlefRQTqJkmVRs=6E`xu`x-Qd{y|;?r}td z6(}1ge9L?`O2!G_6*1qzb{Dg*kdK|5$QR!VjLMjzy+jRZNBu`Q337qNaum+D& zl!oQu5zk<$h}EcD6F-DII5;(8aBMU{{Uv|X8!=Z ztAGDkMT#BLlvLS@Xpg*eY?1==^`ZCvl>Q+;T>Jn*5aFrFiQny%#}CqeKfzxJgpSw> z#VGPtsL21TzU`!Y+TU=yglCf?5V#QP`8gs#A`pg&Fk6t<5c&9|SBCTY!qatC7myK6 z<;_0kY4fqRm0mx;IAWKG`YQ6;B8N_!F}pl{+kidi5-Bbqm_pD`a7sTgQ0x+3(>t5F z*B9_V==idJd7uV@k&-j(70hAB2f-B5=2r+V>ScrDU`J%ZV6OuI(0~7-tNLT&w-6K) z=mg&)5aB){s)Qh!pp0NS!FjzfIhI)jzE%7z?id2ITB$nQAY^AB9QQoa4=3gAy54R8B-!} z-ub(N9{Yx$PDz*!>sN*+sGp-kU&Q&`sE*4B=@X<)Tn77UOslR6?40BMF@HJxzxlobyzayOZJ$ z$>2UK6g8%-^7_1f4_@6>UT!64qmFDn8Wo%Ec8JO@5%xV~G^Pi<-|fU1?d)FL9BAwC z@jn|cI-mijnr}H^zLNhR3N^~p2IMU^voj&0+U_FlF5x!gkGb%uRdhX9FSxbN@Hru= zNW@9PWTKfP7sS)r7QjsX{7XZ3LTSM;Mfg9BNk;Q7bI1w%E$~1XW0M=^l#GPn4k}vo zI*q8fUu=y_wIk!aSyu>Ctg(y>G2;zoV8j|g8OF_x(sC#(h_@BFM<~0m4ND3d6qy^# z;VR{XjtY&fZkYYhWYWobVoqFYDl&d(S}I|&4NjR$r$V*Gl|f3lB<@CVtK3Np@kHbs z`=>(zDYIv!=6y@6lIYv$m zG^F0|(&(rGm(f=PQ=!r9uYqP2vW$vam&f1n_GMSFfVUn!+T8 zAKtC_=^auqQ41!ipiI>)nyM+S3ME@F#>#DpwOss+oI=-P4DLNpB1=k}pCJ$l@&O`8 zoqH)B+Z;;WhC)ep$=Q^ACMNGOyO+XgfCc8Zb~(__o;5UeA3iGUt3Zlh+>1H|cF z;B>J$-9}EgiXS8ajXp1-Ee$KDS>e=gQ5P=-!>2(F3>*72SPR8QPA}9cSvI@*TrZrF T;b%tWD=;5U8~hb)`i%bq4Z77l delta 3611 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 diff --git a/pygad.py b/pygad.py index def7b13c..6ed1d6eb 100644 --- a/pygad.py +++ b/pygad.py @@ -3118,7 +3118,6 @@ def unique_gene_by_space(self, solution, gene_idx, gene_type, build_initial_pop= return value_from_space def best_solution(self, pop_fitness=None): - """ Returns information about the best solution found by the genetic algorithm. Accepts the following parameters: @@ -3133,10 +3132,14 @@ def best_solution(self, pop_fitness=None): # At first, the fitness is calculated for each solution in the final generation. if pop_fitness is None: pop_fitness = self.cal_pop_fitness() + + return self._best_solution(pop_fitness, self.population) + + def _best_solution(self, pop_fitness, population): # Then return the index of that solution corresponding to the best fitness. best_match_idx = numpy.where(pop_fitness == numpy.max(pop_fitness))[0][0] - best_solution = self.population[best_match_idx, :].copy() + best_solution = population[best_match_idx, :].copy() best_solution_fitness = pop_fitness[best_match_idx] return best_solution, best_solution_fitness, best_match_idx From 228cf41989101f3d71bb7ab044016b75a2a20c2a Mon Sep 17 00:00:00 2001 From: Jusong Yu Date: Mon, 28 Feb 2022 09:53:33 +0100 Subject: [PATCH 3/3] seprate plot-fitness --- __pycache__/pygad.cpython-39.pyc | Bin 98663 -> 98934 bytes pygad.py | 49 +++++++++++++++++++++++++++---- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/__pycache__/pygad.cpython-39.pyc b/__pycache__/pygad.cpython-39.pyc index 3b57549b613f9cbced9f395023365ee58201979e..20f7e0c9ccbef0463c616a35c7d2d60cba6bb947 100644 GIT binary patch delta 9355 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 Iu}$3Z|3cCRo&W#< delta 8990 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 diff --git a/pygad.py b/pygad.py index 6ed1d6eb..19b0abbe 100644 --- a/pygad.py +++ b/pygad.py @@ -3165,7 +3165,6 @@ def plot_result(self, plot_type=plot_type, color=color, save_dir=save_dir) - def plot_fitness(self, title="PyGAD - Generation vs. Fitness", xlabel="Generation", @@ -3191,20 +3190,58 @@ def plot_fitness(self, Returns the figure. """ + return self._plot_fitness(self.generations_completed, + self.best_solutions_fitness, + title="PyGAD - Generation vs. Fitness", + xlabel="Generation", + ylabel="Fitness", + linewidth=3, + font_size=14, + plot_type="plot", + color="#3870FF", + save_dir=None) + + @staticmethod + def _plot_fitness(generations_completed, + best_solutions_fitness, + title="PyGAD - Generation vs. Fitness", + xlabel="Generation", + ylabel="Fitness", + linewidth=3, + font_size=14, + plot_type="plot", + color="#3870FF", + save_dir=None): - if self.generations_completed < 1: - raise RuntimeError("The plot_fitness() (i.e. plot_result()) method can only be called after completing at least 1 generation but ({generations_completed}) is completed.".format(generations_completed=self.generations_completed)) + """ + Creates, shows, and returns a figure that summarizes how the fitness value evolved by generation. Can only be called after completing at least 1 generation. If no generation is completed, an exception is raised. + + Accepts the following: + title: Figure title. + xlabel: Label on the X-axis. + ylabel: Label on the Y-axis. + linewidth: Line width of the plot. Defaults to 3. + font_size: Font size for the labels and title. Defaults to 14. + plot_type: Type of the plot which can be either "plot" (default), "scatter", or "bar". + color: Color of the plot which defaults to "#3870FF". + save_dir: Directory to save the figure. + + Returns the figure. + """ + + if generations_completed < 1: + raise RuntimeError("The plot_fitness() (i.e. plot_result()) method can only be called after completing at least 1 generation but ({generations_completed}) is completed.".format(generations_completed=generations_completed)) # if self.run_completed == False: # if not self.suppress_warnings: warnings.warn("Warning calling the plot_result() method: \nGA is not executed yet and there are no results to display. Please call the run() method before calling the plot_result() method.\n") fig = matplotlib.pyplot.figure() if plot_type == "plot": - matplotlib.pyplot.plot(self.best_solutions_fitness, linewidth=linewidth, color=color) + matplotlib.pyplot.plot(best_solutions_fitness, linewidth=linewidth, color=color) elif plot_type == "scatter": - matplotlib.pyplot.scatter(range(self.generations_completed + 1), self.best_solutions_fitness, linewidth=linewidth, color=color) + matplotlib.pyplot.scatter(range(generations_completed + 1), best_solutions_fitness, linewidth=linewidth, color=color) elif plot_type == "bar": - matplotlib.pyplot.bar(range(self.generations_completed + 1), self.best_solutions_fitness, linewidth=linewidth, color=color) + matplotlib.pyplot.bar(range(generations_completed + 1), best_solutions_fitness, linewidth=linewidth, color=color) matplotlib.pyplot.title(title, fontsize=font_size) matplotlib.pyplot.xlabel(xlabel, fontsize=font_size) matplotlib.pyplot.ylabel(ylabel, fontsize=font_size)