diff --git a/app.py b/app.py
index 7aec1b1255c2fd651b74cc7449ff6ce1bb5d6e47..b24051d4d207e7031c4b3cc4e8f35ee43b807674 100644
--- a/app.py
+++ b/app.py
@@ -9,14 +9,34 @@ app = Flask(__name__)
world = None
simulation_frames = {}
+cone_number = 30
+iterations = 50
+population_size = 100
+mutation_step_size = 0.1
+no_cultural_checked = ""
+situational_checked = "checked"
+normative_checked = ""
+topological_checked = "checked"
+
@app.route('/', methods=["GET", "POST"])
def main():
global world
- iterations = 0
+ global iterations
+ global population_size
+ global mutation_step_size
+ global cone_number
+ global no_cultural_checked
+ global situational_checked
+ global normative_checked
+ global topological_checked
+
"""Entry point; the view for the main page"""
+
if 'new_world' in request.form:
- world = World(int(request.form['cone_number']))
+ cone_number = int(request.form['cone_number'])
+ world = World(cone_number)
+
if "run_simulation" in request.form:
no_cultural_k = False
normative_k = False
@@ -24,21 +44,38 @@ def main():
situational_k = False
if 'normative_k' in request.form:
normative_k = True
+ normative_checked = "checked"
+ else:
+ normative_checked = ""
if 'topological_k' in request.form:
topological_k = True
+ topological_checked = "checked"
+ else:
+ topological_checked = ""
if 'situational_k' in request.form:
situational_k = True
+ situational_checked = "checked"
+ else:
+ situational_checked = ""
if 'no_cultural_k' in request.form:
no_cultural_k = True
- population = Population(int(request.form['population_size']), world, default=no_cultural_k,
+ no_cultural_checked = "checked"
+ else:
+ no_cultural_checked = ""
+ population_size = int(request.form['population_size'])
+ mutation_step_size = float(request.form['mutation_step_size'])
+ iterations = int(request.form['iterations'])
+ population = Population(population_size, world, default=no_cultural_k,
situational=situational_k, normative=normative_k, topological=topological_k,
- mutation_step_size=float(request.form['mutation_step_size']))
- for i in range(int(request.form['iterations'])):
+ mutation_step_size=mutation_step_size)
+ for i in range(iterations + 1):
simulation_frames[i] = population.plot(False)
population.new_generation()
- iterations = int(request.form['iterations']) - 1
- return render_template('main.html', iterations=iterations)
+ return render_template('main.html', iterations=iterations, population_size=population_size,
+ mutation_step_size=mutation_step_size, cone_number=cone_number,
+ no_cultural_checked=no_cultural_checked, situational_checked=situational_checked,
+ normative_checked=normative_checked, topological_checked=topological_checked)
@app.route('/main.png')
diff --git a/src/__pycache__/population.cpython-37.pyc b/src/__pycache__/population.cpython-37.pyc
index edf73248a8e10d6aa913f3b538756b077d4315db..7f61b2c8384765b7d859da5788da03b21bb24fb0 100644
Binary files a/src/__pycache__/population.cpython-37.pyc and b/src/__pycache__/population.cpython-37.pyc differ
diff --git a/src/__pycache__/world.cpython-37.pyc b/src/__pycache__/world.cpython-37.pyc
index a79a8db1e351088cb712108ea33b5180b3e50229..acac66c4f302c1cd111f5e3cf7ff16c6567b94be 100644
Binary files a/src/__pycache__/world.cpython-37.pyc and b/src/__pycache__/world.cpython-37.pyc differ
diff --git a/src/population.py b/src/population.py
index b8ba82d8d03aaf6cc68ce1dbf8de81833d674498..571e357b6fc68038e0010372dacdadd326915a04 100644
--- a/src/population.py
+++ b/src/population.py
@@ -172,7 +172,7 @@ class Population:
roulette = random()
r_sum = probability[0]
choice = 0
- while r_sum < roulette:
+ while r_sum <= roulette:
choice += 1
r_sum += probability[choice]
result[x] = choice
@@ -199,10 +199,12 @@ class Population:
ax.scatter(def_x, def_y, marker='v')
ax.scatter(sit_x, sit_y, marker='+')
ax.scatter(top_x, top_y, marker='x')
+ ax.scatter(self.situational.best_x, self.situational.best_y, marker="*", c='black')
+ plt.xlabel("x")
+ plt.ylabel("y")
if plot_vs_return:
plt.show()
- plt.close(fig)
else:
img = BytesIO()
plt.savefig(img, format='png')
diff --git a/src/topologicalKnowledge.py b/src/topologicalKnowledge.py
index f954e0ce73c8f290dbf8f9eea588234e5eada4e8..53e80adcef26bc00c4d766edc4bdb750d2b51cf0 100644
--- a/src/topologicalKnowledge.py
+++ b/src/topologicalKnowledge.py
@@ -1,12 +1,33 @@
+import sys
+from random import random
+
+import numpy as np
+
+
class TopologicalKnowledge:
# 3
def __init__(self):
self.weight = 0
+ self.nx = 10
+ self.ny = 10
+ self.topology = np.zeros((self.nx, self.ny))
def accept(self, population):
- pass
+ self.topology = np.zeros((self.nx, self.ny))
+ for i in range(population.individuals_n):
+ self.topology[min(int(population.x[i]), 9)][min(int(population.y[i]), 9)] += 1
def influence(self, population):
- pass
\ No newline at end of file
+ sparse = np.where( self.topology == np.min(self.topology))
+ for i in range(population.individuals_n):
+ if population.knowledge[i] == 3:
+ if random() < 0.5:
+ index = np.random.choice(len(sparse[0]))
+ population.x[i] = sparse[0][index] + random() * 10 / self.nx
+ population.y[i] = sparse[1][index] + random() * 10 / self.ny
+
+ # print(self.topology)
+ # print(np.sum(self.topology))
+ # print(sparse)
diff --git a/src/world.py b/src/world.py
index 7dc47c1c8db75f166a07bec6f25302c840444764..343d7aefe878503e6fc17ce919a239a6d79ee0fd 100644
--- a/src/world.py
+++ b/src/world.py
@@ -19,7 +19,7 @@ class World:
# list of tuples (peak_x, peak_y, height, gradient)
self.cones = []
if cones_n is None:
- self.cones.append((5, 5, 10, 1))
+ self.cones.append((8, 8, 10, 1))
else:
for cone in range(cones_n):
self.cones.append((random() * self.size_x, random() * self.size_y,
@@ -28,6 +28,8 @@ class World:
def height(self, x_position, y_position):
height_max = 0.0
+ if x_position >= 10 or x_position < 0 or y_position >= 10 or y_position < 0:
+ return height_max
for cone in self.cones:
height_current = cone[2] - sqrt(pow(x_position - cone[0], 2) + pow(y_position - cone[1], 2)) * cone[3]
if height_current > height_max:
diff --git a/templates/main.html b/templates/main.html
index 22309f1c1a31a12acbc4560df3f9279abf1fc157..3c668382ee769e07da126d9410801a1a5bb0d282 100644
--- a/templates/main.html
+++ b/templates/main.html
@@ -41,14 +41,14 @@
<div id="element2">
<form method="post">
<input type="submit" name="new_world" value="Create new world">
- Cones: <input type="text" name="cone_number" value="5"><br>
- Population size: <input type="text" name="population_size" value="200"><br>
- Iterations: <input type="text" name="iterations" value="10"><br>
- Maximum mutation step: <input type="text" name="mutation_step_size" value="0.1"><br>
- <input type="checkbox" name="no_cultural_k" value="no cultural knowledge" checked> no cultural knowledge (v)<br>
- <input type="checkbox" name="situational_k" value="situational knowledge" checked> situational knowledge (+)<br>
- <input type="checkbox" name="normative_k" value="normative knowledge" checked> normative knowledge (o)<br>
- <input type="checkbox" name="topological_k" value="topological knowledge" checked> topological knowledge (x)<br>
+ Cones: <input type="text" name="cone_number" value="{{ cone_number }}"><br>
+ Population size: <input type="text" name="population_size" value="{{ population_size }}"><br>
+ Iterations: <input type="text" name="iterations" value="{{ iterations }}"><br>
+ Maximum mutation step: <input type="text" name="mutation_step_size" value="{{ mutation_step_size }}"><br>
+ <input type="checkbox" name="no_cultural_k" value="no cultural knowledge" {{ no_cultural_checked }}> no cultural knowledge (v)<br>
+ <input type="checkbox" name="situational_k" value="situational knowledge" {{ situational_checked }}> situational knowledge (+)<br>
+ <input type="checkbox" name="normative_k" value="normative knowledge" {{ normative_checked }}> normative knowledge (o)<br>
+ <input type="checkbox" name="topological_k" value="topological knowledge" {{ topological_checked }}> topological knowledge (x)<br>
<input type="submit" name="run_simulation" value="Run simulation"><br>
</form>
</div>