From d82cfad111da87d362a8cefee1f8a7d93d69f398 Mon Sep 17 00:00:00 2001 From: Philipp Zander <p.raubfisch@gmx.de> Date: Tue, 3 Dec 2019 15:14:31 -0300 Subject: [PATCH] pretty --- app.py | 16 +++++++++++++ src/__pycache__/population.cpython-37.pyc | Bin 5938 -> 6484 bytes src/__pycache__/world.cpython-37.pyc | Bin 2121 -> 2149 bytes src/control.py | 1 + src/population.py | 26 ++++++++++++++++++++-- src/world.py | 11 ++++----- templates/main.html | 18 +++++++++++++-- 7 files changed, 63 insertions(+), 9 deletions(-) diff --git a/app.py b/app.py index b24051d..952de6e 100644 --- a/app.py +++ b/app.py @@ -7,6 +7,7 @@ from src.population import Population app = Flask(__name__) world = None +population = None simulation_frames = {} cone_number = 30 @@ -22,6 +23,7 @@ topological_checked = "checked" @app.route('/', methods=["GET", "POST"]) def main(): global world + global population global iterations global population_size global mutation_step_size @@ -30,14 +32,17 @@ def main(): global situational_checked global normative_checked global topological_checked + global simulation_frames """Entry point; the view for the main page""" if 'new_world' in request.form: cone_number = int(request.form['cone_number']) world = World(cone_number) + simulation_frames = {} if "run_simulation" in request.form: + simulation_frames = {} no_cultural_k = False normative_k = False topological_k = False @@ -81,6 +86,7 @@ def main(): @app.route('/main.png') def main_plot(): global world + print("world: " + str(world)) """The view for rendering the scatter chart""" if not world: world = World(3) @@ -96,5 +102,15 @@ def time_plot(frame_id): return base64.b64encode(simulation_frames[int(frame_id)].getvalue()) +@app.route('/fitness.png') +def fitness_plot(): + print("fitness plot :" + str(population)) + if population: + img = population.plot_fitness() + return send_file(img, mimetype='image/png', cache_timeout=0) + else: + return '', 204 + + if __name__ == '__main__': app.run() diff --git a/src/__pycache__/population.cpython-37.pyc b/src/__pycache__/population.cpython-37.pyc index 7f61b2c8384765b7d859da5788da03b21bb24fb0..54a0d7d7e8f246da6741429b795e76d65e055f1e 100644 GIT binary patch delta 2157 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 KsZ8b(R|5d3Mbz>D delta 1634 zcmca&v`LT8iI<m)fq{Wx#{8$TCJGz*cp3R37#J8*8KM|d7^0X`L?>%9I`WI92&D+O zFh+5why*ieicfB4)Mad&ypeHceF{SjLp(2-<O7rZHOw^(@d7D~H4O2BHOxiFY8Y4; zvIJ9@%o&(KA}mEW&_q~^UZIJw75zaI0hz#<%`}0rNF)VfJ`>pddX@={MFu58%@AiW z)i7iUN;A|jWbwue*RW1tEb=K40n72FAmsSsg=^R*FcxK$h=S$#k>vQ}g-e(hu+%VQ zF{U#v1bITNhGBtt3e!SHMurrIU<OSVzamBk28Nd)B7{j(Vsa33=H&Cto$^u)3=Bo$ zAVLB}NP-A%1_p*(jF~GLij*dovqUm_O}@w?A;HYX2!>2-j4X_N2)vn@HJC95Y=jI* zw=9T&8>Y!xB+tOW5G7bzkdj!E8efoFl$@GZl9--aqzJNxqbR>LC$*#`^%hG~VsUDb z5=b|gPzJH&7#J9AHg95^&nTeEz`#(&k(XbTt59yGP^30FkwdE<Y?%<qAm-xI+#+d^ z9=KC(u@)3%=9S!HE-oo5Lb!+x;v#O4eeva~nduoNw^)<&OY=&KbU^w+?uz0p$uCLF zi3b@9b`6*SIq8-J)F;__`Q?+jIC&WZCrfZfaWOM6FgP<XFceozuHh_?2ZuVNpC;Qa zw$!rxoU&AKAm3t3OioTMC_%U;iZe4WEvGa!FF93{5$rIuAh^Ysms%d5o|>0hlvt9P zpO*}>Luzs_m+a;>T$>mfRVT;uR55B#zQrRa1P%=YkRL$drpZ$zKbebHl~HlB0k5kF z*au(&<c%UjkU5(>dEYQHDo!rrS45Y$WME+E-MpIrC}X`n$V70^2!mKGpx|c7%qy|b z<SMcSMXo?%E-3ioOY-B3Q*%<2ONtyp!rTQ#`ALaMnK_vyl~L?znI+)h1O;!A0LUP9 zkRsM1u&4t_0PH$20d}Gl0|Uc628PM+1!Ea6P4*S~S<lE&!nS~8AwvvPEmtjf4fg`h z6i}+?%Hm$g#K=&?y?_VG=Y{aI_-a^cSW~!CxO<sF@>zT}95tLNJV<<|8s-#UBtBaW zdkP;CpCOAsOP~fs3Z~@nrwF77_OgJTA(X-g%3dXG3xrdIK&%?Z35-RHO4t^NEM#D0 z$kPF3)LNbrwk)w4o)qB}kzSA!c@~JLuz*yTuq}|N;R3O0c!D9BRMf8sRIC+&QhJfv z<Uo-acUMrbIDrU3P^dE(<fUse-eOD3FUn0U(UdF#ha))JLGneqAeDL`0u*Prm<w`B zZZRk4q)mP=V$LW&SzT0fa-ygR_bt}soc!WcP2M8;$(5opQs5v56QFRv#Zr)yU$PC9 zJ}f4`7nOA3VB}#GK!Q??T#Q^yY+%d>Vl!6p2jmx&=71BZ9!R&JCTobBn_Cel0|SF5 zqnjqr<h$ak^(r8jfs$qsIFTBIxS(`+i>J6Gu_QA&H?<@qKcxti^ol@{UlapU0d^RI z06DRUgMop87vw@v-sfOqVC2%_5akf!5a5vF5#*5o%WDeWV#>@fVgi`~%AG}Qpp;u= ZGPzGeo6%?TE{PNYgsEVb@?<?pH2~-mWsd*= diff --git a/src/__pycache__/world.cpython-37.pyc b/src/__pycache__/world.cpython-37.pyc index acac66c4f302c1cd111f5e3cf7ff16c6567b94be..5fc9c75c084a66d45a51b86a3c454e8f6cc34ccd 100644 GIT binary patch delta 379 zcmX>p@Kk`$iI<m)fq{X+W#O|}caDvG_AK@L7#J8z7#1)tWT<5-VX9$jW~^l{VP3$J z!dSzQ#hSvjkhzux&SwMjSxcA~u-CBEur6eZVX9@TWiMe~z)`}yfU|_Fgu8|zi>HKn z0dEc4LPjvnzL2q*xtVbxV+!*^rdo~~<^_B;Y&GmP91EEl8ESMHizbyYEZ|?rzzA}N zKn>GEMn;A_jS|6ThFZ=Nh6O@3oFI`Bh6MsOOq1WTm`~PZ&2+uRnw*ngoLa=hz`zj2 zUYuB#nwFV<i={X<HCvObNE9T>SCErm5?@vvUzA!>T9g;XS)N~%lM<hnnI6RfVNO26 zY9}iP3J)d@Mh+$cMiA6t=3``G<Y44sVq@f*EXx+jXgj%_ErCs+fq|jOVDeoy6GpMg vLhL#GjtmS8#VjD*j2w(bW|Mo_O&Jv?A7*!9GXp6#oXpE%&T7WN%E1T#A@y8` delta 351 zcmaDVa8iKJiI<m)fq{YHQ0LRwzw8_N>{;qJF)%QcFf3qP$iN7qnHDnCGL<mbFf}vQ zGMBI{U`=7HVaQ@jVOq#s%L3=KgZZo_EDJblSZY`oGQ}{}vemMeuq@y#VOhXc!d=2s z!;r;W!m@y`hHW7um}Xzd*v#C_xR5c0c_C9RM-B4={u;I#MfMtwh0Kf$HH<|QN*ERh zfSi#hS0dQVP|I1uut2DWbMj9Xa~9_0oV3aMtXW1yObiSRx7dpl%Tm)a({Hg9r>16W zautb!MEMGG@=M~&isOq?OG=CKZZU&YFipP4Y9}oN@--6&BL^b~lK>+K>M-*$vM_Qn zu}!vQi)6H!Jee(l&6t6Kp~z(NPc{=q(aC!3Is6U`3=G9AAiaznj73(HSF)QjDo(!7 V?!smTQffL`lf#_Vl!KLn5dfzyR?GkZ diff --git a/src/control.py b/src/control.py index 687d9b0..78e528d 100644 --- a/src/control.py +++ b/src/control.py @@ -10,6 +10,7 @@ def main(): print("iteration: " + str(i)) population.plot(True) population.new_generation() + population.plot_fitness(True) if __name__ == '__main__': diff --git a/src/population.py b/src/population.py index 571e357..3a6ff30 100644 --- a/src/population.py +++ b/src/population.py @@ -24,6 +24,7 @@ class Population: self.x[i] = (random() * world.size_x) self.y[i] = (random() * world.size_y) self.fitness[i] = (world.height(self.x[i], self.y[i])) + self.population_fitness = [] # cultural components self.situational = None @@ -111,6 +112,7 @@ class Population: self.normative.influence(self) if self.topological: self.topological.influence(self) + self.population_fitness.append(np.sum(self.fitness) / self.individuals_n) def evolve(self): """Generates the next generation of individuals""" @@ -191,7 +193,6 @@ class Population: def_y = self.y[self.knowledge == 0] print("numbers sit:" + str(len(sit_x)) + " norm: " + str(len(norm_x)) + " top: " + str(len(top_x)) + " def: " + str(len(def_x))) print("total " + str(len(sit_x)+len(norm_x)+len(top_x)+len(def_x))) - plt.clf() fig, ax = plt.subplots() ax.set_xlim(0, self.world.size_x) ax.set_ylim(0, self.world.size_y) @@ -205,9 +206,30 @@ class Population: if plot_vs_return: plt.show() + plt.clf() + plt.cla() + plt.close() else: img = BytesIO() plt.savefig(img, format='png') - img.seek(0) + plt.clf() + plt.cla() plt.close(fig) + img.seek(0) + return img + + def plot_fitness(self, plot_vs_return=False): + fit_fig, fit_ax = plt.subplots() + fit_ax.plot(range(len(self.population_fitness)), self.population_fitness) + plt.xlabel("iteration") + plt.ylabel("average fitness") + + if plot_vs_return: + plt.show() + plt.close(fit_fig) + else: + img = BytesIO() + fit_fig.savefig(img, format='png') + plt.close(fit_fig) + img.seek(0) return img diff --git a/src/world.py b/src/world.py index 343d7ae..c9d0399 100644 --- a/src/world.py +++ b/src/world.py @@ -38,22 +38,23 @@ class World: def get_plot(self, plot_vs_return): - plt.clf() - fig = plt.figure() - ax = Axes3D(fig) + world_fig = plt.figure() + world_ax = Axes3D(world_fig) x = np.linspace(0, self.size_x, 100) y = np.linspace(0, self.size_y, 100) x_grid, y_grid = np.meshgrid(x, y) z = np.reshape(np.array(list(map(self.height, np.ravel(x_grid), np.ravel(y_grid)))), (100, 100)) - # Plot a basic wireframe. - ax.plot_surface(x_grid, y_grid, z) + # Plot a basic wire frame. + world_ax.plot_surface(x_grid, y_grid, z) if plot_vs_return: plt.show() + plt.close(world_fig) else: img = BytesIO() plt.savefig(img) + plt.close(world_fig) img.seek(0) return img diff --git a/templates/main.html b/templates/main.html index 3c66838..7bec887 100644 --- a/templates/main.html +++ b/templates/main.html @@ -10,6 +10,15 @@ <script>window.jQuery || document.write('<script src="{{ url_for('static', filename='jquery.js') }}">\x3C/script>') $SCRIPT_ROOT = {{ request.script_root|tojson|safe }}; + $.ajax({ + dataType: "text", + url: $SCRIPT_ROOT + '/img/0', + data: "null", + success: function(data) { + console.log("fuck"); + $("#time_plot").attr("src", "data:image/png;base64," + data); + } + }); </script> <script type=text/javascript> $(function() { @@ -36,7 +45,8 @@ }); </script> <div id="element1"> - <img src="{{ url_for('main_plot') }}" alt="Image"> + <p>Problem domain:</p><br> + <img src="{{ url_for('main_plot') }}" alt="cone world"> </div> <div id="element2"> <form method="post"> @@ -53,10 +63,14 @@ </form> </div> <div class="slidecontainer"> - <img class="image" alt="Image" id="time_plot" src="?"><br> + <img class="image" alt="Population per year" id="time_plot" src="?"><br> <input type="range" min="0" max="{{ iterations }}" value="0" class="slider" id="myRange"><br> <p>Year: <span id="current_frame"></span></p> </div> + <div id="element3"> + <p>Average fitness:</p><br> + <img src="{{ url_for('fitness_plot') }}" alt="Run simulation to show the average fitness"> + </div> </body> </html> \ No newline at end of file -- GitLab