petri_dish_lab 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,39 @@
1
+ ### Traveling Salesperson
2
+
3
+ ```
4
+ ┌──────────────────────────────────────────────────┐
5
+ 5 │ ':.. │
6
+ │ '. '. │
7
+ │ : ''. │
8
+ │ '. ''. .:│
9
+ │ '. '.. .':' │
10
+ │ : '. ..' .' │
11
+ │ .'' ''''''''''''''''' : │
12
+ y │ .'' .' │
13
+ │ ..' .' │
14
+ │ ..' : │
15
+ │ .' : │
16
+ │.'' : │
17
+ │'''... ....''''' │
18
+ │ '''... ....'''' │
19
+ 0 │ ''.......'''' │
20
+ └──────────────────────────────────────────────────┘
21
+ 2 8
22
+ x
23
+ ```
24
+
25
+ The `salesperson_example.rb` is an example of using the Petri Dish library to solve a more complex problem: The Traveling Salesperson Problem. In this problem, a salesperson needs to visit a number of cities, each at a different location, and return to the starting city. The goal is to find the shortest possible route that visits each city exactly once.
26
+
27
+ In this example, each city is represented as a `Gene` object with `x` and `y` coordinates. The genetic material is the array of all possible `x` and `y` coordinates. The fitness function is defined as the inverse of the total distance of the route, which means that shorter routes will have higher fitness.
28
+
29
+ The parents for crossover are selected using a tournament selection function which picks the best 2 out of a random sample of 20% of the population. Crossover is performed using an ordered crossover method which maintains the relative order of the genes from both parents.
30
+
31
+ Mutation is implemented as a chance to swap two genes in a member. The mutation rate is set to 0.01, which means that on average, 1% of the genes in a member will mutate in each generation.
32
+
33
+ The evolutionary process runs for a fixed number of generations, and the highest fitness member in each generation is saved to a CSV file.
34
+
35
+ To run the example, simply execute the following command in your terminal:
36
+
37
+ ```bash
38
+ bundle exec ruby examples/salesperson_example.rb
39
+ ```
@@ -0,0 +1,12 @@
1
+ x,y
2
+ 4,3
3
+ 2,1
4
+ 4,0
5
+ 7,1
6
+ 7,2
7
+ 8,4
8
+ 7,3
9
+ 6,3
10
+ 5,3
11
+ 3,5
12
+ 4,3
@@ -0,0 +1,113 @@
1
+ I, [2023-07-30T01:06:10.433797 #1628] INFO -- : Run started.
2
+ I, [2023-07-30T01:06:10.433859 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":0,"highest_fitness":0,"elapsed_time":0.0,"last_fitness_increase":0}
3
+ I, [2023-07-30T01:06:10.434743 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":0,"highest_fitness":0.026192472204508554,"elapsed_time":0.0,"last_fitness_increase":0}
4
+ I, [2023-07-30T01:06:10.435591 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":0,"highest_fitness":0.02778990343650704,"elapsed_time":0.0,"last_fitness_increase":0}
5
+ I, [2023-07-30T01:06:10.436133 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":0,"highest_fitness":0.035366588382994765,"elapsed_time":0.0,"last_fitness_increase":0}
6
+ I, [2023-07-30T01:06:10.436581 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":0,"highest_fitness":0.03893619953079128,"elapsed_time":0.0,"last_fitness_increase":0}
7
+ I, [2023-07-30T01:06:10.438169 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":1,"highest_fitness":0.03893619953079128,"elapsed_time":0.0,"last_fitness_increase":0}
8
+ I, [2023-07-30T01:06:10.438667 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":1,"highest_fitness":0.04111127926828182,"elapsed_time":0.0,"last_fitness_increase":1}
9
+ I, [2023-07-30T01:06:10.439451 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":1,"highest_fitness":0.04299996512447041,"elapsed_time":0.01,"last_fitness_increase":1}
10
+ I, [2023-07-30T01:06:10.440999 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":2,"highest_fitness":0.04299996512447041,"elapsed_time":0.01,"last_fitness_increase":1}
11
+ I, [2023-07-30T01:06:10.441413 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":2,"highest_fitness":0.0443516004204991,"elapsed_time":0.01,"last_fitness_increase":2}
12
+ I, [2023-07-30T01:06:10.442849 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":3,"highest_fitness":0.0443516004204991,"elapsed_time":0.01,"last_fitness_increase":2}
13
+ I, [2023-07-30T01:06:10.444416 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":4,"highest_fitness":0.0443516004204991,"elapsed_time":0.01,"last_fitness_increase":2}
14
+ I, [2023-07-30T01:06:10.445868 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":5,"highest_fitness":0.0443516004204991,"elapsed_time":0.01,"last_fitness_increase":2}
15
+ I, [2023-07-30T01:06:10.447362 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":6,"highest_fitness":0.0443516004204991,"elapsed_time":0.01,"last_fitness_increase":2}
16
+ I, [2023-07-30T01:06:10.449076 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":7,"highest_fitness":0.0443516004204991,"elapsed_time":0.02,"last_fitness_increase":2}
17
+ I, [2023-07-30T01:06:10.450435 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":8,"highest_fitness":0.0443516004204991,"elapsed_time":0.02,"last_fitness_increase":2}
18
+ I, [2023-07-30T01:06:10.451777 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":9,"highest_fitness":0.0443516004204991,"elapsed_time":0.02,"last_fitness_increase":2}
19
+ I, [2023-07-30T01:06:10.453078 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":10,"highest_fitness":0.0443516004204991,"elapsed_time":0.02,"last_fitness_increase":2}
20
+ I, [2023-07-30T01:06:10.454696 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":11,"highest_fitness":0.0443516004204991,"elapsed_time":0.02,"last_fitness_increase":2}
21
+ I, [2023-07-30T01:06:10.456061 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":12,"highest_fitness":0.0443516004204991,"elapsed_time":0.02,"last_fitness_increase":2}
22
+ I, [2023-07-30T01:06:10.457458 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":13,"highest_fitness":0.0443516004204991,"elapsed_time":0.02,"last_fitness_increase":2}
23
+ I, [2023-07-30T01:06:10.460777 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":14,"highest_fitness":0.0443516004204991,"elapsed_time":0.03,"last_fitness_increase":2}
24
+ I, [2023-07-30T01:06:10.462142 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":15,"highest_fitness":0.0443516004204991,"elapsed_time":0.03,"last_fitness_increase":2}
25
+ I, [2023-07-30T01:06:10.463566 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":16,"highest_fitness":0.0443516004204991,"elapsed_time":0.03,"last_fitness_increase":2}
26
+ I, [2023-07-30T01:06:10.464916 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":17,"highest_fitness":0.0443516004204991,"elapsed_time":0.03,"last_fitness_increase":2}
27
+ I, [2023-07-30T01:06:10.466407 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":18,"highest_fitness":0.0443516004204991,"elapsed_time":0.03,"last_fitness_increase":2}
28
+ I, [2023-07-30T01:06:10.468237 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":19,"highest_fitness":0.0443516004204991,"elapsed_time":0.03,"last_fitness_increase":2}
29
+ I, [2023-07-30T01:06:10.469592 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":20,"highest_fitness":0.0443516004204991,"elapsed_time":0.04,"last_fitness_increase":2}
30
+ I, [2023-07-30T01:06:10.470891 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":21,"highest_fitness":0.0443516004204991,"elapsed_time":0.04,"last_fitness_increase":2}
31
+ I, [2023-07-30T01:06:10.472237 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":22,"highest_fitness":0.0443516004204991,"elapsed_time":0.04,"last_fitness_increase":2}
32
+ I, [2023-07-30T01:06:10.473930 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":22,"highest_fitness":0.04542697529438156,"elapsed_time":0.04,"last_fitness_increase":22}
33
+ I, [2023-07-30T01:06:10.474195 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":23,"highest_fitness":0.04542697529438156,"elapsed_time":0.04,"last_fitness_increase":22}
34
+ I, [2023-07-30T01:06:10.475629 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":24,"highest_fitness":0.04542697529438156,"elapsed_time":0.04,"last_fitness_increase":22}
35
+ I, [2023-07-30T01:06:10.476980 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":25,"highest_fitness":0.04542697529438156,"elapsed_time":0.04,"last_fitness_increase":22}
36
+ I, [2023-07-30T01:06:10.478363 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":26,"highest_fitness":0.04542697529438156,"elapsed_time":0.04,"last_fitness_increase":22}
37
+ I, [2023-07-30T01:06:10.480170 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":27,"highest_fitness":0.04542697529438156,"elapsed_time":0.05,"last_fitness_increase":22}
38
+ I, [2023-07-30T01:06:10.481465 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":28,"highest_fitness":0.04542697529438156,"elapsed_time":0.05,"last_fitness_increase":22}
39
+ I, [2023-07-30T01:06:10.482030 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":28,"highest_fitness":0.04692405168534187,"elapsed_time":0.05,"last_fitness_increase":28}
40
+ I, [2023-07-30T01:06:10.483084 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":29,"highest_fitness":0.04692405168534187,"elapsed_time":0.05,"last_fitness_increase":28}
41
+ I, [2023-07-30T01:06:10.484438 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":30,"highest_fitness":0.04692405168534187,"elapsed_time":0.05,"last_fitness_increase":28}
42
+ I, [2023-07-30T01:06:10.487536 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":31,"highest_fitness":0.04692405168534187,"elapsed_time":0.05,"last_fitness_increase":28}
43
+ I, [2023-07-30T01:06:10.489518 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":32,"highest_fitness":0.04692405168534187,"elapsed_time":0.06,"last_fitness_increase":28}
44
+ I, [2023-07-30T01:06:10.490901 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":33,"highest_fitness":0.04692405168534187,"elapsed_time":0.06,"last_fitness_increase":28}
45
+ I, [2023-07-30T01:06:10.492167 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":34,"highest_fitness":0.04692405168534187,"elapsed_time":0.06,"last_fitness_increase":28}
46
+ I, [2023-07-30T01:06:10.493387 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":35,"highest_fitness":0.04692405168534187,"elapsed_time":0.06,"last_fitness_increase":28}
47
+ I, [2023-07-30T01:06:10.495101 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":36,"highest_fitness":0.04692405168534187,"elapsed_time":0.06,"last_fitness_increase":28}
48
+ I, [2023-07-30T01:06:10.496439 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":37,"highest_fitness":0.04692405168534187,"elapsed_time":0.06,"last_fitness_increase":28}
49
+ I, [2023-07-30T01:06:10.497752 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":38,"highest_fitness":0.04692405168534187,"elapsed_time":0.06,"last_fitness_increase":28}
50
+ I, [2023-07-30T01:06:10.499035 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":39,"highest_fitness":0.04692405168534187,"elapsed_time":0.07,"last_fitness_increase":28}
51
+ I, [2023-07-30T01:06:10.500746 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":40,"highest_fitness":0.04692405168534187,"elapsed_time":0.07,"last_fitness_increase":28}
52
+ I, [2023-07-30T01:06:10.502030 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":41,"highest_fitness":0.04692405168534187,"elapsed_time":0.07,"last_fitness_increase":28}
53
+ I, [2023-07-30T01:06:10.503308 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":42,"highest_fitness":0.04692405168534187,"elapsed_time":0.07,"last_fitness_increase":28}
54
+ I, [2023-07-30T01:06:10.504597 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":43,"highest_fitness":0.04692405168534187,"elapsed_time":0.07,"last_fitness_increase":28}
55
+ I, [2023-07-30T01:06:10.505871 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":44,"highest_fitness":0.04692405168534187,"elapsed_time":0.07,"last_fitness_increase":28}
56
+ I, [2023-07-30T01:06:10.507678 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":45,"highest_fitness":0.04692405168534187,"elapsed_time":0.07,"last_fitness_increase":28}
57
+ I, [2023-07-30T01:06:10.509000 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":46,"highest_fitness":0.04692405168534187,"elapsed_time":0.08,"last_fitness_increase":28}
58
+ I, [2023-07-30T01:06:10.510271 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":47,"highest_fitness":0.04692405168534187,"elapsed_time":0.08,"last_fitness_increase":28}
59
+ I, [2023-07-30T01:06:10.511498 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":48,"highest_fitness":0.04692405168534187,"elapsed_time":0.08,"last_fitness_increase":28}
60
+ I, [2023-07-30T01:06:10.513264 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":49,"highest_fitness":0.04692405168534187,"elapsed_time":0.08,"last_fitness_increase":28}
61
+ I, [2023-07-30T01:06:10.514548 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":50,"highest_fitness":0.04692405168534187,"elapsed_time":0.08,"last_fitness_increase":28}
62
+ I, [2023-07-30T01:06:10.515794 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":51,"highest_fitness":0.04692405168534187,"elapsed_time":0.08,"last_fitness_increase":28}
63
+ I, [2023-07-30T01:06:10.517071 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":52,"highest_fitness":0.04692405168534187,"elapsed_time":0.08,"last_fitness_increase":28}
64
+ I, [2023-07-30T01:06:10.518825 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":53,"highest_fitness":0.04692405168534187,"elapsed_time":0.08,"last_fitness_increase":28}
65
+ I, [2023-07-30T01:06:10.520160 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":54,"highest_fitness":0.04692405168534187,"elapsed_time":0.09,"last_fitness_increase":28}
66
+ I, [2023-07-30T01:06:10.521449 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":55,"highest_fitness":0.04692405168534187,"elapsed_time":0.09,"last_fitness_increase":28}
67
+ I, [2023-07-30T01:06:10.522202 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":55,"highest_fitness":0.048129485846943695,"elapsed_time":0.09,"last_fitness_increase":55}
68
+ I, [2023-07-30T01:06:10.522983 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":56,"highest_fitness":0.048129485846943695,"elapsed_time":0.09,"last_fitness_increase":55}
69
+ I, [2023-07-30T01:06:10.524772 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":57,"highest_fitness":0.048129485846943695,"elapsed_time":0.09,"last_fitness_increase":55}
70
+ I, [2023-07-30T01:06:10.526082 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":58,"highest_fitness":0.048129485846943695,"elapsed_time":0.09,"last_fitness_increase":55}
71
+ I, [2023-07-30T01:06:10.527380 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":59,"highest_fitness":0.048129485846943695,"elapsed_time":0.09,"last_fitness_increase":55}
72
+ I, [2023-07-30T01:06:10.529311 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":60,"highest_fitness":0.048129485846943695,"elapsed_time":0.1,"last_fitness_increase":55}
73
+ I, [2023-07-30T01:06:10.532591 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":61,"highest_fitness":0.048129485846943695,"elapsed_time":0.1,"last_fitness_increase":55}
74
+ I, [2023-07-30T01:06:10.533905 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":62,"highest_fitness":0.048129485846943695,"elapsed_time":0.1,"last_fitness_increase":55}
75
+ I, [2023-07-30T01:06:10.535166 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":63,"highest_fitness":0.048129485846943695,"elapsed_time":0.1,"last_fitness_increase":55}
76
+ I, [2023-07-30T01:06:10.536426 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":64,"highest_fitness":0.048129485846943695,"elapsed_time":0.1,"last_fitness_increase":55}
77
+ I, [2023-07-30T01:06:10.537711 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":65,"highest_fitness":0.048129485846943695,"elapsed_time":0.1,"last_fitness_increase":55}
78
+ I, [2023-07-30T01:06:10.539503 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":66,"highest_fitness":0.048129485846943695,"elapsed_time":0.11,"last_fitness_increase":55}
79
+ I, [2023-07-30T01:06:10.540812 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":67,"highest_fitness":0.048129485846943695,"elapsed_time":0.11,"last_fitness_increase":55}
80
+ I, [2023-07-30T01:06:10.542112 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":68,"highest_fitness":0.048129485846943695,"elapsed_time":0.11,"last_fitness_increase":55}
81
+ I, [2023-07-30T01:06:10.543375 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":69,"highest_fitness":0.048129485846943695,"elapsed_time":0.11,"last_fitness_increase":55}
82
+ I, [2023-07-30T01:06:10.545222 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":70,"highest_fitness":0.048129485846943695,"elapsed_time":0.11,"last_fitness_increase":55}
83
+ I, [2023-07-30T01:06:10.546524 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":71,"highest_fitness":0.048129485846943695,"elapsed_time":0.11,"last_fitness_increase":55}
84
+ I, [2023-07-30T01:06:10.547945 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":72,"highest_fitness":0.048129485846943695,"elapsed_time":0.11,"last_fitness_increase":55}
85
+ I, [2023-07-30T01:06:10.549231 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":73,"highest_fitness":0.048129485846943695,"elapsed_time":0.12,"last_fitness_increase":55}
86
+ I, [2023-07-30T01:06:10.551060 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":74,"highest_fitness":0.048129485846943695,"elapsed_time":0.12,"last_fitness_increase":55}
87
+ I, [2023-07-30T01:06:10.552384 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":75,"highest_fitness":0.048129485846943695,"elapsed_time":0.12,"last_fitness_increase":55}
88
+ I, [2023-07-30T01:06:10.553697 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":76,"highest_fitness":0.048129485846943695,"elapsed_time":0.12,"last_fitness_increase":55}
89
+ I, [2023-07-30T01:06:10.554939 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":77,"highest_fitness":0.048129485846943695,"elapsed_time":0.12,"last_fitness_increase":55}
90
+ I, [2023-07-30T01:06:10.556247 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":78,"highest_fitness":0.048129485846943695,"elapsed_time":0.12,"last_fitness_increase":55}
91
+ I, [2023-07-30T01:06:10.558254 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":79,"highest_fitness":0.048129485846943695,"elapsed_time":0.12,"last_fitness_increase":55}
92
+ I, [2023-07-30T01:06:10.559528 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":80,"highest_fitness":0.048129485846943695,"elapsed_time":0.13,"last_fitness_increase":55}
93
+ I, [2023-07-30T01:06:10.560751 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":81,"highest_fitness":0.048129485846943695,"elapsed_time":0.13,"last_fitness_increase":55}
94
+ I, [2023-07-30T01:06:10.562000 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":82,"highest_fitness":0.048129485846943695,"elapsed_time":0.13,"last_fitness_increase":55}
95
+ I, [2023-07-30T01:06:10.563843 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":83,"highest_fitness":0.048129485846943695,"elapsed_time":0.13,"last_fitness_increase":55}
96
+ I, [2023-07-30T01:06:10.565232 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":83,"highest_fitness":0.050146554799431704,"elapsed_time":0.13,"last_fitness_increase":83}
97
+ I, [2023-07-30T01:06:10.565453 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":84,"highest_fitness":0.050146554799431704,"elapsed_time":0.13,"last_fitness_increase":83}
98
+ I, [2023-07-30T01:06:10.566755 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":85,"highest_fitness":0.050146554799431704,"elapsed_time":0.13,"last_fitness_increase":83}
99
+ I, [2023-07-30T01:06:10.568071 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":86,"highest_fitness":0.050146554799431704,"elapsed_time":0.13,"last_fitness_increase":83}
100
+ I, [2023-07-30T01:06:10.569947 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":87,"highest_fitness":0.050146554799431704,"elapsed_time":0.14,"last_fitness_increase":83}
101
+ I, [2023-07-30T01:06:10.571269 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":88,"highest_fitness":0.050146554799431704,"elapsed_time":0.14,"last_fitness_increase":83}
102
+ I, [2023-07-30T01:06:10.572666 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":89,"highest_fitness":0.050146554799431704,"elapsed_time":0.14,"last_fitness_increase":83}
103
+ I, [2023-07-30T01:06:10.573913 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":90,"highest_fitness":0.050146554799431704,"elapsed_time":0.14,"last_fitness_increase":83}
104
+ I, [2023-07-30T01:06:10.575951 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":91,"highest_fitness":0.050146554799431704,"elapsed_time":0.14,"last_fitness_increase":83}
105
+ I, [2023-07-30T01:06:10.577369 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":92,"highest_fitness":0.050146554799431704,"elapsed_time":0.14,"last_fitness_increase":83}
106
+ I, [2023-07-30T01:06:10.578719 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":93,"highest_fitness":0.050146554799431704,"elapsed_time":0.14,"last_fitness_increase":83}
107
+ I, [2023-07-30T01:06:10.581031 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":94,"highest_fitness":0.050146554799431704,"elapsed_time":0.15,"last_fitness_increase":83}
108
+ I, [2023-07-30T01:06:10.585206 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":95,"highest_fitness":0.050146554799431704,"elapsed_time":0.15,"last_fitness_increase":83}
109
+ I, [2023-07-30T01:06:10.586498 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":96,"highest_fitness":0.050146554799431704,"elapsed_time":0.15,"last_fitness_increase":83}
110
+ I, [2023-07-30T01:06:10.588071 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":97,"highest_fitness":0.050146554799431704,"elapsed_time":0.15,"last_fitness_increase":83}
111
+ I, [2023-07-30T01:06:10.589300 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":98,"highest_fitness":0.050146554799431704,"elapsed_time":0.16,"last_fitness_increase":83}
112
+ I, [2023-07-30T01:06:10.590610 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":99,"highest_fitness":0.050146554799431704,"elapsed_time":0.16,"last_fitness_increase":83}
113
+ I, [2023-07-30T01:06:10.591913 #1628] INFO -- : {"id":"44a752f9-2372-4579-b29b-1aafd1d6cac0","generation_count":100,"highest_fitness":0.050146554799431704,"elapsed_time":0.16,"last_fitness_increase":83}
@@ -0,0 +1,48 @@
1
+ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
2
+ 5 │ :'. │
3
+ │ '.''. │
4
+ │ '. '.. │
5
+ │ : '.. │
6
+ │ '. '. │
7
+ │ '. ''. │
8
+ │ '. ''. │
9
+ │ '. '.. │
10
+ │ : '. │
11
+ │ '. ''. .:│
12
+ │ '. ''. .':' │
13
+ │ : '.. ..' .' │
14
+ │ '. '.. ..' : │
15
+ │ : '. .' .' │
16
+ │ '. ''. .'' .' │
17
+ │ '. ''. .'' .' │
18
+ │ : '.. ..' .' │
19
+ │ '. '. ..' : │
20
+ │ .'' ''''''''''''''''''''''''''''''''''''''''''''''''''' .' │
21
+ │ .'' .' │
22
+ │ ..' : │
23
+ │ ..' .' │
24
+ y │ .' : │
25
+ │ .'' .' │
26
+ │ .'' .' │
27
+ │ ..' : │
28
+ │ ..' .' │
29
+ │ .' : │
30
+ │ .'' : │
31
+ │ ..' : │
32
+ │ ..' : │
33
+ │ .' : │
34
+ │ .'' : │
35
+ │ .'' : │
36
+ │ ..' : │
37
+ │..' : │
38
+ │'''... ....''''' │
39
+ │ '''... ....'''' │
40
+ │ ''... ....'''' │
41
+ │ '''... ....''''' │
42
+ │ '''.. ....'''' │
43
+ │ '''... ....'''' │
44
+ │ '''.. ....''''' │
45
+ │ '''... ....'''' │
46
+ 0 │ '''.......'''' │
47
+ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
48
+ 2 8
@@ -1,5 +1,5 @@
1
1
  # require "petri_dish" # Uncomment this line and comment/remove the line below if you're using Petri Dish as a gem
2
- require_relative "../lib/petri_dish"
2
+ require_relative "../../lib/petri_dish"
3
3
  require "csv"
4
4
 
5
5
  XLIMIT = 10
@@ -118,7 +118,6 @@ configuration = PetriDish::Configuration.configure do |config|
118
118
  config.population_size = 100
119
119
  config.mutation_rate = 0.01
120
120
  config.genetic_material = GENETIC_MATERIAL
121
- config.target_genes = random_uniq_city_gene_generation
122
121
  config.mutation_function = swap_mutation_function(config)
123
122
  config.fitness_function = fitness_function
124
123
  config.parents_selection_function = twenty_percent_tournament(config)
@@ -5,7 +5,6 @@ module PetriDish
5
5
  :mutation_rate,
6
6
  :genetic_material,
7
7
  :elitism_rate,
8
- :target_genes,
9
8
  :max_generations,
10
9
  :parents_selection_function,
11
10
  :crossover_function,
@@ -14,7 +13,7 @@ module PetriDish
14
13
  :highest_fitness_callback,
15
14
  :max_generation_reached_callback,
16
15
  :end_condition_function,
17
- :next_generation_callback,
16
+ :generation_start_callback,
18
17
  :end_condition_reached_callback
19
18
 
20
19
  def self.configure
@@ -30,7 +29,6 @@ module PetriDish
30
29
  @mutation_rate = default_mutation_rate
31
30
  @elitism_rate = default_elitism_rate
32
31
  @genetic_material = default_genetic_material
33
- @target_genes = default_target_genes
34
32
  @fitness_function = default_fitness_function
35
33
  @parents_selection_function = default_parents_selection_function
36
34
  @crossover_function = default_crossover_function
@@ -38,7 +36,7 @@ module PetriDish
38
36
  @highest_fitness_callback = default_highest_fitness_callback
39
37
  @end_condition_function = default_end_condition_function
40
38
  @max_generation_reached_callback = default_max_generation_reached_callback
41
- @next_generation_callback = default_next_generation_callback
39
+ @generation_start_callback = default_generation_start_callback
42
40
  @end_condition_reached_callback = default_end_condition_reached_callback
43
41
  end
44
42
 
@@ -49,16 +47,15 @@ module PetriDish
49
47
  raise ArgumentError, "mutation_rate must be between 0 and 1" unless mutation_rate >= 0 && mutation_rate <= 1
50
48
  raise ArgumentError, "elitism_rate must be between 0 and 1" unless elitism_rate >= 0 && elitism_rate <= 1
51
49
  raise ArgumentError, "genetic_material must be an Array" unless genetic_material.is_a?(Array)
52
- raise ArgumentError, "target_genes must be an Array" unless target_genes.is_a?(Array)
53
50
  raise ArgumentError, "fitness_function must respond to :call" unless fitness_function.respond_to?(:call)
54
51
  raise ArgumentError, "parents_selection_function must respond to :call" unless parents_selection_function.respond_to?(:call)
55
52
  raise ArgumentError, "crossover_function must respond to :call" unless crossover_function.respond_to?(:call)
56
53
  raise ArgumentError, "mutation_function must respond to :call" unless mutation_function.respond_to?(:call)
57
54
  raise ArgumentError, "end_condition_function must respond to :call" unless end_condition_function.respond_to?(:call)
58
- raise ArgumentError, "highest_fitness_callback must respond to :call" unless highest_fitness_callback.respond_to?(:call)
59
- raise ArgumentError, "max_generation_reached_callback must respond to :call" unless max_generation_reached_callback.respond_to?(:call)
60
- raise ArgumentError, "next_generation_callback must respond to :call" unless next_generation_callback.respond_to?(:call)
61
- raise ArgumentError, "end_condition_reached_callback must respond to :call" unless end_condition_reached_callback.respond_to?(:call)
55
+ raise ArgumentError, "highest_fitness_callback must respond to :call" unless highest_fitness_callback.nil? || highest_fitness_callback.respond_to?(:call)
56
+ raise ArgumentError, "max_generation_reached_callback must respond to :call" unless max_generation_reached_callback.nil? || max_generation_reached_callback.respond_to?(:call)
57
+ raise ArgumentError, "generation_start_callback must respond to :call" unless generation_start_callback.nil? || generation_start_callback.respond_to?(:call)
58
+ raise ArgumentError, "end_condition_reached_callback must respond to :call" unless end_condition_reached_callback.nil? || end_condition_reached_callback.respond_to?(:call)
62
59
  end
63
60
 
64
61
  def reset!
@@ -68,7 +65,6 @@ module PetriDish
68
65
  @mutation_rate = default_mutation_rate
69
66
  @elitism_rate = default_elitism_rate
70
67
  @genetic_material = default_genetic_material
71
- @target_genes = default_target_genes
72
68
  @fitness_function = default_fitness_function
73
69
  @parents_selection_function = default_parents_selection_function
74
70
  @crossover_function = default_crossover_function
@@ -76,7 +72,7 @@ module PetriDish
76
72
  @end_condition_function = default_end_condition_function
77
73
  @highest_fitness_callback = default_highest_fitness_callback
78
74
  @max_generation_reached_callback = default_max_generation_reached_callback
79
- @next_generation_callback = default_next_generation_callback
75
+ @generation_start_callback = default_generation_start_callback
80
76
  @end_condition_reached_callback = default_end_condition_reached_callback
81
77
  end
82
78
 
@@ -98,8 +94,6 @@ module PetriDish
98
94
 
99
95
  def default_genetic_material = []
100
96
 
101
- def default_target_genes = nil
102
-
103
97
  def default_fitness_function = ->(_member) { raise ArgumentError, "fitness_function must be set" }
104
98
 
105
99
  def default_parents_selection_function = ->(_members) { raise ArgumentError, "parents_selection_function must be set" }
@@ -110,16 +104,16 @@ module PetriDish
110
104
 
111
105
  def default_end_condition_function = ->(_member) { false }
112
106
 
113
- def default_highest_fitness_callback = ->(_member) { :noop }
107
+ def default_highest_fitness_callback = nil
114
108
 
115
109
  # TODO: We might want to consider whether we really want to use `exit` as a
116
110
  # default callback. This will stop the entire Ruby process, which could be
117
111
  # surprising behavior if the user of the library doesn't override these
118
112
  # callbacks.
119
- def default_max_generation_reached_callback = -> { exit }
113
+ def default_max_generation_reached_callback = nil
120
114
 
121
- def default_next_generation_callback = ->(_generation) { :noop }
115
+ def default_generation_start_callback = nil
122
116
 
123
- def default_end_condition_reached_callback = ->(_member) { exit }
117
+ def default_end_condition_reached_callback = nil
124
118
  end
125
119
  end
@@ -1,6 +1,6 @@
1
1
  module PetriDish
2
2
  class Member
3
- attr_reader :genes, :fitness_function
3
+ attr_reader :genes
4
4
 
5
5
  def initialize(genes:, fitness_function:)
6
6
  @fitness_function = fitness_function
@@ -8,7 +8,7 @@ module PetriDish
8
8
  end
9
9
 
10
10
  def fitness
11
- @fitness ||= fitness_function.call(self)
11
+ @fitness ||= @fitness_function.call(self)
12
12
  end
13
13
 
14
14
  def to_s
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module PetriDish
4
- VERSION = "0.1.1"
4
+ VERSION = "0.2.0"
5
5
  end
@@ -20,7 +20,7 @@ module PetriDish
20
20
  configuration: Configuration.new,
21
21
  metadata: Metadata.new
22
22
  )
23
- configuration.next_generation_callback.call(metadata.generation_count)
23
+ configuration.generation_start_callback&.call(metadata.generation_count)
24
24
 
25
25
  end_condition_reached = false
26
26
  max_generation_reached = false
@@ -33,7 +33,7 @@ module PetriDish
33
33
  configuration.logger.info(metadata.to_json)
34
34
 
35
35
  if metadata.generation_count >= configuration.max_generations
36
- configuration.max_generation_reached_callback.call
36
+ configuration.max_generation_reached_callback&.call
37
37
  max_generation_reached = true
38
38
  end
39
39
 
@@ -46,13 +46,13 @@ module PetriDish
46
46
  configuration.mutation_function.call(child_member).tap do |mutated_child|
47
47
  if metadata.highest_fitness < mutated_child.fitness
48
48
  metadata.set_highest_fitness(mutated_child.fitness)
49
- configuration.highest_fitness_callback.call(mutated_child)
49
+ configuration.highest_fitness_callback&.call(mutated_child)
50
50
 
51
51
  configuration.logger.info(metadata.to_json)
52
52
  end
53
53
 
54
54
  if configuration.end_condition_function.call(mutated_child)
55
- configuration.end_condition_reached_callback.call(mutated_child)
55
+ configuration.end_condition_reached_callback&.call(mutated_child)
56
56
  end_condition_reached = true
57
57
  end
58
58
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: petri_dish_lab
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Thomas Countz
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-07-26 00:00:00.000000000 Z
11
+ date: 2023-07-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rspec
@@ -74,7 +74,6 @@ executables: []
74
74
  extensions: []
75
75
  extra_rdoc_files: []
76
76
  files:
77
- - ".DS_Store"
78
77
  - ".rspec"
79
78
  - ".standard.yml"
80
79
  - CHANGELOG.md
@@ -82,8 +81,23 @@ files:
82
81
  - LICENSE.txt
83
82
  - README.md
84
83
  - Rakefile
85
- - examples/lazy_dog_example.rb
86
- - examples/salesperson_example.rb
84
+ - examples/lazy_dog/README.md
85
+ - examples/lazy_dog/lazy_dog_example.rb
86
+ - examples/lazy_dog/log.txt
87
+ - examples/low_poly_reconstruction/README.md
88
+ - examples/low_poly_reconstruction/input_convert.png
89
+ - examples/low_poly_reconstruction/low_poly_reconstruction.rb
90
+ - examples/low_poly_reconstruction/montage.png
91
+ - examples/low_poly_reconstruction/out/gen-0000.png
92
+ - examples/low_poly_reconstruction/out/gen-2473.png
93
+ - examples/low_poly_reconstruction/out/log.txt
94
+ - examples/low_poly_reconstruction/result.png
95
+ - examples/low_poly_reconstruction/ruby.svg
96
+ - examples/traveling_salesperson/README.md
97
+ - examples/traveling_salesperson/best_member.csv
98
+ - examples/traveling_salesperson/log.txt
99
+ - examples/traveling_salesperson/plot.txt
100
+ - examples/traveling_salesperson/salesperson_example.rb
87
101
  - lib/petri_dish.rb
88
102
  - lib/petri_dish/configuration.rb
89
103
  - lib/petri_dish/member.rb
data/.DS_Store DELETED
Binary file