From accbdea3b3ad704f781550147f154783c972db12 Mon Sep 17 00:00:00 2001 From: NatanTourne <71643946+NatanTourne@users.noreply.github.com> Date: Mon, 3 Jan 2022 01:24:14 +0100 Subject: [PATCH 1/8] Add files via upload --- notebook/project.jl | 79 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 notebook/project.jl diff --git a/notebook/project.jl b/notebook/project.jl new file mode 100644 index 00000000..55ec01a7 --- /dev/null +++ b/notebook/project.jl @@ -0,0 +1,79 @@ +### A Pluto.jl notebook ### +# v0.17.3 + +using Markdown +using InteractiveUtils + +# ╔═╡ 132aa06a-a321-4f78-a4a5-b24f02bf9742 +# main loop +function SMA(N, maxt) + + # initialize some things + current_iteration = 0 + slime_list = [(1,1) for k in 1:N] # initialize slimes with position, change to more usefull default values. + fitness_list = [0 for k in 1:N] + weight_list = [0 for k in 1:N] + p_list = [0 for k in 1:N] + + # keep going until max iterations + while current_iteration < maxt + current_iteration += 1 + + # cycle through all the different slimes + for s in 1:N + fitness_list[s] = + weight_list[s] = + end + + # update p, vb and vc + a = atanh(-(current_iteration / maxt) + 1) + b = 1 - (current_iteration + 1) / maxt + DF = max(fitness_list) + for s in 1:N # mooier doen met list comprehension? + p_list = tanh(fitness_list - DF) + end + + # update positions + # om animatie te maken (of iets visueel te doen) best alle tussentijdse posities opslaan? Hoe? dump naar file? of gewoon in memory? + for s in 1:N + slime_list[s] = + end + end + return Xb, bestFitness +end + +# ╔═╡ 5e62b60e-6c00-11ec-34fa-4b57e5168947 +# fitness weight of slime mold +function W() + + +end + +# ╔═╡ 31e9357a-d037-41f5-8eac-2f7cc0089ed1 +# fitness function +function S() + + +end + +# ╔═╡ 18212ee5-c042-4956-995d-375b90f90840 +# update location +function X_update() + + +end + +# ╔═╡ 70fce88d-210f-41a1-9be4-bb4b91a480a8 +[(1,1) for k in 1:10] + +# ╔═╡ 26dc9cc9-bbbf-45d6-8ebd-67c22d580108 +# HOE VISUALISATION? +# makie package? + +# ╔═╡ Cell order: +# ╠═132aa06a-a321-4f78-a4a5-b24f02bf9742 +# ╠═5e62b60e-6c00-11ec-34fa-4b57e5168947 +# ╠═31e9357a-d037-41f5-8eac-2f7cc0089ed1 +# ╠═18212ee5-c042-4956-995d-375b90f90840 +# ╠═70fce88d-210f-41a1-9be4-bb4b91a480a8 +# ╠═26dc9cc9-bbbf-45d6-8ebd-67c22d580108 From 8ffa3a0c5c4442d67a951735756f6296852d23e9 Mon Sep 17 00:00:00 2001 From: NatanTourne <71643946+NatanTourne@users.noreply.github.com> Date: Thu, 27 Jan 2022 19:20:15 +0100 Subject: [PATCH 2/8] Add files via upload --- notebook/project.jl | 2390 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 2342 insertions(+), 48 deletions(-) diff --git a/notebook/project.jl b/notebook/project.jl index 55ec01a7..f887da8b 100644 --- a/notebook/project.jl +++ b/notebook/project.jl @@ -4,76 +4,2370 @@ using Markdown using InteractiveUtils -# ╔═╡ 132aa06a-a321-4f78-a4a5-b24f02bf9742 -# main loop -function SMA(N, maxt) - - # initialize some things - current_iteration = 0 - slime_list = [(1,1) for k in 1:N] # initialize slimes with position, change to more usefull default values. - fitness_list = [0 for k in 1:N] - weight_list = [0 for k in 1:N] - p_list = [0 for k in 1:N] - - # keep going until max iterations - while current_iteration < maxt - current_iteration += 1 - - # cycle through all the different slimes +# This Pluto notebook uses @bind for interactivity. When running this notebook outside of Pluto, the following 'mock version' of @bind gives bound variables a default value (instead of an error). +macro bind(def, element) + quote + local iv = try Base.loaded_modules[Base.PkgId(Base.UUID("6e696c72-6542-2067-7265-42206c756150"), "AbstractPlutoDingetjes")].Bonds.initial_value catch; b -> missing; end + local el = $(esc(element)) + global $(esc(def)) = Core.applicable(Base.get, el) ? Base.get(el) : iv(el) + el + end +end + +# ╔═╡ 0efef0ae-1de8-40e0-b689-e473ef9183e8 +using Random, Distributions, PlutoUI, StatsBase, Plots + +# ╔═╡ 40272dcb-7ff1-4a5d-b201-9dc548d81d8c +md""" +# Slime Mould Algorithm +## The Slime Mold +### Background +Slime Molds are a group of **Amoebozoa** (protists) classified under the infraphylum **Mycetozoa**, although the term has been used less strictly in the past. Within this group, there are three classes: **Myxogastria, Dictyosteliida, and Protosteloids**. (This classification is still disputed and likely to change.) + +Slime molds are noted because of their special characteristics. Slime molds from the Protosteloids group are amoebae capable of making fruiting bodies and spores. Species from the group Dicotyosteliida are referred to as **cellular** slime molds. When food is available they feed and divide as normal unicellular amoebae. However, when food becomes limited these individuals aggregate to form a **pseudoplasmodium** or **grex**. This multicellular complex can then move like a slug with a greatly increases capacity to migrate. When conditions are suitable this grex differentiates further into a **sorocarp** or fruiting body used to spread spores. This unique life cycle (shown in the figure) challenges the concepts of unicellularity, multicellularity, and what makes up an individual. + + +![Dictyostelium Life Cycle](https://upload.wikimedia.org/wikipedia/commons/thumb/8/81/Dicty_Life_Cycle_H01.svg/1024px-Dicty_Life_Cycle_H01.svg.png) + + +Lastly, the species in the group of Myxogastria are known as **acellular** slime molds. They can have multiple different morphological phases like microscopic individual cells, and fruiting bodies, but they are most recognized in their slimy amorphous form shown in the figure. Despite their ability to grow to a size of up to a meter and weigh multiple kg's, they are still made up of only a single cell. **Physarum polycephalum**, a species from this last group, will be the focus of this work. + +![slime](https://upload.wikimedia.org/wikipedia/commons/6/6d/Physarum_polycephalum_plasmodium.jpg) + +### Problem Solving +**Physarum polycephalum** has complex behavior and seems to be able to solve complex problems despite being only a single cell and lacking any kind of neurons let alone a brain. + +VOORBEELDEN VAN PROBLEMEN OPGELOST DOOR SLIME MOLD + +VOORBEELD HET PULSEREND GEDRAG + +## Slime Mold Algorithm +### Algorithms Inspired By Biology + +UITLEGGEN WANNEER NORMALE ALGORITHME FALEN EN WAAROM DAN NATUUR GEINSPIEERDE DINGEN HANDIG KUNNEN ZIJN! + +Closed-form solutions, gradient descent algorithms, deterministic algorithms, etc are very useful and efficient in solving a certain set of problems. These are mostly linear problems with a known solution space. However, when confronted with non-linear real-world challenges where the solutions space and gradient information is unknown these algorithms struggle. Organisms in nature have been solving complex problems for millions of years without the use of complex mathematics, closed-form solutions, or deterministic algorithms. Consequently, many metaheuristic algorithms have been created that are inspired by natural phenomena. Examples include: genetic algorithms, neural networks, evolutionary programming, etc however the focus of this work will be on intelligent swarm-based techniques. These techniques rely on the collective behavior of multiple intelligent entities for problem-solving. Some examples include: + +-Particle Swarm Optimization + +-Fruit Fly Optimization + +-Ant Colony Optimization + +-Artificial Bee Colony + +DAT VAN DIE TWEE FASES + ++ GEWOON ALGEMEEN VEEL BETER UITLEGGEN.................... + + + + +""" + +# ╔═╡ 55d82d37-b380-44a5-a234-504329b58e3f +md""" +### Mathematical Basis +NOG ZEGGEN OP WELKE PAPER GEBASSEERD ENZO + +The main principles of the SMA are shown in the following figure (From the original paper): +![SMA](https://upload.wikimedia.org/wikipedia/commons/1/13/Slime_mould_algorithm_logic.png) + +As can be seen, the model shows three different modes of behavior: Wrapping Food, Approaching Food, and Finding Food. The equations for these different behaviors are shown below. + +**Finding Food:** + +$\overrightarrow{X(t+1)} = rand(UB-LB) + LB$ + +Where *UB* and *LB* represent the upper and lower boundaries for the search parameters. When this mode is used the individual is placed at a random location in the solution space. This provides a random sampling of the design space. + +**Approaching Food:** + +$\overrightarrow{X(t+1)} = \overrightarrow{X_b(t)} +\overrightarrow{vb}(W \times \overrightarrow{X_A(t)} -\overrightarrow{X_B(t)})$ + +Where $\overrightarrow{X_b}$ is the location of the individual with the best fitness score, $\overrightarrow{X_A}$ and $\overrightarrow{X_B}$ are random individuals from the population, W is the weight of the slime mold and $\overrightarrow{vb}$ is an occilating function (see further). W is calculated using the following equation: +```math +\overrightarrow{W}= +\begin{cases} +1 + r \times log\left(\dfrac{bF-S(i)}{bF-wF} +1\right) & \quad \text{Half of population with best Fitness}\\ +1 - r \times log\left(\dfrac{bF-S(i)}{bF-wF} +1\right) & \quad \text{Other} +\end{cases} +``` + +With *bF* and *wF* the best and worst fitness of the current generation, *S(i)* the fitness of the current individual and *r* an oscillating function (see further). + + +**Wrapping Food:** + +$\overrightarrow{X(t+1)} = \overrightarrow{vc} \times \overrightarrow{X(t)}$ + +Where $\overrightarrow{vc}$ is an oscillating function (see further). + +Which of these modes of behavior is used depends on two stochastic decisions. First **$rand < z$**, where rand is a random value between [0,1] and z is a preset variable, is used to decide between the *Finding Food* mode and the other two modes. If this condition is not satisfied $r < p$ is used to decide between the *Approaching Food* and *Wrapping Food* modes. Here *r* is a value between [0,1] and *p* is calculated using the following formula: + +$p = tanh|S(i) - DF|$ + +Where S(i) is the fitness of the individual and DF is the best fitness over all generations. The reasoning behind this decision boundary is illustrated in the figure below. +""" + +# ╔═╡ fb5e61c6-aae4-42c1-a088-ce87afe3ea01 +begin + plot(-10:0.1:10, [tanh(i) for i in -10:0.1:10], lw = 2, label = "tanh()") + plot!(-10:0.1:10, [tanh(abs(i)) for i in -10:0.1:10], lw = 2, line=([:dot],5), + label = "tanh(abs())") +end + +# ╔═╡ f614543b-ccea-401e-a0ad-a74eb9076b40 +md""" +When the fitness of the individual is far from DF (best fitness over all generations) the factor *p* will quickly approach 1. Consequently, the chance of satisfying $r < p$ becomes increasingly large and the position of $\overrightarrow{X(t)}$ will be updated according to the position of $\overrightarrow{X_b}$ (*Approaching Food* mode)(and an oscillating impact of $\overrightarrow{X_A}$ and $\overrightarrow{X_B}$) more often than according to its own position (*Wrapping Food* mode). + +This is further illustrated by the interactive figure below. This figure shows the chance of a certain behavioral mode being chosen according to the fitness of the individual relative to best fitness over all generations. +""" + +# ╔═╡ 664dd767-0469-4118-9a28-c5be0271c374 +begin + z_slider = @bind d_z Slider(1:100, default = 30) + lb_slider = @bind d_lb Slider(-100:-1, default = -1, show_value=true) + ub_slider = @bind d_ub Slider(1:100, default = 7, show_value=true) + s_slider = @bind d_s Slider(-100:100, default = 2, show_value=true) + + md""" + z: $(z_slider) + + Lower Bound: $(lb_slider) + + Upper Bound: $(ub_slider) + + DF: $(s_slider) + + """ + +end + +# ╔═╡ 8b78148a-2dbb-49c1-830c-1d770514a10e +begin + + plot(d_lb:((d_ub-d_lb)/1000):d_ub, + [1 for i in d_lb:((d_ub-d_lb)/1000):d_ub], + ylims= (0,1), + xlims= (d_lb,d_ub), + fill = (0, :green), + label = "Finding Food") + + plot!(d_lb:((d_ub-d_lb)/1000):d_ub, + [(1 - d_z/1000) for i in d_lb:((d_ub-d_lb)/1000):d_ub], + ylims= (0,1), + xlims= (d_lb,d_ub), + fill = (0, :lightblue), + label = "Wrapping Food") + + plot!(d_lb:((d_ub-d_lb)/1000):d_ub, + [tanh(abs(i-d_s))*(1-(d_z/1000)) for i in d_lb:((d_ub-d_lb)/1000):d_ub], + ylims= (0,1), + xlims= (d_lb,d_ub), + fill = (0, :orange), + label = "Approaching Food", + xlabel = "Fitness", + ylabel = "Chance") + vline!([d_s], lw = 3, label = "DF", color = [:red]) +end + +# ╔═╡ fd57b639-eed9-4849-b2f7-6f8a57aaa468 +md""" +Below a similar graph is made but this time in function of the distance in one-dimensional space instead of the fitness. The fitness function itself is also shown. + +""" + +# ╔═╡ 7e9ea8b0-a2e9-442a-80c6-812160766196 +md""" +It can be seen that the chance of displaying *Wrapping Food* behavior is small until a local or global minimum is near. Each time the fitness function reaches near a minimum, individuals at this location are likely to display *Wrapping Food* behavior, where oscillating changes to the location are made to finetune the fit. + +The full equation for the locations is as follows: +```math +\overrightarrow{X(t+1)}= +\begin{cases} +rand(UB-LB) + LB & \quad \text{$rand < z$}\\ +\overrightarrow{X_b(t)} +\overrightarrow{vb}(W \times \overrightarrow{X_A(t)} -\overrightarrow{X_B(t)}) & \quad \text{$r < p$} \\ +\overrightarrow{vc} \times \overrightarrow{X(t)} & \quad \text{$r \geq p$} +\end{cases} +``` + +""" + +# ╔═╡ 55be43e0-f38e-4d28-a89d-af250bc60852 +md""" +Slime molds are able to accomplish much of their complex behavior because of the oscillation of their membranes. Or more accurately, because of the changes to the oscillation based on their environment. SMA tries to replicate some of these advantages by using multiple oscillating functions. Specifically the functions $\overrightarrow{vb}$, $\overrightarrow{vc}$ and $W$. The equations for $\overrightarrow{vb}$ and $\overrightarrow{vc}$ are as follows: + +$\overrightarrow{vb} = \left[-arctanh(-\left(\dfrac{t}{max_t}\right) + 1), arctanh(-\left(\dfrac{t}{max_t}\right) + 1)\right]$ + +$\overrightarrow{vc} = \left[-(1-\left(\dfrac{t}{max_t}\right)), 1-\left(\dfrac{t}{max_t}\right)\right]$ + +Where *t* is the current generation and *max_t* is the maximum amount of generations. + +The figure below shows the behavior of these two functions when sampling a single point for each generation. + + +""" + +# ╔═╡ ed971d92-5489-4237-915d-ef89e66c66f8 +plot( + [1:1000], + [ + [rand(Uniform(-atanh(-(s / 1001) + 1),atanh(-(s / 1001) + 1))) for s in 1:1000], + [rand(Uniform(-(1 - (s/1001)),(1 - (s/1001)))) for s in 1:1000] + ], + label = ["vb" "vc"], + xlabel = "Generation", + ylabel = "variation", + title = "Oscillating functions" +) + +# ╔═╡ 6da844ef-1900-4556-9318-01cc257bc05e +md""" +From this figure, it is clear that the behavior is not only modified by the fitness but also by the current generation relative to the maximum amount of generations. In early generations, the behavior is more erratic with higher oscillations. This results in a wider exploration of the solution space. In later generations, the oscillation decreases, and the changes to the locations will be smaller and trend more towards the (local) optima. + +*r* in the formula for $W$ is a random sampling for the following interval: + +$r = \left[0, 1\right]$ + +Unlike the other oscillating mechanisms, this oscillation is not modulated by the generation. Instead, it is modified by the fitness of the current individual in the formula for W. +""" + +# ╔═╡ 91106045-43a1-427c-a300-e5200ad112ff +md""" +The algorithm itself was implemented mostly according to the following pseudocode (from the original paper): + + + Initialize Population Size: N, Maximum Iterations: max_t; + Initialize positions of individuals X_i(i = 1,2,...,N); + While t < max_t) + -Calculate fitness of all Slime Molds + -update bF, X_b + -Calculate W + For each Individual + -update p, vb, vc + -update position + End For + t = t + 1 + End While + Return bF, Xb: + + +""" + +# ╔═╡ 8663be81-9919-46a8-977a-1c11bbed0f73 +md""" +#### ⚠️Modifications to the original method⚠️ +I was confused that the original paper uses the above formulas to calculate the new locations instead of using the results as a search direction for the individuals. In order to make sure I understood the method correctly I looked at the original Python and Matlab implementation of the algorithm by the original authors. This confirmed that the results of these formulas should indeed be used as the new locations. This is a strange decision for a number of reasons. + +-First, when displaying the *Wrapping Food* behavioral mode the location is meant to be oscillated by *vc*. However, *vc* approaches 0 in later generations which means that the *wrapping food* formula doesn't oscillate around the original point, but oscillates between the original location and zero. This gives the algorithm a tendency towards zero. This effect is masked by the fact that many of the benchmark functions have their optimal value at 0. Below, I tested this original implementation with a fitness function with an optimum at a different location. It can be seen that there is often a stray population of individuals around 0, which is not even a local optimum in this case. The original paper included a figure of the search history using the same fitness function but using two dimensions. This figure shows a similar renegade population around 0. + +-Second, the formula used in *Approaching food* uses the *W*eight (related to fitness) of the individual in the formula. However, the original location, for which the weight was calculated, is not used. Instead, the fitness of the location is used to modulate how far from the location with the best fitness the new location is. + +**Modifications:** +The first (and main) problem could be solved by changing the formula for *Wrapping Food* to the following: + +$\overrightarrow{X(t+1)} = \overrightarrow{X(t)} + \overrightarrow{vc} \times \overrightarrow{X(t)}$ + +I did test this, and the issue seemed to be resolved. (Not shown) However, in order to also incorporate the fitness information and to make the mechanism of the algorithm more intuitive I made further modifications. Instead of using the resulting locations as the new location directly, they are treated as target points. The vector needed to move the old location to the new location is then calculated. The fitness is used to determine how far along this vector the individual should move. I used p (see earlier) as this factor. This is an arbitrary choice made to not introduce additional complexity. In reality, this is likely not the best function and different options should be tested before a definite implementation is made. *p* approaches 1 very quickly when the location deviates from the optimum. As a result, the new positions for individuals with low fitness will be close to the values attained without using this additional modification. Additionally, it is likely a good idea to also introduce stochastic behavior in this step. Optimally each step should be modulated by a scaling factor relative to the fitness and an oscillating function modulated by the iteration. Currently, the new locations are calculated using the following approach: + +```math +\overrightarrow{X_{virtual}}= +\begin{cases} +rand(UB-LB) + LB & \quad \text{$rand < z$}\\ +\overrightarrow{X_b(t)} +\overrightarrow{vb}(W \times \overrightarrow{X_A(t)} -\overrightarrow{X_B(t)}) & \quad \text{$r < p$} \\ +\overrightarrow{X(t)} + \overrightarrow{vc} \times \overrightarrow{X(t)} & \quad \text{$r \geq p$} +\end{cases} +``` + +```math +\overrightarrow{X(t+1)} = \overrightarrow{X(t)} + tanh|S(i) - DF| \times (\overrightarrow{X_{virtual}} - \overrightarrow{X(t)}) +``` +Finally, the last modification is the use of the same behavioral mode for every dimension of an individual instead of evaluating the condition for each dimension separately. + + + +""" + +# ╔═╡ 6992e045-0daf-46bf-a17d-62ca7945e4af +md""" +### Implementation +The implementation of the SMA is provided in a hidden cell below. (Expand to view) The data structures, fitness functions, W function, result processing functions, as well as the original implementation of the SMA are provided in the appendix at the bottom of this page. + +""" + +# ╔═╡ 2cb438ee-ae5e-4421-bf5c-369154aaef81 +md""" +### Results +#### 1D Ackley Function +""" + +# ╔═╡ daf5a973-e73e-4a2b-8c6a-15a60f461a07 +md""" +#### More Complex 1D Fitness Function +""" + +# ╔═╡ 787210f9-0ead-481d-a1ba-cc91cc7347cc +md""" +##### My version + +""" + +# ╔═╡ ab416867-38df-466f-a7bf-e36d74070e32 +md""" +##### Original Implementation +""" + +# ╔═╡ af816df6-6212-44bf-9301-a3dc4e7bf764 +md""" +The problem with the original algorithm can be seen very clearly in the bottom two figures for the later generations. A population near 400 is formed where the true optimum lies, however an additional population around 0 can also be seen. + +""" + +# ╔═╡ 094c3ae9-7af0-4dc4-874e-fdad2c18c10d +md""" +## Appendix +""" + +# ╔═╡ 16a13599-bdef-4d23-82e9-905fff10dccc +md""" +### One Dimentional Implementation: +#### Datastructures +""" + +# ╔═╡ d56b8eda-3629-4ed3-9960-0ff1dbf713de +begin + # This structure holds the information of a single generation + struct IterationRecord + iteration::Int + slimes::Vector{Float64} + fitness::Vector{Float64} + DF::Float64 + DF_value::Float64 + bF::Float64 + wF::Float64 + Xb::Float64 + end + + # This structure hold the information of the full algorithm run + struct SolutionRecord + iteration::Vector{Float64} + slimes::Vector{Vector{Float64}} + fitness::Vector{Vector{Float64}} + mean_fitness::Vector{Float64} + DF::Vector{Float64} + DF_value::Vector{Float64} + bF::Vector{Float64} + wF::Vector{Float64} + Xb::Vector{Float64} + end + +end + +# ╔═╡ a2da2e63-26af-4e86-b968-674727484e47 +md""" +#### One Dimentional SMA +""" + +# ╔═╡ f7c5026a-0bd0-428b-a339-dfff7865997d +md""" +#### Help Functions +""" + +# ╔═╡ 280122cc-54ec-4235-821d-815f7ab4f1cc +function ProcessRecordVector(RecordVector) + iterations = [i for i in 1:length(RecordVector)] + DF_vector = [] + DF_value_vector = [] + slimes_vector = [] + fitness_vector = [] + mean_fitness_vector = [] + bF_vector = [] + wF_vector = [] + Xb_vector = [] + for i in 1:length(RecordVector) + push!(DF_vector, RecordVector[i].DF) + push!(DF_value_vector, RecordVector[i].DF_value) + append!(slimes_vector, [RecordVector[i].slimes]) + append!(fitness_vector, [RecordVector[i].fitness]) + push!(mean_fitness_vector, mean(RecordVector[i].fitness)) + push!(bF_vector, RecordVector[i].bF) + push!(wF_vector, RecordVector[i].wF) + push!(Xb_vector, RecordVector[i].Xb) + end + return SolutionRecord(iterations, slimes_vector, fitness_vector, mean_fitness_vector, DF_vector, DF_value_vector, bF_vector, wF_vector, Xb_vector) +end + +# ╔═╡ 5e62b60e-6c00-11ec-34fa-4b57e5168947 +# fitness weight of slime mold +function W(fitness, bF, wF, condition, iteration, max_iteration) + if condition + output = 1 + rand(Uniform(0, 1)) * log10(((bF - fitness)/(bF-wF + 10e-100)) + 1) + else + output = 1 - rand(Uniform(0, 1)) * log10(((bF - fitness)/(bF-wF + 10e-100)) + 1) + end + return output +end + +# ╔═╡ 96233615-fe85-40cf-8a76-303cc67338c4 +function SMA_1D(fitness_function, lb, ub, maxt, N; z=0.03) + slime_list = [rand(lb[1]:ub[1]) for k in 1:N] # initialize slimes with random positions + DF::Float64 = 10e100 + DF_value::Float64 = 1 + iteration_history = Vector{IterationRecord}(undef, maxt) # initialize result vector + for current_iteration in 1:maxt + # calculate fitness + fitness_list = [fitness_function(s) for s in slime_list] + + # update bestFitness Xb, worstFitness and DF + bF, Xb = (findmin(fitness_list)[1], slime_list[findmin(fitness_list)[2]]) + wF = maximum(fitness_list) + if bF < DF + DF = bF + DF_value = Xb + end + + # Calculate the weights + boundary = N/2 + weight_list = [] + for (rank,s) in enumerate(sortperm(fitness_list)) + push!(weight_list, W(fitness_list[s], bF, wF, (rank < boundary), current_iteration, maxt)) + end + + # update p, vb and vc + a = max(atanh(-(current_iteration / maxt) + 1), 10e-100) + b = max((1 - (current_iteration)/maxt), 10e-100) + vb = Uniform(-a,a) + vc = Uniform(-b,b) + + slime_list_temp = [] for s in 1:N - fitness_list[s] = - weight_list[s] = + if rand(Uniform(0, 1)) < z + push!(slime_list_temp, rand(Uniform(lb[1],ub[1]))) + else + if rand(Uniform(0, 1)) < tanh(fitness_list[s] - DF) + Xa, Xb = sample(slime_list, 2, replace = false) + push!(slime_list_temp, clamp(Xb + rand(vb)*(weight_list[s]*Xa - Xb), lb[1], ub[1])) + else + push!(slime_list_temp, clamp(slime_list[s] * rand(vc), lb[1], ub[1])) + end + end + end + iteration_history[current_iteration] = IterationRecord(current_iteration, slime_list, fitness_list, DF, DF_value, bF, wF, Xb) + slime_list = deepcopy(slime_list_temp) + end + + return iteration_history +end + +# ╔═╡ 0762d6d0-31c1-4ae3-b76f-0f6aeb5ed27b +function fitness(solution) + a, b, c = 20, 0.2, 2 * pi + d = length(solution) + sum_1 = -a * exp(-b * sqrt(sum(solution^2) / d)) + sum_2 = exp(sum(cos(c * solution)) / d) + return sum_1 - sum_2 + a + exp(1) +end + +# ╔═╡ a965ba28-6a8a-48a3-a298-db151b7af80b +function fitness_2(solution) + return -solution*sin(sqrt(abs(solution))) +end + +# ╔═╡ 0ab5423b-3e36-4226-a690-e129aaa0f8c8 +begin + local d_lb + local d_ub + local d_s + d_lb = -200 + d_ub = 150 + d_s = fitness_2(0) + p_ex2_1 = plot(d_lb:((d_ub-d_lb)/1000):d_ub, + [1 for i in d_lb:((d_ub-d_lb)/1000):d_ub], + ylims= (0,1), + xlims= (d_lb,d_ub), + fill = (0, :green), + label = "Finding Food") + + p_ex2_1 = plot!(d_lb:((d_ub-d_lb)/1000):d_ub, + [(1 - d_z/1000) for i in d_lb:((d_ub-d_lb)/1000):d_ub], + ylims= (0,1), + xlims= (d_lb,d_ub), + fill = (0, :lightblue), + label = "Wrapping Food") + + p_ex2_1 = plot!(d_lb:((d_ub-d_lb)/1000):d_ub, + [tanh(abs(fitness_2(i)-d_s))*(1-(d_z/1000)) for i in d_lb:((d_ub-d_lb)/1000):d_ub], + ylims= (0,1), + xlims= (d_lb,d_ub), + fill = (0, :orange), + label = "Approaching Food", + title = "Chance Of Behavior", + xlabel = "Location", + ylabel = "Chance") + + + p_ex2_2 = plot( + d_lb:d_ub, + [abs(fitness_2(s)) for s in d_lb:d_ub], + title = "Fitness Function", + xlims= (d_lb,d_ub), + xlabel = "Location", + ylabel = "Fitness") + + + plot(p_ex2_2, p_ex2_1, + layout = (2, 1)) +end + +# ╔═╡ f6e1875e-8780-457b-b7bc-beff24c5ceb9 +md""" +### Multi Dimentional Implementation: +#### Data Structures + +""" + +# ╔═╡ 955d45f8-6040-4904-9fc9-ff13ffa41193 +begin + # This structure holds the information of a single generation + struct IterationRecordMulti + iteration::Int + slimes::Vector{Vector{Float64}} + fitness::Vector{Float64} + DF::Float64 + DF_value::Vector{Float64} + bF::Float64 + wF::Float64 + Xb::Vector{Float64} + end + + # This structure hold the information of the full algorithm run + struct SolutionRecordMulti + iteration::Vector{Float64} + slimes::Vector{Vector{Vector{Float64}}} + fitness::Vector{Vector{Float64}} + mean_fitness::Vector{Float64} + DF::Vector{Float64} + DF_value::Vector{Vector{Float64}} + bF::Vector{Float64} + wF::Vector{Float64} + Xb::Vector{Vector{Float64}} + end + +end + +# ╔═╡ 4862cfb9-364b-4d34-9a30-38ce48ce069d +function SMA(fitness_function, lb, ub, maxt, N; z=0.03) + slime_array = [rand(lb[d]:ub[d]) for k = 1:N, d = 1:length(lb)] # initialize slimes with random positions + slime_list = [slime_array[i,:] for i in 1:N] # put in list + DF::Float64 = 10e100 + DF_value = [float(1) for i in 1:length(lb)] + iteration_history = Vector{IterationRecordMulti}(undef, maxt) # initialize result vector + for current_iteration in 1:maxt + # calculate fitness + fitness_list = [fitness_function(slime_list[s]) for s in 1:N] + + # update bestFitness Xb, worstFitness and DF + bF, Xb = (findmin(fitness_list)[1], slime_list[findmin(fitness_list)[2]]) + wF = maximum(fitness_list) + if bF < DF + DF = bF + DF_value = Xb + end + + # Calculate the weights + boundary = N/2 + weight_list = [] + for (rank,s) in enumerate(sortperm(fitness_list)) + push!(weight_list, W(fitness_list[s], bF, wF, (rank < boundary), current_iteration, maxt)) end # update p, vb and vc - a = atanh(-(current_iteration / maxt) + 1) - b = 1 - (current_iteration + 1) / maxt - DF = max(fitness_list) - for s in 1:N # mooier doen met list comprehension? - p_list = tanh(fitness_list - DF) - end - - # update positions - # om animatie te maken (of iets visueel te doen) best alle tussentijdse posities opslaan? Hoe? dump naar file? of gewoon in memory? + a = max(atanh(-(current_iteration / maxt) + 1), 10e-100) + b = max((1 - (current_iteration)/maxt), 10e-100) + vb = Uniform(-a,a) + vc = Uniform(-b,b) + + + slime_list_temp = [] for s in 1:N - slime_list[s] = + if rand(Uniform(0, 1)) < z + push!(slime_list_temp, [rand(Uniform(lb[i],ub[i])) for i in 1:length(lb)]) + else + p = tanh(fitness_list[s] - DF) + temp_individual = [] + if rand(Uniform(0, 1)) < p + XA_ID, XB_ID = sample(1:N, 2, replace = false) + temp_individual = clamp(Xb .+ rand(vb, length(ub)).*(weight_list[s] .* slime_list[XA_ID] .- slime_list[XB_ID]), lb, ub) + + else + temp_individual = clamp(slime_list[s] .+ slime_list[s] .* rand(vc, length(ub)), lb, ub) + + end + #(slime_list[s].+tanh(fitness_list[s] - bF).*rand(Uniform(0, 1)).*(temp_individual .- slime_list[s])) + push!(slime_list_temp, slime_list[s].+tanh(fitness_list[s] - bF).*(temp_individual .- slime_list[s])) + end end + iteration_history[current_iteration] = IterationRecordMulti(current_iteration, slime_list, fitness_list, DF, DF_value, bF, wF, Xb) + #slime_list = slime_list .+ 0.5(slime_list .- slime_list_temp) + slime_list = deepcopy(slime_list_temp) end - return Xb, bestFitness + + return iteration_history end -# ╔═╡ 5e62b60e-6c00-11ec-34fa-4b57e5168947 -# fitness weight of slime mold -function W() +# ╔═╡ f13d0c05-44bc-41aa-9476-3f8cd74200f1 +md""" +#### Multi Dimentional SMA + +""" + +# ╔═╡ 5856285d-12a2-40f5-b321-034174ef7e6d +function SMA_Appendix(fitness_function, lb, ub, maxt, N; z=0.03) + slime_array = [rand(lb[d]:ub[d]) for k = 1:N, d = 1:length(lb)] # initialize slimes with random positions + slime_list = [slime_array[i,:] for i in 1:N] # put in list + DF::Float64 = 10e100 + DF_value = [float(1) for i in 1:length(lb)] + iteration_history = Vector{IterationRecordMulti}(undef, maxt) # initialize result vector + for current_iteration in 1:maxt + # calculate fitness + fitness_list = [fitness_function(slime_list[s]) for s in 1:N] + + # update bestFitness Xb, worstFitness and DF + bF, Xb = (findmin(fitness_list)[1], slime_list[findmin(fitness_list)[2]]) + wF = maximum(fitness_list) + if bF < DF + DF = bF + DF_value = Xb + end + + # Calculate the weights + boundary = N/2 + weight_list = [] + for (rank,s) in enumerate(sortperm(fitness_list)) + push!(weight_list, W(fitness_list[s], bF, wF, (rank < boundary), current_iteration, maxt)) + end + + # update p, vb and vc + a = max(atanh(-(current_iteration / maxt) + 1), 10e-100) + b = max((1 - (current_iteration)/maxt), 10e-100) + vb = Uniform(-a,a) + vc = Uniform(-b,b) + + slime_list_temp = [] + for s in 1:N + if rand(Uniform(0, 1)) < z + push!(slime_list_temp, [rand(Uniform(lb[i],ub[i])) for i in 1:length(lb)]) + else + if rand(Uniform(0, 1)) < tanh(fitness_list[s] - DF) + Xa, Xb = sample(slime_list, 2, replace = false) + push!(slime_list_temp, clamp.(Xb .+ rand(vb,length(lb)).*(weight_list[s] .* Xa .- Xb), lb, ub)) + else + push!(slime_list_temp, clamp.(slime_list[s] .* rand(vc,length(lb)), lb, ub)) + end + end + end + iteration_history[current_iteration] = IterationRecordMulti(current_iteration, slime_list, fitness_list, DF, DF_value, bF, wF, Xb) + slime_list = deepcopy(slime_list_temp) + end + + return iteration_history +end + +# ╔═╡ 0cebe58b-f1b2-4220-b15c-0f844cf22057 +function SMA_APPENDIX_2(fitness_function, lb, ub, maxt, N; z=0.03) + slime_array = [rand(lb[d]:ub[d]) for k = 1:N, d = 1:length(lb)] # initialize slimes with random positions + slime_list = [slime_array[i,:] for i in 1:N] # put in list + DF::Float64 = 10e100 + DF_value = [float(1) for i in 1:length(lb)] + iteration_history = Vector{IterationRecordMulti}(undef, maxt) # initialize result vector + for current_iteration in 1:maxt + # calculate fitness + fitness_list = [fitness_function(slime_list[s]) for s in 1:N] + + # update bestFitness Xb, worstFitness and DF + bF, Xb = (findmin(fitness_list)[1], slime_list[findmin(fitness_list)[2]]) + wF = maximum(fitness_list) + if bF < DF + DF = bF + DF_value = Xb + end + + # Calculate the weights + boundary = N/2 + weight_list = [] + for (rank,s) in enumerate(sortperm(fitness_list)) + push!(weight_list, W(fitness_list[s], bF, wF, (rank < boundary), current_iteration, maxt)) + end + + # update p, vb and vc + a = max(atanh(-(current_iteration / maxt) + 1), 10e-100) + b = max((1 - (current_iteration)/maxt), 10e-100) + vb = Uniform(-a,a) + vc = Uniform(-b,b) + + slime_list_temp = [] + for s in 1:N + if rand(Uniform(0, 1)) < z + push!(slime_list_temp, [rand(Uniform(lb[i],ub[i])) for i in 1:length(lb)]) + else + p = tanh(fitness_list[s] - DF) + temp_individual = [] + for dim in 1:length(ub) + if rand(Uniform(0, 1)) < p + XA_ID, XB_ID = sample(1:N, 2, replace = false) + push!(temp_individual, clamp(Xb[dim] + rand(vb)*(weight_list[s] * slime_list[XA_ID][dim] - slime_list[XB_ID][dim]), lb[dim], ub[dim])) + + else + push!(temp_individual, clamp(slime_list[s][dim] * rand(vc), lb[dim], ub[dim])) + + end + end + push!(slime_list_temp, temp_individual) + end + end + iteration_history[current_iteration] = IterationRecordMulti(current_iteration, slime_list, fitness_list, DF, DF_value, bF, wF, Xb) + slime_list = deepcopy(slime_list_temp) + end + + return iteration_history +end + +# ╔═╡ 3f9ee27d-f128-4d42-a144-d3f8856de4d3 +md""" +#### Help Functions +""" + +# ╔═╡ d1dca62c-788e-4d20-a528-dcb8f39a3d53 +function ProcessRecordVectorMulti(RecordVector) + iterations = [i for i in 1:length(RecordVector)] + DF_vector = [] + DF_value_vector = [] + slimes_vector = [] + fitness_vector = [] + mean_fitness_vector = [] + bF_vector = [] + wF_vector = [] + Xb_vector = [] + for i in 1:length(RecordVector) + push!(DF_vector, RecordVector[i].DF) + push!(DF_value_vector, RecordVector[i].DF_value) + append!(slimes_vector, [RecordVector[i].slimes]) + append!(fitness_vector, [RecordVector[i].fitness]) + push!(mean_fitness_vector, mean(RecordVector[i].fitness)) + push!(bF_vector, RecordVector[i].bF) + push!(wF_vector, RecordVector[i].wF) + push!(Xb_vector, RecordVector[i].Xb) + end + return SolutionRecordMulti(iterations, slimes_vector, fitness_vector, mean_fitness_vector, DF_vector, DF_value_vector, bF_vector, wF_vector, Xb_vector) +end + +# ╔═╡ a48e1156-fc46-4b58-b971-9b65b348d64b +function fitness_multi(solution) + a, b, c = 20, 0.2, 2 * pi + d = length(solution) + sum_1 = -a * exp(-b * sqrt(sum(solution.^2) / d)) + sum_2 = exp(sum(cos.(c .* solution)) / d) + return sum_1 - sum_2 + a + exp(1) +end + +# ╔═╡ ab975494-0a3e-46fe-b3cb-74fa87010018 +begin + Ackley_1D_record = SMA(fitness_multi, [-100], [100], 50, 20; z=0.03) + Ackley_1D_results = ProcessRecordVectorMulti(Ackley_1D_record) +end + +# ╔═╡ 1d12c6dd-7f0a-458c-ad43-9ffdc98acf31 +begin + gen_slider = @bind d_gen Slider(1:length(Ackley_1D_results.iteration), default = 5, show_value = true) + md""" + Below is an interactive version of this plot. + + Generation: $(gen_slider) + """ + +end + +# ╔═╡ c9a1e998-a378-4d59-90c5-138257ac439e +begin + local results + local record + local p1, p2, p3, p4 + + results = Ackley_1D_results + record = Ackley_1D_record + + Ackley_1D = @animate for i = 1:length(results.iteration) + p1 = plot( + results.iteration[1:i], + [results.mean_fitness[1:i], results.DF[1:i]], + title ="Fitness Function", + label = ["Mean" "Lowest"], + ylims=(-1, maximum(results.mean_fitness)), + xlims=(0, length(results.iteration)), + lw = 2, + xlabel = "Generation", + ylabel = "Fitness") + + p2 = scatter( + [rand() for j in 1:length(record[1].slimes)], + sort(reduce(vcat,Ackley_1D_record[i].slimes)), + ylims=(-100, 100), + xlims=(0, 1), + title ="Locations in Gen: "*string(i), + xticks = false, + ylabel= "Location", + legend = false) + + p3 = plot( + -100:100, + [fitness_multi([s]) for s in -100:100], + title = "Fitness Function", + xlabel = "Location", + ylabel = "Fitness", + ylim = (-1,20), + legend = false) + p3 = scatter!( + reduce(vcat,Ackley_1D_record[i].slimes), + [fitness_multi(Ackley_1D_record[i].slimes[s]) for s in 1:length(Ackley_1D_record[i].slimes)] + + ) + + p4 = scatter( + results.iteration, + reduce(vcat,transpose.([[results.slimes[row][col][1] for col in 1:length(results.slimes[1])] for row in 1:length(results.slimes)])), + legend = false, + markercolor = [(s == i ? :red : :green) for s in results.iteration], + xlabel = "Generation", + ylabel = "Location", + title = "All Locations") + p4 = vline!([i], lw = 1, color = [:red]) + + plot(p1, p2, p3, p4, + layout = (2, 2)) #"Generation: " * string(i) + + end + + gif(Ackley_1D, fps = 5) +end + +# ╔═╡ 60c3954b-d519-4f2b-9faa-efe85e34f774 +begin + local results + local record + local p1, p2, p3, p4 + local i + i = d_gen + results = Ackley_1D_results + record = Ackley_1D_record + p1 = plot( + results.iteration[1:length(results.iteration)], + [results.mean_fitness[1:length(results.iteration)], results.DF[1:length(results.iteration)]], + title ="Fitness Function", + label = ["Mean" "Lowest"], + ylims=(-1, maximum(results.mean_fitness)), + xlims=(0, length(results.iteration)), + lw = 2, + xlabel = "Generation", + ylabel = "Fitness") + p1 = vline!([i], lw = 1, color = [:red], label = false) + + p2 = scatter( + [rand() for j in 1:length(record[1].slimes)], + sort(reduce(vcat,Ackley_1D_record[i].slimes)), + ylims=(-100, 100), + xlims=(0, 1), + title ="Locations in Gen: "*string(i), + xticks = false, + ylabel= "Location", + legend = false) + + p3 = plot( + -100:100, + [fitness_multi([s]) for s in -100:100], + title = "Fitness Function", + xlabel = "Location", + ylabel = "Fitness", + ylim = (-1,21), + legend = false) + p3 = scatter!( + reduce(vcat,Ackley_1D_record[i].slimes), + [fitness_multi(Ackley_1D_record[i].slimes[s]) for s in 1:length(Ackley_1D_record[i].slimes)] + + ) + + p4 = scatter( + results.iteration, + reduce(vcat,transpose.([[results.slimes[row][col][1] for col in 1:length(results.slimes[1])] for row in 1:length(results.slimes)])), + legend = false, + markercolor = [(s == i ? :red : :green) for s in results.iteration], + xlabel = "Generation", + ylabel = "Location", + title = "All Locations") + p4 = vline!([i], lw = 1, color = [:red]) + + plot(p1, p2, p3, p4, + layout = (2, 2)) #"Generation: " * string(i) + + +end + +# ╔═╡ e6a3536e-dfc1-494b-9b46-c33e22ed79f0 +function fitness_2_multi(solution) + return sum(-solution .* sin.(sqrt.(abs.(solution)))) +end + +# ╔═╡ 72b1f589-cae8-4ffb-a4d7-a50aeb1898ce +begin + f8_1D_record = SMA(fitness_2_multi, [-500], [500], 50, 20; z=0.03) + f8_1D_results = ProcessRecordVectorMulti(f8_1D_record) +end + +# ╔═╡ 79428f16-504e-4551-8289-83e5b86f53e2 +begin + gen_slider2 = @bind d_gen2 Slider(1:length(f8_1D_results.iteration), default = 5, show_value = true) + md""" + Below is an interactive version of this plot. + + Generation: $(gen_slider2) + """ + +end + +# ╔═╡ f595c7ab-5b6e-441a-b7b3-c804e8e0c7ab +begin + local results + local record + local p1, p2, p3, p4 + + results = f8_1D_results + record = f8_1D_record + + f8_1D = @animate for i = 1:length(results.iteration) + p1 = plot( + results.iteration[1:i], + [results.mean_fitness[1:i], results.DF[1:i]], + title ="Fitness Function", + label = ["Mean" "Lowest"], + ylims=(-500, 500), + xlims=(0, length(results.iteration)), + lw = 2, + xlabel = "Generation", + ylabel = "Fitness") + + p2 = scatter( + [rand() for j in 1:length(record[1].slimes)], + sort(reduce(vcat,record[i].slimes)), + ylims=(-500, 500), + xlims=(0, 1), + title ="Locations in Gen: "*string(i), + xticks = false, + ylabel= "Location", + legend = false) + + p3 = plot( + -500:500, + [fitness_2_multi([s]) for s in -500:500], + title = "Fitness Function", + xlabel = "Location", + ylabel = "Fitness", + ylim = (-500,500), + legend = false) + p3 = scatter!( + reduce(vcat,record[i].slimes), + [fitness_2_multi(record[i].slimes[s]) for s in 1:length(record[i].slimes)] + + ) + + p4 = scatter( + results.iteration, + reduce(vcat,transpose.([[results.slimes[row][col][1] for col in 1:length(results.slimes[1])] for row in 1:length(results.slimes)])), + legend = false, + markercolor = [(s == i ? :red : :green) for s in results.iteration], + xlabel = "Generation", + ylabel = "Location", + title = "All Locations") + p4 = vline!([i], lw = 1, color = [:red]) + + plot(p1, p2, p3, p4, + layout = (2, 2)) #"Generation: " * string(i) + + end + + gif(f8_1D, fps = 5) +end + +# ╔═╡ b777ec82-953b-4688-936d-56c61c6794cd +begin + local results + local record + local p1, p2, p3, p4 + local i + i = d_gen2 + results = f8_1D_results + record = f8_1D_record + p1 = plot( + results.iteration[1:length(results.iteration)], + [results.mean_fitness[1:length(results.iteration)], results.DF[1:length(results.iteration)]], + title ="Fitness Function", + label = ["Mean" "Lowest"], + ylims=(-500, 500), + xlims=(0, length(results.iteration)), + lw = 2, + xlabel = "Generation", + ylabel = "Fitness") + p1 = vline!([i], lw = 1, color = [:red], label = false) + + p2 = scatter( + [rand() for j in 1:length(record[1].slimes)], + sort(reduce(vcat,record[i].slimes)), + ylims=(-500, 500), + xlims=(0, 1), + title ="Locations in Gen: "*string(i), + xticks = false, + ylabel= "Location", + legend = false) + + p3 = plot( + -500:500, + [fitness_2_multi([s]) for s in -500:500], + title = "Fitness Function", + xlabel = "Location", + ylabel = "Fitness", + ylim = (-500,500), + legend = false) + p3 = scatter!( + reduce(vcat,record[i].slimes), + [fitness_2_multi(record[i].slimes[s]) for s in 1:length(record[i].slimes)] + + ) + + p4 = scatter( + results.iteration, + reduce(vcat,transpose.([[results.slimes[row][col][1] for col in 1:length(results.slimes[1])] for row in 1:length(results.slimes)])), + legend = false, + markercolor = [(s == i ? :red : :green) for s in results.iteration], + xlabel = "Generation", + ylabel = "Location", + title = "All Locations") + p4 = vline!([i], lw = 1, color = [:red]) + + plot(p1, p2, p3, p4, + layout = (2, 2)) #"Generation: " * string(i) end -# ╔═╡ 31e9357a-d037-41f5-8eac-2f7cc0089ed1 -# fitness function -function S() +# ╔═╡ d8497cde-7c0c-4e7e-91e0-6afb8d8cb411 +begin + f8_1D_record_OG = SMA_APPENDIX_2(fitness_2_multi, [-500], [500], 50, 20; z=0.03) + f8_1D_results_OG = ProcessRecordVectorMulti(f8_1D_record_OG) +end +# ╔═╡ c722ed1a-83dd-4634-ad4c-4d59738db97a +begin + local results + local record + local p1, p2, p3, p4 + + results = f8_1D_results_OG + record = f8_1D_record_OG + f8_1D_OG = @animate for i = 1:length(results.iteration) + p1 = plot( + results.iteration[1:i], + [results.mean_fitness[1:i], results.DF[1:i]], + title ="Fitness Function", + label = ["Mean" "Lowest"], + ylims=(-500, 500), + xlims=(0, length(results.iteration)), + lw = 2, + xlabel = "Generation", + ylabel = "Fitness") + + p2 = scatter( + [rand() for j in 1:length(record[1].slimes)], + sort(reduce(vcat,record[i].slimes)), + ylims=(-500, 500), + xlims=(0, 1), + title ="Locations in Gen: "*string(i), + xticks = false, + ylabel= "Location", + legend = false) + + p3 = plot( + -500:500, + [fitness_2_multi([s]) for s in -500:500], + title = "Fitness Function", + xlabel = "Location", + ylabel = "Fitness", + ylim = (-500,500), + legend = false) + p3 = scatter!( + reduce(vcat,record[i].slimes), + [fitness_2_multi(record[i].slimes[s]) for s in 1:length(record[i].slimes)] + + ) + + p4 = scatter( + results.iteration, + reduce(vcat,transpose.([[results.slimes[row][col][1] for col in 1:length(results.slimes[1])] for row in 1:length(results.slimes)])), + legend = false, + markercolor = [(s == i ? :red : :green) for s in results.iteration], + xlabel = "Generation", + ylabel = "Location", + title = "All Locations") + p4 = vline!([i], lw = 1, color = [:red]) + + plot(p1, p2, p3, p4, + layout = (2, 2)) #"Generation: " * string(i) + + end + + gif(f8_1D_OG, fps = 5) end -# ╔═╡ 18212ee5-c042-4956-995d-375b90f90840 -# update location -function X_update() +# ╔═╡ 61b48e5d-5be4-4f03-9c5e-c2bfc5b6419a +md""" +# HIER ONDER MOET NOG WEG!! + +""" + +# ╔═╡ b29ce423-a267-4290-b31b-e5ef4f64a56d +plot(Test2_results.iteration, [Test2_results.mean_fitness, Test2_results.DF], title = "Fitness", label = ["Mean Fitness of generation" "Lowest Fitness"], lw = 2) + +# ╔═╡ f9548ad3-ce2e-413a-a548-bfe35b7e811f +begin + anim = @animate for i = 1:length(Test2_results.iteration) + plot(Test2_results.iteration[1:i], [Test2_results.mean_fitness[1:i], Test2_results.DF[1:i]], title ="Fitness", label = ["Mean Fitness of generation" "Lowest Fitness"], ylims=(-1, maximum(Test2_results.mean_fitness)), xlims=(0, length(Test2_results.iteration)), lw = 2, xlabel = "Generation", ylabel = "Fitness") + end + + gif(anim, "anim_fps30.gif", fps = 20) +end +# ╔═╡ 192e8eeb-0514-4792-ba60-90f1f3207c0a +begin + anim2 = @animate for i = 1:length(Test2_results.iteration) + scatter([rand() for i in 1:length(Test2_record[1].slimes)], sort(Test2_record[i].slimes), ylims=(-100, 100), xlims=(0, 1), title ="Generation: " * string(i), xticks = false, ylabel= "Location") + end + + gif(anim2, "anim_fps30.gif", fps = 5) +end + +# ╔═╡ e7f7e1d8-bbb0-4f5d-ac95-dec895527a52 +plot([1:1000], [[rand(Uniform(-atanh(-(s / 1001) + 1),atanh(-(s / 1001) + 1))) for s in 1:1000],[rand(Uniform(-(1 - (s/1001)),(1 - (s/1001)))) for s in 1:1000]], label = ["vb" "vc"], xlabel = "Iterations", ylabel = "variation") + + +# ╔═╡ 679beed3-fa57-4bb0-95a8-ca5198f07938 +begin + # maak later zo een fancy struct ding waarbij de fitness locatie etc, allemaal in een datatype zitten, orden dan alles zodat ge niet maximum enzo moet gebruiken maar gewoon 1 en -1 ofzo voor beste en slechtste?? + #call + Random.seed!(124) + lb = [-100] + ub = [100] + problem_size = 1 + + # uit functie + z = 0.01 + N = 20 + maxt = 100 + slime_list = [rand(lb[1]:ub[1]) for k in 1:N] # initialize slimes with position, change to more usefull default values. + DF = 1000 + DF_value = 0 # NOG NIET GEFIXT HIER!!! + weight_list_history = [] + vb_history = [] + vc_history = [] + p_history = [] + + + iteration_history = Vector{IterationRecord}(undef, maxt) + for current_iteration in 1:maxt + global slime_list # WEG DOEN IN FUNCTIE!! + global fitness_list + global DF + # Calculate the fitness of all slime mould + fitness_list = [fitness(s) for s in slime_list] + # update bestFitness Xb + bF, bF_index = findmin(fitness_list) # max fitness + wF = maximum(fitness_list) # worst fitness + Xb = slime_list[bF_index] # location with max fitness + DF = min(bF, DF) + # Calculate the weights + boundary = N/2 + weight_list = [] + for (rank,s) in enumerate(sortperm(fitness_list)) + push!(weight_list, W(fitness_list[s], bF, wF, (rank < boundary), current_iteration, maxt)) + end + append!(weight_list_history, [weight_list]) + # update p, vb and vc + a = max(atanh(-(current_iteration / maxt) + 1), 10e-100) + b = max((1 - (current_iteration)/maxt), 10e-100) + vb = Uniform(-a,a) + vc = Uniform(-b,b) + + slime_list_temp = [] + for s in 1:N + if rand(Uniform(0, 1)) < z + push!(slime_list_temp, rand(Uniform(lb[1],ub[1]))) + else + p_temp = tanh(fitness_list[s] - DF) + push!(p_history, p_temp) + if rand(Uniform(0, 1)) < p_temp + Xa, Xb = sample(slime_list, 2, replace = false) + vb_temp = rand(vb) + push!(vb_history, vb_temp) + push!(slime_list_temp, clamp(Xb + vb_temp*(weight_list[s]*Xa - Xb), lb[1], ub[1])) + else + vc_temp = rand(vc) + push!(vc_history, vc_temp) + push!(slime_list_temp, clamp(slime_list[s] * vc_temp, lb[1], ub[1])) + end + end + end + iteration_history[current_iteration] = IterationRecord(current_iteration, slime_list, fitness_list, DF, DF_value, bF, wF, Xb) + slime_list = deepcopy(slime_list_temp) + end end -# ╔═╡ 70fce88d-210f-41a1-9be4-bb4b91a480a8 -[(1,1) for k in 1:10] +# ╔═╡ 26f3b743-b7a1-43e8-b07f-1b4e3ebb42fb +Test1 = ProcessRecordVector(iteration_history) + +# ╔═╡ 874bcad6-cf73-417a-82e6-093c6bcdd0d8 +md""" +### Different fitness function: +""" + +# ╔═╡ 40167574-d958-49a8-bfcc-59f95f98e7a1 +plot(-500:500, + [fitness_2(s) for s in -500:500], + title = "Fitness Function", + xlabel = "Location", + ylabel = "Fitness") + +# ╔═╡ a071b8d5-f938-42a7-92e6-9883ad90aa09 +begin + Test3_record = SMA_1D(fitness_2, [-500], [500], 100, 20; z=0.03) + Test3_results = ProcessRecordVector(Test3_record) +end + +# ╔═╡ 772f6482-2679-4672-97f5-96468c468f68 +begin + anim4 = @animate for i = 1:length(Test3_results.iteration) + p1 = plot( + Test3_results.iteration[1:i], + [Test3_results.mean_fitness[1:i], Test3_results.DF[1:i]], + title ="Fitness", + label = ["Mean" "Lowest"], + ylims=(minimum(Test3_results.DF)-100, maximum(Test3_results.mean_fitness)), + xlims=(0, length(Test3_results.iteration)), + lw = 2, + xlabel = "Generation", + ylabel = "Fitness") + + p2 = scatter( + [rand() for i in 1:length(Test3_record[1].slimes)], + sort(Test3_record[i].slimes), + ylims=(-500, 500), + xlims=(0, 1), + title ="Slime Location per Generation", + xticks = false, + ylabel= "Location") + + p3 = plot( + -500:500, + [fitness_2(s) for s in -500:500], + title = "Fitness Function", + xlabel = "Location", + ylabel = "Fitness") + + p4 = scatter( + Test3_results.iteration, + reduce(vcat,transpose.(Test3_results.slimes)), + legend = false, + markercolor = [(s == i ? :red : :green) for s in Test3_results.iteration], + xlabel = "Generation", + ylabel = "Location", + title = "Slime Location") + p4 = plot!(Test3_results.iteration, [-418.9829 for i in Test3_results.iteration]) + + plot(p1, p2, p3, p4, + layout = (2, 2)) #"Generation: " * string(i) + + end + + gif(anim4, "anim4.gif", fps = 5) +end + +# ╔═╡ 3762e4c0-63a5-40d3-beab-0db781d83af0 + + +# ╔═╡ fff32e43-8c5c-416f-9734-b356478d17ab +md""" +## Multidimentional implementation + +""" + +# ╔═╡ e4c3ed05-38ef-4440-82ac-c2a41616ad12 +begin + lb_2 = [-10, -100] + ub_2 = [10, 100] + teeest = [rand(lb_2[d]:ub_2[d]) for k = 1:N, d = 1:length(lb_2)] +end + +# ╔═╡ 8a7a9e2a-ad0a-4996-9057-ccc05d5ff577 +teeest2 = [teeest[i,:] for i in 1:N] + +# ╔═╡ 83011d1f-d9c7-472e-b9b3-98b11a072df5 +begin + multi1_record = SMA(fitness_multi, [-100], [100], 50, 10; z=0.03) + multi1_result = ProcessRecordVectorMulti(multi1_record) +end + +# ╔═╡ a476cff9-e37d-4e21-a205-6b003bd04c62 +plot(multi1_result.iteration, [multi1_result.mean_fitness, multi1_result.DF], title = "Fitness", label = ["Mean Fitness of generation" "Lowest Fitness"], lw = 2) + +# ╔═╡ 00000000-0000-0000-0000-000000000001 +PLUTO_PROJECT_TOML_CONTENTS = """ +[deps] +Distributions = "31c24e10-a181-5473-b8eb-7969acd0382f" +Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" + +[compat] +Distributions = "~0.25.41" +Plots = "~1.25.6" +PlutoUI = "~0.7.30" +StatsBase = "~0.33.14" +""" + +# ╔═╡ 00000000-0000-0000-0000-000000000002 +PLUTO_MANIFEST_TOML_CONTENTS = """ +# This file is machine-generated - editing it directly is not advised + +[[AbstractPlutoDingetjes]] +deps = ["Pkg"] +git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" +uuid = "6e696c72-6542-2067-7265-42206c756150" +version = "1.1.4" + +[[Adapt]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "af92965fb30777147966f58acb05da51c5616b5f" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "3.3.3" + +[[ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" + +[[Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" + +[[Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" + +[[Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "19a35467a82e236ff51bc17a3a44b69ef35185a2" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.8+0" + +[[Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "4b859a208b2397a7a623a03449e4636bdb17bcf2" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.16.1+1" + +[[ChainRulesCore]] +deps = ["Compat", "LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "54fc4400de6e5c3e27be6047da2ef6ba355511f8" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.11.6" + +[[ChangesOfVariables]] +deps = ["ChainRulesCore", "LinearAlgebra", "Test"] +git-tree-sha1 = "bf98fa45a0a4cee295de98d4c1462be26345b9a1" +uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" +version = "0.1.2" + +[[ColorSchemes]] +deps = ["ColorTypes", "Colors", "FixedPointNumbers", "Random"] +git-tree-sha1 = "6b6f04f93710c71550ec7e16b650c1b9a612d0b6" +uuid = "35d6a980-a343-548e-a6ea-1d62b119f2f4" +version = "3.16.0" + +[[ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "024fe24d83e4a5bf5fc80501a314ce0d1aa35597" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.11.0" + +[[Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "417b0ed7b8b838aa6ca0a87aadf1bb9eb111ce40" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.12.8" + +[[Compat]] +deps = ["Base64", "Dates", "DelimitedFiles", "Distributed", "InteractiveUtils", "LibGit2", "Libdl", "LinearAlgebra", "Markdown", "Mmap", "Pkg", "Printf", "REPL", "Random", "SHA", "Serialization", "SharedArrays", "Sockets", "SparseArrays", "Statistics", "Test", "UUIDs", "Unicode"] +git-tree-sha1 = "44c37b4636bc54afac5c574d2d02b625349d6582" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "3.41.0" + +[[CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" + +[[Contour]] +deps = ["StaticArrays"] +git-tree-sha1 = "9f02045d934dc030edad45944ea80dbd1f0ebea7" +uuid = "d38c429a-6771-53c6-b99e-75d170b6e991" +version = "0.5.7" + +[[DataAPI]] +git-tree-sha1 = "cc70b17275652eb47bc9e5f81635981f13cea5c8" +uuid = "9a962f9c-6df0-11e9-0e5d-c546b8b5ee8a" +version = "1.9.0" + +[[DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "3daef5523dd2e769dad2365274f760ff5f282c7d" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.11" + +[[DataValueInterfaces]] +git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" +uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" +version = "1.0.0" + +[[Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" + +[[DelimitedFiles]] +deps = ["Mmap"] +uuid = "8bb1440f-4735-579b-a4ab-409b98df4dab" + +[[DensityInterface]] +deps = ["InverseFunctions", "Test"] +git-tree-sha1 = "80c3e8639e3353e5d2912fb3a1916b8455e2494b" +uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d" +version = "0.4.0" + +[[Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" + +[[Distributions]] +deps = ["ChainRulesCore", "DensityInterface", "FillArrays", "LinearAlgebra", "PDMats", "Printf", "QuadGK", "Random", "SparseArrays", "SpecialFunctions", "Statistics", "StatsBase", "StatsFuns", "Test"] +git-tree-sha1 = "5863b0b10512ed4add2b5ec07e335dc6121065a5" +uuid = "31c24e10-a181-5473-b8eb-7969acd0382f" +version = "0.25.41" + +[[DocStringExtensions]] +deps = ["LibGit2"] +git-tree-sha1 = "b19534d1895d702889b219c382a6e18010797f0b" +uuid = "ffbed154-4ef7-542d-bbb7-c09d3a79fcae" +version = "0.8.6" + +[[Downloads]] +deps = ["ArgTools", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" + +[[EarCut_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "3f3a2501fa7236e9b911e0f7a588c657e822bb6d" +uuid = "5ae413db-bbd1-5e63-b57d-d24a61df00f5" +version = "2.2.3+0" + +[[Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b3bfd02e98aedfa5cf885665493c5598c350cd2f" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.2.10+0" + +[[FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "b57e3acbe22f8484b4b5ff66a7499717fe1a9cc8" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.1" + +[[FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "Pkg", "Zlib_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "d8a578692e3077ac998b50c0217dfd67f21d1e5f" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.0+0" + +[[FillArrays]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"] +git-tree-sha1 = "8756f9935b7ccc9064c6eef0bff0ad643df733a3" +uuid = "1a297f60-69ca-5386-bcde-b61e274b549b" +version = "0.12.7" + +[[FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "335bfdceacc84c5cdf16aadc768aa5ddfc5383cc" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.4" + +[[Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "21efd19106a55620a188615da6d3d06cd7f6ee03" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.13.93+0" + +[[Formatting]] +deps = ["Printf"] +git-tree-sha1 = "8339d61043228fdd3eb658d86c926cb282ae72a8" +uuid = "59287772-0a20-5a39-b81b-1366585eb4c0" +version = "0.4.2" + +[[FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "87eb71354d8ec1a96d4a7636bd57a7347dde3ef9" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.10.4+0" + +[[FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "aa31987c2ba8704e23c6c8ba8a4f769d5d7e4f91" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.10+0" + +[[GLFW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libglvnd_jll", "Pkg", "Xorg_libXcursor_jll", "Xorg_libXi_jll", "Xorg_libXinerama_jll", "Xorg_libXrandr_jll"] +git-tree-sha1 = "0c603255764a1fa0b61752d2bec14cfbd18f7fe8" +uuid = "0656b61e-2033-5cc2-a64a-77c0f6c09b89" +version = "3.3.5+1" + +[[GR]] +deps = ["Base64", "DelimitedFiles", "GR_jll", "HTTP", "JSON", "Libdl", "LinearAlgebra", "Pkg", "Printf", "Random", "RelocatableFolders", "Serialization", "Sockets", "Test", "UUIDs"] +git-tree-sha1 = "4a740db447aae0fbeb3ee730de1afbb14ac798a1" +uuid = "28b8d3ca-fb5f-59d9-8090-bfdbd6d07a71" +version = "0.63.1" + +[[GR_jll]] +deps = ["Artifacts", "Bzip2_jll", "Cairo_jll", "FFMPEG_jll", "Fontconfig_jll", "GLFW_jll", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Libtiff_jll", "Pixman_jll", "Pkg", "Qt5Base_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "aa22e1ee9e722f1da183eb33370df4c1aeb6c2cd" +uuid = "d2c73de3-f751-5644-a686-071e5b155ba9" +version = "0.63.1+0" + +[[GeometryBasics]] +deps = ["EarCut_jll", "IterTools", "LinearAlgebra", "StaticArrays", "StructArrays", "Tables"] +git-tree-sha1 = "58bcdf5ebc057b085e58d95c138725628dd7453c" +uuid = "5c1252a2-5f33-56bf-86c9-59e7332b4326" +version = "0.4.1" + +[[Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "a32d672ac2c967f3deb8a81d828afc739c838a06" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.68.3+2" + +[[Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "344bf40dcab1073aca04aa0df4fb092f920e4011" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.14+0" + +[[Grisu]] +git-tree-sha1 = "53bb909d1151e57e2484c3d1b53e19552b887fb2" +uuid = "42e2da0e-8278-4e71-bc24-59509adca0fe" +version = "1.0.2" + +[[HTTP]] +deps = ["Base64", "Dates", "IniFile", "Logging", "MbedTLS", "NetworkOptions", "Sockets", "URIs"] +git-tree-sha1 = "0fa77022fe4b511826b39c894c90daf5fce3334a" +uuid = "cd3eb016-35fb-5094-929b-558a96fad6f3" +version = "0.9.17" + +[[HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg"] +git-tree-sha1 = "129acf094d168394e80ee1dc4bc06ec835e510a3" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "2.8.1+1" + +[[Hyperscript]] +deps = ["Test"] +git-tree-sha1 = "8d511d5b81240fc8e6802386302675bdf47737b9" +uuid = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" +version = "0.0.4" + +[[HypertextLiteral]] +git-tree-sha1 = "2b078b5a615c6c0396c77810d92ee8c6f470d238" +uuid = "ac1192a8-f4b3-4bfe-ba22-af5b92cd3ab2" +version = "0.9.3" + +[[IOCapture]] +deps = ["Logging", "Random"] +git-tree-sha1 = "f7be53659ab06ddc986428d3a9dcc95f6fa6705a" +uuid = "b5f81e59-6552-4d32-b1f0-c071b021bf89" +version = "0.2.2" + +[[IniFile]] +deps = ["Test"] +git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8" +uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" +version = "0.5.0" + +[[InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" + +[[InverseFunctions]] +deps = ["Test"] +git-tree-sha1 = "a7254c0acd8e62f1ac75ad24d5db43f5f19f3c65" +uuid = "3587e190-3f89-42d0-90ee-14403ec27112" +version = "0.1.2" + +[[IrrationalConstants]] +git-tree-sha1 = "7fd44fd4ff43fc60815f8e764c0f352b83c49151" +uuid = "92d709cd-6900-40b7-9082-c6be49f344b6" +version = "0.1.1" + +[[IterTools]] +git-tree-sha1 = "fa6287a4469f5e048d763df38279ee729fbd44e5" +uuid = "c8e1da08-722c-5040-9ed9-7db0dc04731e" +version = "1.4.0" + +[[IteratorInterfaceExtensions]] +git-tree-sha1 = "a3f24677c21f5bbe9d2a714f95dcd58337fb2856" +uuid = "82899510-4779-5014-852e-03e436cf321d" +version = "1.0.0" + +[[JLLWrappers]] +deps = ["Preferences"] +git-tree-sha1 = "22df5b96feef82434b07327e2d3c770a9b21e023" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.4.0" + +[[JSON]] +deps = ["Dates", "Mmap", "Parsers", "Unicode"] +git-tree-sha1 = "8076680b162ada2a031f707ac7b4953e30667a37" +uuid = "682c06a0-de6a-54ab-a142-c8b1cf79cde6" +version = "0.21.2" + +[[JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "d735490ac75c5cb9f1b00d8b5509c11984dc6943" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "2.1.0+0" + +[[LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.1+0" + +[[LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "e5b909bcf985c5e2605737d2ce278ed791b89be6" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.1+0" + +[[LaTeXStrings]] +git-tree-sha1 = "f2355693d6778a178ade15952b7ac47a4ff97996" +uuid = "b964fa9f-0449-5b57-a5c2-d3ea65f4040f" +version = "1.3.0" + +[[Latexify]] +deps = ["Formatting", "InteractiveUtils", "LaTeXStrings", "MacroTools", "Markdown", "Printf", "Requires"] +git-tree-sha1 = "a8f4f279b6fa3c3c4f1adadd78a621b13a506bce" +uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" +version = "0.15.9" + +[[LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" + +[[LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" + +[[LibGit2]] +deps = ["Base64", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" + +[[LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" + +[[Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" + +[[Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "0b4a5d71f3e5200a7dff793393e09dfc2d874290" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+1" + +[[Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll", "Pkg"] +git-tree-sha1 = "64613c82a59c120435c067c2b809fc61cf5166ae" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.8.7+0" + +[[Libglvnd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll", "Xorg_libXext_jll"] +git-tree-sha1 = "7739f837d6447403596a75d19ed01fd08d6f56bf" +uuid = "7e76a0d4-f3c7-5321-8279-8d96eeed0f29" +version = "1.3.0+3" + +[[Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c333716e46366857753e273ce6a69ee0945a6db9" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.42.0+0" + +[[Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "42b62845d70a619f063a7da093d995ec8e15e778" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.16.1+1" + +[[Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "9c30530bf0effd46e15e0fdcf2b8636e78cbbd73" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.35.0+0" + +[[Libtiff_jll]] +deps = ["Artifacts", "JLLWrappers", "JpegTurbo_jll", "Libdl", "Pkg", "Zlib_jll", "Zstd_jll"] +git-tree-sha1 = "340e257aada13f95f98ee352d316c3bed37c8ab9" +uuid = "89763e89-9b03-5906-acba-b20f662cd828" +version = "4.3.0+0" + +[[Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "7f3efec06033682db852f8b3bc3c1d2b0a0ab066" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.36.0+0" + +[[LinearAlgebra]] +deps = ["Libdl"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + +[[LogExpFunctions]] +deps = ["ChainRulesCore", "ChangesOfVariables", "DocStringExtensions", "InverseFunctions", "IrrationalConstants", "LinearAlgebra"] +git-tree-sha1 = "e5718a00af0ab9756305a0392832c8952c7426c1" +uuid = "2ab3a3ac-af41-5b50-aa03-7779005ae688" +version = "0.3.6" + +[[Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" + +[[MacroTools]] +deps = ["Markdown", "Random"] +git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.9" + +[[Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" + +[[MbedTLS]] +deps = ["Dates", "MbedTLS_jll", "Random", "Sockets"] +git-tree-sha1 = "1c38e51c3d08ef2278062ebceade0e46cefc96fe" +uuid = "739be429-bea8-5141-9913-cc70e7f3736d" +version = "1.0.3" + +[[MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" + +[[Measures]] +git-tree-sha1 = "e498ddeee6f9fdb4551ce855a46f54dbd900245f" +uuid = "442fdcdd-2543-5da2-b0f3-8c86c306513e" +version = "0.3.1" + +[[Missings]] +deps = ["DataAPI"] +git-tree-sha1 = "bf210ce90b6c9eed32d25dbcae1ebc565df2687f" +uuid = "e1d29d7a-bbdc-5cf2-9ac0-f12de2c33e28" +version = "1.0.2" + +[[Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" + +[[MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" + +[[NaNMath]] +git-tree-sha1 = "f755f36b19a5116bb580de457cda0c140153f283" +uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" +version = "0.3.6" + +[[NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" + +[[Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + +[[OpenLibm_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "05823500-19ac-5b8b-9628-191a04bc5112" + +[[OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "648107615c15d4e09f7eca16307bc821c1f718d8" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "1.1.13+0" + +[[OpenSpecFun_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "13652491f6856acfd2db29360e1bbcd4565d04f1" +uuid = "efe28fd5-8261-553b-a9e1-b2916fc3738e" +version = "0.5.5+0" + +[[Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "51a08fb14ec28da2ec7a927c4337e4332c2a4720" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.2+0" + +[[OrderedCollections]] +git-tree-sha1 = "85f8e6578bf1f9ee0d11e7bb1b1456435479d47c" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.4.1" + +[[PCRE_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b2a7af664e098055a7529ad1a900ded962bca488" +uuid = "2f80f16e-611a-54ab-bc61-aa92de5b98fc" +version = "8.44.0+0" + +[[PDMats]] +deps = ["LinearAlgebra", "SparseArrays", "SuiteSparse"] +git-tree-sha1 = "ee26b350276c51697c9c2d88a072b339f9f03d73" +uuid = "90014a1f-27ba-587c-ab20-58faa44d9150" +version = "0.11.5" + +[[Parsers]] +deps = ["Dates"] +git-tree-sha1 = "92f91ba9e5941fc781fecf5494ac1da87bdac775" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.2.0" + +[[Pixman_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "b4f5d02549a10e20780a24fce72bea96b6329e29" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.40.1+0" + +[[Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "REPL", "Random", "SHA", "Serialization", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" + +[[PlotThemes]] +deps = ["PlotUtils", "Requires", "Statistics"] +git-tree-sha1 = "a3a964ce9dc7898193536002a6dd892b1b5a6f1d" +uuid = "ccf2f8ad-2431-5c83-bf29-c5338b663b6a" +version = "2.0.1" + +[[PlotUtils]] +deps = ["ColorSchemes", "Colors", "Dates", "Printf", "Random", "Reexport", "Statistics"] +git-tree-sha1 = "6f1b25e8ea06279b5689263cc538f51331d7ca17" +uuid = "995b91a9-d308-5afd-9ec6-746e21dbc043" +version = "1.1.3" + +[[Plots]] +deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "GeometryBasics", "JSON", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] +git-tree-sha1 = "db7393a80d0e5bef70f2b518990835541917a544" +uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" +version = "1.25.6" + +[[PlutoUI]] +deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] +git-tree-sha1 = "5c0eb9099596090bb3215260ceca687b888a1575" +uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" +version = "0.7.30" + +[[Preferences]] +deps = ["TOML"] +git-tree-sha1 = "2cf929d64681236a2e074ffafb8d568733d2e6af" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.2.3" + +[[Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" + +[[Qt5Base_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Fontconfig_jll", "Glib_jll", "JLLWrappers", "Libdl", "Libglvnd_jll", "OpenSSL_jll", "Pkg", "Xorg_libXext_jll", "Xorg_libxcb_jll", "Xorg_xcb_util_image_jll", "Xorg_xcb_util_keysyms_jll", "Xorg_xcb_util_renderutil_jll", "Xorg_xcb_util_wm_jll", "Zlib_jll", "xkbcommon_jll"] +git-tree-sha1 = "ad368663a5e20dbb8d6dc2fddeefe4dae0781ae8" +uuid = "ea2cea3b-5b76-57ae-a6ef-0a8af62496e1" +version = "5.15.3+0" + +[[QuadGK]] +deps = ["DataStructures", "LinearAlgebra"] +git-tree-sha1 = "78aadffb3efd2155af139781b8a8df1ef279ea39" +uuid = "1fd47b50-473d-5c70-9696-f719f8f3bcdc" +version = "2.4.2" + +[[REPL]] +deps = ["InteractiveUtils", "Markdown", "Sockets", "Unicode"] +uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + +[[Random]] +deps = ["Serialization"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" + +[[RecipesBase]] +git-tree-sha1 = "6bf3f380ff52ce0832ddd3a2a7b9538ed1bcca7d" +uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" +version = "1.2.1" + +[[RecipesPipeline]] +deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase"] +git-tree-sha1 = "37c1631cb3cc36a535105e6d5557864c82cd8c2b" +uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" +version = "0.5.0" + +[[Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[RelocatableFolders]] +deps = ["SHA", "Scratch"] +git-tree-sha1 = "cdbd3b1338c72ce29d9584fdbe9e9b70eeb5adca" +uuid = "05181044-ff0b-4ac5-8273-598c1e38db00" +version = "0.1.3" + +[[Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "838a3a4188e2ded87a4f9f184b4b0d78a1e91cb7" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.0" + +[[Rmath]] +deps = ["Random", "Rmath_jll"] +git-tree-sha1 = "bf3188feca147ce108c76ad82c2792c57abe7b1f" +uuid = "79098fc4-a85e-5d69-aa6a-4863f24498fa" +version = "0.7.0" + +[[Rmath_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "68db32dff12bb6127bac73c209881191bf0efbb7" +uuid = "f50d1b31-88e8-58de-be2c-1cc44531875f" +version = "0.3.0+0" + +[[SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" + +[[Scratch]] +deps = ["Dates"] +git-tree-sha1 = "0b4b7f1393cff97c33891da2a0bf69c6ed241fda" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.1.0" + +[[Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" + +[[SharedArrays]] +deps = ["Distributed", "Mmap", "Random", "Serialization"] +uuid = "1a1011a3-84de-559e-8e89-a11a2f7dc383" + +[[Showoff]] +deps = ["Dates", "Grisu"] +git-tree-sha1 = "91eddf657aca81df9ae6ceb20b959ae5653ad1de" +uuid = "992d4aef-0814-514b-bc4d-f2e9a6c4116f" +version = "1.0.3" + +[[Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" + +[[SortingAlgorithms]] +deps = ["DataStructures"] +git-tree-sha1 = "b3363d7460f7d098ca0912c69b082f75625d7508" +uuid = "a2af1166-a08f-5f64-846c-94a0d3cef48c" +version = "1.0.1" + +[[SparseArrays]] +deps = ["LinearAlgebra", "Random"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[SpecialFunctions]] +deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] +git-tree-sha1 = "e08890d19787ec25029113e88c34ec20cac1c91e" +uuid = "276daf66-3868-5448-9aa4-cd146d93841b" +version = "2.0.0" + +[[StaticArrays]] +deps = ["LinearAlgebra", "Random", "Statistics"] +git-tree-sha1 = "2884859916598f974858ff01df7dfc6c708dd895" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.3.3" + +[[Statistics]] +deps = ["LinearAlgebra", "SparseArrays"] +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" + +[[StatsAPI]] +git-tree-sha1 = "d88665adc9bcf45903013af0982e2fd05ae3d0a6" +uuid = "82ae8749-77ed-4fe6-ae5f-f523153014b0" +version = "1.2.0" + +[[StatsBase]] +deps = ["DataAPI", "DataStructures", "LinearAlgebra", "LogExpFunctions", "Missings", "Printf", "Random", "SortingAlgorithms", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "51383f2d367eb3b444c961d485c565e4c0cf4ba0" +uuid = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +version = "0.33.14" + +[[StatsFuns]] +deps = ["ChainRulesCore", "InverseFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] +git-tree-sha1 = "bedb3e17cc1d94ce0e6e66d3afa47157978ba404" +uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" +version = "0.9.14" + +[[StructArrays]] +deps = ["Adapt", "DataAPI", "StaticArrays", "Tables"] +git-tree-sha1 = "d21f2c564b21a202f4677c0fba5b5ee431058544" +uuid = "09ab397b-f2b6-538f-b94a-2f83cf4a842a" +version = "0.6.4" + +[[SuiteSparse]] +deps = ["Libdl", "LinearAlgebra", "Serialization", "SparseArrays"] +uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" + +[[TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" + +[[TableTraits]] +deps = ["IteratorInterfaceExtensions"] +git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" +uuid = "3783bdb8-4a98-5b6b-af9a-565f29a5fe9c" +version = "1.0.1" + +[[Tables]] +deps = ["DataAPI", "DataValueInterfaces", "IteratorInterfaceExtensions", "LinearAlgebra", "TableTraits", "Test"] +git-tree-sha1 = "bb1064c9a84c52e277f1096cf41434b675cd368b" +uuid = "bd369af6-aec1-5ad0-b16a-f7cc5008161c" +version = "1.6.1" + +[[Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" + +[[Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" + +[[URIs]] +git-tree-sha1 = "97bbe755a53fe859669cd907f2d96aee8d2c1355" +uuid = "5c2747f8-b7ea-4ff2-ba2e-563bfd36b1d4" +version = "1.3.0" + +[[UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" + +[[Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" + +[[UnicodeFun]] +deps = ["REPL"] +git-tree-sha1 = "53915e50200959667e78a92a418594b428dffddf" +uuid = "1cfade01-22cf-5700-b092-accc4b62d6e1" +version = "0.4.1" + +[[Unzip]] +git-tree-sha1 = "34db80951901073501137bdbc3d5a8e7bbd06670" +uuid = "41fe7b60-77ed-43a1-b4f0-825fd5a5650d" +version = "0.1.2" + +[[Wayland_jll]] +deps = ["Artifacts", "Expat_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "3e61f0b86f90dacb0bc0e73a0c5a83f6a8636e23" +uuid = "a2964d1f-97da-50d4-b82a-358c7fce9d89" +version = "1.19.0+0" + +[[Wayland_protocols_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "66d72dc6fcc86352f01676e8f0f698562e60510f" +uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" +version = "1.23.0+0" + +[[XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] +git-tree-sha1 = "1acf5bdf07aa0907e0a37d3718bb88d4b687b74a" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.9.12+0" + +[[XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "Pkg", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "91844873c4085240b95e795f692c4cec4d805f8a" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.34+0" + +[[Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "5be649d550f3f4b95308bf0183b82e2582876527" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.6.9+4" + +[[Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4e490d5c960c314f33885790ed410ff3a94ce67e" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.9+4" + +[[Xorg_libXcursor_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXfixes_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "12e0eb3bc634fa2080c1c37fccf56f7c22989afd" +uuid = "935fb764-8cf2-53bf-bb30-45bb1f8bf724" +version = "1.2.0+4" + +[[Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fe47bd2247248125c428978740e18a681372dd4" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.3+4" + +[[Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "b7c0aa8c376b31e4852b360222848637f481f8c3" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.4+4" + +[[Xorg_libXfixes_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "0e0dc7431e7a0587559f9294aeec269471c991a4" +uuid = "d091e8ba-531a-589c-9de9-94069b037ed8" +version = "5.0.3+4" + +[[Xorg_libXi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXfixes_jll"] +git-tree-sha1 = "89b52bc2160aadc84d707093930ef0bffa641246" +uuid = "a51aa0fd-4e3c-5386-b890-e753decda492" +version = "1.7.10+4" + +[[Xorg_libXinerama_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll"] +git-tree-sha1 = "26be8b1c342929259317d8b9f7b53bf2bb73b123" +uuid = "d1454406-59df-5ea1-beac-c340f2130bc3" +version = "1.1.4+4" + +[[Xorg_libXrandr_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libXext_jll", "Xorg_libXrender_jll"] +git-tree-sha1 = "34cea83cb726fb58f325887bf0612c6b3fb17631" +uuid = "ec84b674-ba8e-5d96-8ba1-2a689ba10484" +version = "1.5.2+4" + +[[Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "19560f30fd49f4d4efbe7002a1037f8c43d43b96" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.10+4" + +[[Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "6783737e45d3c59a4a4c4091f5f88cdcf0908cbb" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.0+3" + +[[Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "daf17f441228e7a3833846cd048892861cff16d6" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.13.0+3" + +[[Xorg_libxkbfile_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libX11_jll"] +git-tree-sha1 = "926af861744212db0eb001d9e40b5d16292080b2" +uuid = "cc61e674-0454-545c-8b26-ed2c68acab7a" +version = "1.1.0+4" + +[[Xorg_xcb_util_image_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "0fab0a40349ba1cba2c1da699243396ff8e94b97" +uuid = "12413925-8142-5f55-bb0e-6d7ca50bb09b" +version = "0.4.0+1" + +[[Xorg_xcb_util_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxcb_jll"] +git-tree-sha1 = "e7fd7b2881fa2eaa72717420894d3938177862d1" +uuid = "2def613f-5ad1-5310-b15b-b15d46f528f5" +version = "0.4.0+1" + +[[Xorg_xcb_util_keysyms_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "d1151e2c45a544f32441a567d1690e701ec89b00" +uuid = "975044d2-76e6-5fbe-bf08-97ce7c6574c7" +version = "0.4.0+1" + +[[Xorg_xcb_util_renderutil_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "dfd7a8f38d4613b6a575253b3174dd991ca6183e" +uuid = "0d47668e-0667-5a69-a72c-f761630bfb7e" +version = "0.3.9+1" + +[[Xorg_xcb_util_wm_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xcb_util_jll"] +git-tree-sha1 = "e78d10aab01a4a154142c5006ed44fd9e8e31b67" +uuid = "c22f9ab0-d5fe-5066-847c-f4bb1cd4e361" +version = "0.4.1+1" + +[[Xorg_xkbcomp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_libxkbfile_jll"] +git-tree-sha1 = "4bcbf660f6c2e714f87e960a171b119d06ee163b" +uuid = "35661453-b289-5fab-8a00-3d9160c6a3a4" +version = "1.4.2+4" + +[[Xorg_xkeyboard_config_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Xorg_xkbcomp_jll"] +git-tree-sha1 = "5c8424f8a67c3f2209646d4425f3d415fee5931d" +uuid = "33bec58e-1273-512f-9401-5d533626f822" +version = "2.27.0+4" + +[[Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "79c31e7844f6ecf779705fbc12146eb190b7d845" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.4.0+3" + +[[Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" + +[[Zstd_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "cc4bf3fdde8b7e3e9fa0351bdeedba1cf3b7f6e6" +uuid = "3161d3a3-bdf6-5164-811a-617609db77b4" +version = "1.5.0+0" + +[[libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "5982a94fcba20f02f42ace44b9894ee2b140fe47" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.1+0" + +[[libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "daacc84a041563f965be61859a36e17c4e4fcd55" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.2+0" + +[[libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Zlib_jll"] +git-tree-sha1 = "94d180a6d2b5e55e447e2d27a29ed04fe79eb30c" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.38+0" + +[[libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "b910cb81ef3fe6e78bf6acee440bda86fd6ae00c" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+1" + +[[nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" + +[[p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" + +[[x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" -# ╔═╡ 26dc9cc9-bbbf-45d6-8ebd-67c22d580108 -# HOE VISUALISATION? -# makie package? +[[xkbcommon_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg", "Wayland_jll", "Wayland_protocols_jll", "Xorg_libxcb_jll", "Xorg_xkeyboard_config_jll"] +git-tree-sha1 = "ece2350174195bb31de1a63bea3a41ae1aa593b6" +uuid = "d8fb68d0-12a3-5cfd-a85a-d49703b185fd" +version = "0.9.1+5" +""" # ╔═╡ Cell order: -# ╠═132aa06a-a321-4f78-a4a5-b24f02bf9742 +# ╠═0efef0ae-1de8-40e0-b689-e473ef9183e8 +# ╠═40272dcb-7ff1-4a5d-b201-9dc548d81d8c +# ╟─55d82d37-b380-44a5-a234-504329b58e3f +# ╟─fb5e61c6-aae4-42c1-a088-ce87afe3ea01 +# ╟─f614543b-ccea-401e-a0ad-a74eb9076b40 +# ╟─664dd767-0469-4118-9a28-c5be0271c374 +# ╟─8b78148a-2dbb-49c1-830c-1d770514a10e +# ╟─fd57b639-eed9-4849-b2f7-6f8a57aaa468 +# ╟─0ab5423b-3e36-4226-a690-e129aaa0f8c8 +# ╟─7e9ea8b0-a2e9-442a-80c6-812160766196 +# ╟─55be43e0-f38e-4d28-a89d-af250bc60852 +# ╟─ed971d92-5489-4237-915d-ef89e66c66f8 +# ╟─6da844ef-1900-4556-9318-01cc257bc05e +# ╟─91106045-43a1-427c-a300-e5200ad112ff +# ╟─8663be81-9919-46a8-977a-1c11bbed0f73 +# ╟─6992e045-0daf-46bf-a17d-62ca7945e4af +# ╠═4862cfb9-364b-4d34-9a30-38ce48ce069d +# ╟─2cb438ee-ae5e-4421-bf5c-369154aaef81 +# ╠═ab975494-0a3e-46fe-b3cb-74fa87010018 +# ╟─c9a1e998-a378-4d59-90c5-138257ac439e +# ╟─1d12c6dd-7f0a-458c-ad43-9ffdc98acf31 +# ╟─60c3954b-d519-4f2b-9faa-efe85e34f774 +# ╟─daf5a973-e73e-4a2b-8c6a-15a60f461a07 +# ╟─787210f9-0ead-481d-a1ba-cc91cc7347cc +# ╠═72b1f589-cae8-4ffb-a4d7-a50aeb1898ce +# ╟─f595c7ab-5b6e-441a-b7b3-c804e8e0c7ab +# ╟─79428f16-504e-4551-8289-83e5b86f53e2 +# ╟─b777ec82-953b-4688-936d-56c61c6794cd +# ╟─ab416867-38df-466f-a7bf-e36d74070e32 +# ╠═d8497cde-7c0c-4e7e-91e0-6afb8d8cb411 +# ╟─c722ed1a-83dd-4634-ad4c-4d59738db97a +# ╟─af816df6-6212-44bf-9301-a3dc4e7bf764 +# ╟─094c3ae9-7af0-4dc4-874e-fdad2c18c10d +# ╟─16a13599-bdef-4d23-82e9-905fff10dccc +# ╟─d56b8eda-3629-4ed3-9960-0ff1dbf713de +# ╟─a2da2e63-26af-4e86-b968-674727484e47 +# ╟─96233615-fe85-40cf-8a76-303cc67338c4 +# ╟─f7c5026a-0bd0-428b-a339-dfff7865997d +# ╟─280122cc-54ec-4235-821d-815f7ab4f1cc # ╠═5e62b60e-6c00-11ec-34fa-4b57e5168947 -# ╠═31e9357a-d037-41f5-8eac-2f7cc0089ed1 -# ╠═18212ee5-c042-4956-995d-375b90f90840 -# ╠═70fce88d-210f-41a1-9be4-bb4b91a480a8 -# ╠═26dc9cc9-bbbf-45d6-8ebd-67c22d580108 +# ╟─0762d6d0-31c1-4ae3-b76f-0f6aeb5ed27b +# ╠═a965ba28-6a8a-48a3-a298-db151b7af80b +# ╟─f6e1875e-8780-457b-b7bc-beff24c5ceb9 +# ╠═955d45f8-6040-4904-9fc9-ff13ffa41193 +# ╟─f13d0c05-44bc-41aa-9476-3f8cd74200f1 +# ╟─5856285d-12a2-40f5-b321-034174ef7e6d +# ╠═0cebe58b-f1b2-4220-b15c-0f844cf22057 +# ╟─3f9ee27d-f128-4d42-a144-d3f8856de4d3 +# ╠═d1dca62c-788e-4d20-a528-dcb8f39a3d53 +# ╠═a48e1156-fc46-4b58-b971-9b65b348d64b +# ╠═e6a3536e-dfc1-494b-9b46-c33e22ed79f0 +# ╠═61b48e5d-5be4-4f03-9c5e-c2bfc5b6419a +# ╟─b29ce423-a267-4290-b31b-e5ef4f64a56d +# ╠═f9548ad3-ce2e-413a-a548-bfe35b7e811f +# ╠═192e8eeb-0514-4792-ba60-90f1f3207c0a +# ╠═e7f7e1d8-bbb0-4f5d-ac95-dec895527a52 +# ╟─679beed3-fa57-4bb0-95a8-ca5198f07938 +# ╠═26f3b743-b7a1-43e8-b07f-1b4e3ebb42fb +# ╠═874bcad6-cf73-417a-82e6-093c6bcdd0d8 +# ╟─40167574-d958-49a8-bfcc-59f95f98e7a1 +# ╠═a071b8d5-f938-42a7-92e6-9883ad90aa09 +# ╠═772f6482-2679-4672-97f5-96468c468f68 +# ╠═3762e4c0-63a5-40d3-beab-0db781d83af0 +# ╟─fff32e43-8c5c-416f-9734-b356478d17ab +# ╠═e4c3ed05-38ef-4440-82ac-c2a41616ad12 +# ╠═8a7a9e2a-ad0a-4996-9057-ccc05d5ff577 +# ╠═83011d1f-d9c7-472e-b9b3-98b11a072df5 +# ╠═a476cff9-e37d-4e21-a205-6b003bd04c62 +# ╟─00000000-0000-0000-0000-000000000001 +# ╟─00000000-0000-0000-0000-000000000002 From 287fab30dec65d9340633f1add3ddc6bad7f94e9 Mon Sep 17 00:00:00 2001 From: NatanTourne <71643946+NatanTourne@users.noreply.github.com> Date: Thu, 27 Jan 2022 19:21:05 +0100 Subject: [PATCH 3/8] Rename project.jl to SMA.jl --- notebook/{project.jl => SMA.jl} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename notebook/{project.jl => SMA.jl} (100%) diff --git a/notebook/project.jl b/notebook/SMA.jl similarity index 100% rename from notebook/project.jl rename to notebook/SMA.jl From db6e3cbd13b14147ab59f4a8bdb90d4f8b0041f1 Mon Sep 17 00:00:00 2001 From: NatanTourne <71643946+NatanTourne@users.noreply.github.com> Date: Sun, 30 Jan 2022 20:53:44 +0100 Subject: [PATCH 4/8] Add files via upload --- notebook/SMA.jl | 1680 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 1196 insertions(+), 484 deletions(-) diff --git a/notebook/SMA.jl b/notebook/SMA.jl index f887da8b..f9195438 100644 --- a/notebook/SMA.jl +++ b/notebook/SMA.jl @@ -15,16 +15,22 @@ macro bind(def, element) end # ╔═╡ 0efef0ae-1de8-40e0-b689-e473ef9183e8 -using Random, Distributions, PlutoUI, StatsBase, Plots +using Random, Distributions, PlutoUI, StatsBase, Plots, StatsPlots # ╔═╡ 40272dcb-7ff1-4a5d-b201-9dc548d81d8c md""" # Slime Mould Algorithm +**Natan Tourne**\ +**STMO 2021-2022**\ +**Final Project** + +**Note: This notebook takes a few minutes to fully initialize. Some cells have been disabled by default and some values have been lowered to ease this process.** + ## The Slime Mold ### Background Slime Molds are a group of **Amoebozoa** (protists) classified under the infraphylum **Mycetozoa**, although the term has been used less strictly in the past. Within this group, there are three classes: **Myxogastria, Dictyosteliida, and Protosteloids**. (This classification is still disputed and likely to change.) -Slime molds are noted because of their special characteristics. Slime molds from the Protosteloids group are amoebae capable of making fruiting bodies and spores. Species from the group Dicotyosteliida are referred to as **cellular** slime molds. When food is available they feed and divide as normal unicellular amoebae. However, when food becomes limited these individuals aggregate to form a **pseudoplasmodium** or **grex**. This multicellular complex can then move like a slug with a greatly increases capacity to migrate. When conditions are suitable this grex differentiates further into a **sorocarp** or fruiting body used to spread spores. This unique life cycle (shown in the figure) challenges the concepts of unicellularity, multicellularity, and what makes up an individual. +Slime molds are noted because of their special characteristics. Slime molds from the Protosteloids group are amoebae capable of making fruiting bodies and spores. Species from the group Dicotyosteliida are referred to as **cellular** slime molds. When food is available they feed and divide as normal unicellular amoebae. However, when food becomes limited these individuals aggregate to form a **pseudoplasmodium** or **grex**. This multicellular complex can then move like a slug with a greatly increased capacity to migrate. When conditions are suitable this grex differentiates further into a **sorocarp** or fruiting body used to spread spores. This unique life cycle (shown in the figure) challenges the concepts of unicellularity, multicellularity, and what makes up an individual. ![Dictyostelium Life Cycle](https://upload.wikimedia.org/wikipedia/commons/thumb/8/81/Dicty_Life_Cycle_H01.svg/1024px-Dicty_Life_Cycle_H01.svg.png) @@ -35,40 +41,60 @@ Lastly, the species in the group of Myxogastria are known as **acellular** slime ![slime](https://upload.wikimedia.org/wikipedia/commons/6/6d/Physarum_polycephalum_plasmodium.jpg) ### Problem Solving -**Physarum polycephalum** has complex behavior and seems to be able to solve complex problems despite being only a single cell and lacking any kind of neurons let alone a brain. +**Physarum polycephalum** has complex behavior and seems to be able to solve complex problems despite being only a single cell and lacking any kind of neurons let alone a brain. This behavior has been studied thoroughly and has been used to solve multiple real-world problems. A well-known example is the use of P. polycephalum to plan an optimal rail network for Tokyo. +![Tokyo1](https://i.natgeofe.com/n/2ae10c00-c10d-40d4-bfd9-57e1c5f2d12d/Slime_mould-Tokyo.jpg?w=795&h=602.5) +![Tokyo2](https://i.natgeofe.com/n/845a27dc-d800-4998-b0a5-4ff406a5611b/Mould_Tokyo.jpg?w=795&h=473.75) +(**Reference:** Tero et al. 2010. Rules for Biologically Inspired Adaptive Network Design. Science 10.1126/science.1177894) -VOORBEELDEN VAN PROBLEMEN OPGELOST DOOR SLIME MOLD +This complex behavior seems to be mostly possible because of the oscillating behavior of the slime mold's plasma membrane. The organism has rhythmic contractions that are synchronized over the entire organism. This causes streaming of the protoplasm which seems to be the main form of signal transduction. Complex modifications to the oscillating pattern at the periphery when interacting with the environment (for instance food or a harmful chemical) seem to direct the behavior. This system is especially able to deal with multiple food sources and will allocate resources according to food quality. Furthermore, the organism has a form of memory and is able to learn and anticipate periodic events. -VOORBEELD HET PULSEREND GEDRAG +![slime2](https://biohaviour.com/wp-content/uploads/2020/11/SlimeMold.gif) -## Slime Mold Algorithm -### Algorithms Inspired By Biology +**Further reading and sources:** -UITLEGGEN WANNEER NORMALE ALGORITHME FALEN EN WAAROM DAN NATUUR GEINSPIEERDE DINGEN HANDIG KUNNEN ZIJN! +**-**Saigusa et al. 2008. **Amoebae Anticipate Periodic Events.** Phys. Rev. Lett. +10.1103/PhysRevLett.100.018101 -Closed-form solutions, gradient descent algorithms, deterministic algorithms, etc are very useful and efficient in solving a certain set of problems. These are mostly linear problems with a known solution space. However, when confronted with non-linear real-world challenges where the solutions space and gradient information is unknown these algorithms struggle. Organisms in nature have been solving complex problems for millions of years without the use of complex mathematics, closed-form solutions, or deterministic algorithms. Consequently, many metaheuristic algorithms have been created that are inspired by natural phenomena. Examples include: genetic algorithms, neural networks, evolutionary programming, etc however the focus of this work will be on intelligent swarm-based techniques. These techniques rely on the collective behavior of multiple intelligent entities for problem-solving. Some examples include: +**-**Beekman et al. 2015. **Brainless but Multi-Headed: Decision Making by the Acellular Slime Mould Physarum polycephalum.** Journal of Molecular Biology. 10.1016/j.jmb.2015.07.007 --Particle Swarm Optimization +**-**Shirakawa et al. 2011. **An associative learning experiment using the plasmodium of Physarum polycephalum.** Nano Communication Networks. 10.1016/j.nancom.2011.05.002 --Fruit Fly Optimization +**-**Kobayashi et al. 2006. **Mathematical Model for Rhythmic Protoplasmic Movement in the True Slime Mold.** J. Math. Biol. 10.1007/s00285-006-0007-0 --Ant Colony Optimization +**-**Tero et al. 2005. **A coupled-oscillator model with a conservation law for the rhythmic amoeboid movements of plasmodial slime molds.** Physica D: Nonlinear Phenomena. 10.1016/j.physd.2005.01.010 --Artificial Bee Colony +**-**Takagi et al. 2008. **Emergence and transitions of dynamic patterns of thickness oscillation of the plasmodium of the true slime mold Physarum polycephalum.** Physica D: Nonlinear Phenomena. 10.1016/j.physd.2007.09.012 -DAT VAN DIE TWEE FASES +""" -+ GEWOON ALGEMEEN VEEL BETER UITLEGGEN.................... +# ╔═╡ facf73a4-255a-4bf3-baa0-ef20f692e0bd +md""" +## Slime Mold Algorithm +In this notebook, we will explore the concept of a smile mold (or mould) algorithm (**SMA**). Using **Physarum polycephalum** itself to solve problems has already proven useful. The SMA attempts to incorporate some of the defining characteristics of P. polycephalum, in the hope of harnassing the organism's problem-solving prowess to solve a wider field of problems. + +### Algorithms Inspired By Biology +As discussed in the course material closed-form solutions, gradient descent algorithms, deterministic algorithms, etc are very useful and efficient in solving a certain set of problems. These are mostly linear problems with a known solution space. However, when confronted with complex non-linear real-world challenges where the solutions space and gradient information is unknown these algorithms can struggle. Finding a deterministic answer to these problems is often impossible or can take unrealistic amounts of computation. An example is the graph coloring problem from the course. The only way to truly verify which answer is the global optimum is by testing all possible combinations. This quickly becomes unmanageable for complex problems. Consequently, metaheuristic algorithms are often used instead. These algorithms can not guarantee that they find the global optimum, however, they are able to quickly find good solutions. These algorithms often have stochastic elements that provide randomness that can be used to escape local optima and increase the chance of finding the global optimum. Inspiration for such algorithms can often be found in nature. +Organisms in nature have been finding solutions to complex problems for millions of years without the use of deterministic algorithms and complex mathematics. These solutions in nature can sometimes be used directly as is the case in biomimicry. Well-known examples include the shape of high-speed trains inspired by the king fishers' beak and velcro inspired by the seed dispersion mechanism of plants like Arctium lappa ("grote klis" a common plant in Belgium). +Similarly, some algorithms are created by mimicking the behavior of natural species. Mostly swarm-based techniques are used where many individuals interact both with their environment and with the other individuals in the swarm. +These techniques are often inspired by social insects. +Some examples include:\ + -Particle Swarm Optimization\ + -Fruit Fly Optimization\ + -Ant Colony Optimization\ + -Artificial Bee Colony +SMA is such an algorithm. Uniquely, as described above, Physarum polycephalum is actually a single cell despite its sometimes impressive size. Despite this, a swarm-based technique is still used to mimic its behavior. This is actually pretty natural as the slime mold does not possess a central brain. Its intelligence arises in a similar way to the swarm intelligence of social insect species. The different "individuals" in the "population" can actually be understood as different parts of the same slime mold. +(Finally, for completeness, the natural concept of evolution is also used as inspiration for genetic algorithms.) """ # ╔═╡ 55d82d37-b380-44a5-a234-504329b58e3f md""" ### Mathematical Basis -NOG ZEGGEN OP WELKE PAPER GEBASSEERD ENZO +**The algorithm discussed in this notebook was developed by Li et al in 2020. (Reference: Li et al. 2020. Slime mould algorithm: A new method for stochastic optimization. Future Generation Computer Systems. 10.1016/j.future.2020.03.055) This algorithm was implemented in Python by the original authors. However, because of the different design philosophies of Python (object-oriented) and Julia, the implementation is quite different.** + The main principles of the SMA are shown in the following figure (From the original paper): ![SMA](https://upload.wikimedia.org/wikipedia/commons/1/13/Slime_mould_algorithm_logic.png) @@ -112,9 +138,24 @@ Where S(i) is the fitness of the individual and DF is the best fitness over all # ╔═╡ fb5e61c6-aae4-42c1-a088-ce87afe3ea01 begin - plot(-10:0.1:10, [tanh(i) for i in -10:0.1:10], lw = 2, label = "tanh()") - plot!(-10:0.1:10, [tanh(abs(i)) for i in -10:0.1:10], lw = 2, line=([:dot],5), - label = "tanh(abs())") + # tanh() + plot( + -10:0.1:10, + [tanh(i) for i in -10:0.1:10], + lw = 2, + label = "tanh()" + ) + + # tanh(abs()) + plot!( + -10:0.1:10, + [tanh(abs(i)) for i in -10:0.1:10], + lw = 2, + line=([:dot],5), + label = "tanh(abs())", + xlabel = "x", + ylabel = "y" + ) end # ╔═╡ f614543b-ccea-401e-a0ad-a74eb9076b40 @@ -132,16 +173,11 @@ begin s_slider = @bind d_s Slider(-100:100, default = 2, show_value=true) md""" - z: $(z_slider) - - Lower Bound: $(lb_slider) - - Upper Bound: $(ub_slider) - - DF: $(s_slider) - - """ - + z: $(z_slider)\ + Lower Bound: $(lb_slider)\ + Upper Bound: $(ub_slider)\ + DF: $(s_slider)\ + """ end # ╔═╡ 8b78148a-2dbb-49c1-830c-1d770514a10e @@ -218,7 +254,7 @@ plot( ], label = ["vb" "vc"], xlabel = "Generation", - ylabel = "variation", + ylabel = "Variation", title = "Oscillating functions" ) @@ -265,7 +301,7 @@ I was confused that the original paper uses the above formulas to calculate the -Second, the formula used in *Approaching food* uses the *W*eight (related to fitness) of the individual in the formula. However, the original location, for which the weight was calculated, is not used. Instead, the fitness of the location is used to modulate how far from the location with the best fitness the new location is. **Modifications:** -The first (and main) problem could be solved by changing the formula for *Wrapping Food* to the following: +The first point could be solved by changing the formula for *Wrapping Food* to the following: $\overrightarrow{X(t+1)} = \overrightarrow{X(t)} + \overrightarrow{vc} \times \overrightarrow{X(t)}$ @@ -285,6 +321,8 @@ rand(UB-LB) + LB & \quad \text{$rand < z$}\\ ``` Finally, the last modification is the use of the same behavioral mode for every dimension of an individual instead of evaluating the condition for each dimension separately. +The two versions of this algorithm are first visually compared. Later, a simulation study is done to compare the performance and see if these modifications lead to better results. + """ @@ -299,28 +337,136 @@ The implementation of the SMA is provided in a hidden cell below. (Expand to vie # ╔═╡ 2cb438ee-ae5e-4421-bf5c-369154aaef81 md""" ### Results +First, we will look at the behavior of the algorithm in a one-dimensional setting. Working in one dimension makes it easier to visualize the behavior and reduces the computation need, however, the algorithm itself does not have a limit for the dimensions. Later we will also see a two-dimensional example. + +The following fitness functions were used to test the behavior. + +**Ackley Function:** + +$$f(x_0 \cdots x_n) = -20 exp(-0.2 \sqrt{\frac{1}{n} \sum_{i=1}^n x_i^2}) - exp(\frac{1}{n} \sum_{i=1}^n cos(2\pi x_i)) + 20 + e$$ + +With n the amount of dimensions. This function was only used for the 1D setting. + +**$f_8$:** + +$$f_8(x_0 \cdots x_n) = \sum_{i=1}^n ( −x_i \times sin(\sqrt{| x_i |}))$$ + +With n the mount of dimensions. This function was used for both the 1D and 2D settings. This function is called $f_8$ according to the name used in the original paper. This function was selected because it has many local minima and because the global minimum is not located at the origin. This latter characteristic is usefull to show the problem with the original implementation. + +Note that these two fitness functions are symmetric in the dimensions. This is not a requirement and different dimensions can be evaluated using different functions as long as the end procuct of the method is a single fitness value. #### 1D Ackley Function + """ -# ╔═╡ daf5a973-e73e-4a2b-8c6a-15a60f461a07 +# ╔═╡ 0f532a5b-741e-4c7c-8742-6108859ebd58 md""" -#### More Complex 1D Fitness Function +**NOTE: The figures are generated based on a random run of the algorithm. A new solution can be generated by re-running cells like the one below! The results will be slightly different. Running the algorithm multiple times will show the true range of possible behavior.** """ -# ╔═╡ 787210f9-0ead-481d-a1ba-cc91cc7347cc +# ╔═╡ daf5a973-e73e-4a2b-8c6a-15a60f461a07 md""" -##### My version - +#### 1D F8 - with the modified algorithm """ # ╔═╡ ab416867-38df-466f-a7bf-e36d74070e32 md""" -##### Original Implementation +#### 1D F8 - with the original implementation """ # ╔═╡ af816df6-6212-44bf-9301-a3dc4e7bf764 md""" -The problem with the original algorithm can be seen very clearly in the bottom two figures for the later generations. A population near 400 is formed where the true optimum lies, however an additional population around 0 can also be seen. +The problem with the original algorithm becomes very clear when you compare these results with the results of the modified algorithm. Both manage to find the true optimum but for the original implementation, there is an additional population around 0 for later generations. This means that the performance of the algorithm is dependent on the exact fitness function. Simply translating the function along one of the dimensions will cause a different fitness at the origin and change the behavior of the original implementation. It is important to note that it is not necessarily a problem that not all individuals end up in the same local (or global) optimum, only the lowest fitness value for the entire population dictates the performance. We will later look at a simulation study to investigate global performance. + +""" + +# ╔═╡ d0170f42-ce09-41c6-a7e4-86fbca1749ab +md""" +#### 2D F8 - With the modified algorithm +""" + +# ╔═╡ 306f5d53-df88-4af3-bbec-25c947c0cb9f +md""" +Despite the oscillating and stochastic nature of the algorithm, it does sometimes get stuck in local optima. It is advised to look at different runs (by re-running the cell below) to see the full range of behavior. Changing the number of iterations and the population size help avoid this behavior. + +**Note: While the algorithm is very fast, creating the figures takes around 3 minutes on my machine.** +""" + +# ╔═╡ ea6fb2f4-6455-44af-a574-3768bad151a9 +md""" +**The following figures take around 2 minutes to generate each so one has been disable by default to save time.** +""" + +# ╔═╡ bad4cc28-ad6a-4d1e-9b72-642f394f2374 +md""" +#### Comparing performance +In addition to the original implementation and the modified algorithm, a third algorithm was also included in this comparison. This version indicated as "Modified_2" only includes the change to the *Wrapping Food* function without the other modifications. + +**Note: Running these simulations is time-consuming so the default number of iterations is kept very low. This makes loading the notebook easier, however, the results are not representative. Please increase the number of iterations (to at least 1000) for accurate results.** + +""" + +# ╔═╡ c2e2ec60-4433-43b9-b08e-ecb577900bc4 +begin + #@bind SIM1_max_iter NumberField(25:10000, default=25) + SIM1_max_iter_button = @bind SIM1_max_iter_run Button("rerun") + + md""" + ##### Simulation 1 + + **Design Space:** 2D \ + **Range:** -500, 500 \ + **Fitness Function:** F8 \ + **Population:** 50 \ + **Generations:** 50 \ + **Iterations:** $(@bind SIM1_max_iter NumberField(25:10000, default=25)) $(SIM1_max_iter_button) (Only use whole numbers) + """ +end + +# ╔═╡ 6583d269-9eab-4a0c-b81e-a25d18b3a5c8 +SIM1_max_iter[1] + +# ╔═╡ 6fb1c386-ef44-458e-b3f5-8929309758eb +begin + SIM2_max_iter_button = @bind SIM2_max_iter_run Button("rerun") + + md""" + ##### Simulation 2 + + **Design Space:** 15D \ + **Range:** 100, 10000 \ + **Fitness Function:** F8 \ + **Population:** 50 \ + **Generations:** 50 \ + **Iterations:** $(@bind SIM2_max_iter NumberField(25:10000, default=25)) $(SIM2_max_iter_button) (Only use whole numbers) + """ +end + +# ╔═╡ 1b5114d9-37b0-469a-ab16-02574a5803a0 +begin + SIM3_max_iter_button = @bind SIM3_max_iter_run Button("rerun") + + md""" + ##### Simulation 3 + + **Design Space:** 5D \ + **Range:** 100, 1000 \ + **Fitness Function:** F8 \ + **Population:** 50 \ + **Generations:** 500 \ + **Iterations:** $(@bind SIM3_max_iter NumberField(25:10000, default=25)) $(SIM3_max_iter_button) (Only use whole numbers) + """ +end + +# ╔═╡ bfef39eb-e71f-4342-b0b8-6357d00f96c6 +md""" +To further investigate the effect of maxt and the population size, the median fitness was generated for 25 algorithm runs for a number of different maxt and population sizes. **These cells are disabled by default because of the long run time.** + +""" + +# ╔═╡ 67ded75a-be8a-4989-976b-d0d9e6b1a3e1 +md""" +##### Conclusion: +Despite the strange behavior of the original algorithm, it does perform better than the modified version especially when using a large number of generations. The population size seems to have less of an impact. Likely the less erratic behavior of the modified version makes it more likely to get stuck in a local minimum. This is supported by the fact that the performance of the version of the algorithm where only the *Wrapping Food* behavior is modified does not seem to be impacted in a similar way. When fitness is very high (local optimum) the modified version impacts the movement for all behavioral modes. Consequently, the *Searching Food* mode is not allowing a full exploration of the design space. When the amount of generations increases the chance for the original algorithm to escape the local minimum because of this mechanism increases as well. For the modified version, on the other hand, this mechanism is suppressed. It would be interesting to further test the modified version with different modulation of the movement vector. (for instance a different function or excluding *Searching Food* mode from the modulation) It would also be interesting to create a version of the modified algorithm where the behavior decision is made for each dimension separate (as is the case for the other two versions) as this might have an impact as well. """ @@ -329,77 +475,79 @@ md""" ## Appendix """ -# ╔═╡ 16a13599-bdef-4d23-82e9-905fff10dccc +# ╔═╡ f6e1875e-8780-457b-b7bc-beff24c5ceb9 md""" -### One Dimentional Implementation: -#### Datastructures +### Multi Dimentional Implementation: +#### Data Structures + """ -# ╔═╡ d56b8eda-3629-4ed3-9960-0ff1dbf713de +# ╔═╡ 955d45f8-6040-4904-9fc9-ff13ffa41193 begin # This structure holds the information of a single generation - struct IterationRecord + struct IterationRecordMulti iteration::Int - slimes::Vector{Float64} + slimes::Vector{Vector{Float64}} fitness::Vector{Float64} DF::Float64 - DF_value::Float64 + DF_value::Vector{Float64} bF::Float64 wF::Float64 - Xb::Float64 + Xb::Vector{Float64} end # This structure hold the information of the full algorithm run - struct SolutionRecord + struct SolutionRecordMulti iteration::Vector{Float64} - slimes::Vector{Vector{Float64}} + slimes::Vector{Vector{Vector{Float64}}} fitness::Vector{Vector{Float64}} mean_fitness::Vector{Float64} DF::Vector{Float64} - DF_value::Vector{Float64} + DF_value::Vector{Vector{Float64}} bF::Vector{Float64} wF::Vector{Float64} - Xb::Vector{Float64} + Xb::Vector{Vector{Float64}} end end -# ╔═╡ a2da2e63-26af-4e86-b968-674727484e47 +# ╔═╡ f13d0c05-44bc-41aa-9476-3f8cd74200f1 md""" -#### One Dimentional SMA +#### Multi Dimentional SMA + """ -# ╔═╡ f7c5026a-0bd0-428b-a339-dfff7865997d +# ╔═╡ 1a2cc51d-b97f-4192-9284-f94eff0853ba md""" -#### Help Functions +The function below is the original implementation according to the paper. This is not the same as the final version used above! + """ -# ╔═╡ 280122cc-54ec-4235-821d-815f7ab4f1cc -function ProcessRecordVector(RecordVector) - iterations = [i for i in 1:length(RecordVector)] - DF_vector = [] - DF_value_vector = [] - slimes_vector = [] - fitness_vector = [] - mean_fitness_vector = [] - bF_vector = [] - wF_vector = [] - Xb_vector = [] - for i in 1:length(RecordVector) - push!(DF_vector, RecordVector[i].DF) - push!(DF_value_vector, RecordVector[i].DF_value) - append!(slimes_vector, [RecordVector[i].slimes]) - append!(fitness_vector, [RecordVector[i].fitness]) - push!(mean_fitness_vector, mean(RecordVector[i].fitness)) - push!(bF_vector, RecordVector[i].bF) - push!(wF_vector, RecordVector[i].wF) - push!(Xb_vector, RecordVector[i].Xb) - end - return SolutionRecord(iterations, slimes_vector, fitness_vector, mean_fitness_vector, DF_vector, DF_value_vector, bF_vector, wF_vector, Xb_vector) -end +# ╔═╡ 3f9ee27d-f128-4d42-a144-d3f8856de4d3 +md""" +#### Help Functions +""" # ╔═╡ 5e62b60e-6c00-11ec-34fa-4b57e5168947 -# fitness weight of slime mold +""" + W(fitness, bF, wF, condition, iteration, max_iteration) + +Calculates the weight of the current individual + +Inputs: + + - fitness: Fitness of the current individual + - bF: best fitness in the generation + - wF: worst fitness in the generation + - condition: If the individual is in the best or worst halve of the population in terms of fitness + - iteration: the current iteration + - max_iteration: the maximum amount of iterations + +Outputs: + + - output: The weight of the current individual + +""" function W(fitness, bF, wF, condition, iteration, max_iteration) if condition output = 1 + rand(Uniform(0, 1)) * log10(((bF - fitness)/(bF-wF + 10e-100)) + 1) @@ -409,15 +557,39 @@ function W(fitness, bF, wF, condition, iteration, max_iteration) return output end -# ╔═╡ 96233615-fe85-40cf-8a76-303cc67338c4 -function SMA_1D(fitness_function, lb, ub, maxt, N; z=0.03) - slime_list = [rand(lb[1]:ub[1]) for k in 1:N] # initialize slimes with random positions - DF::Float64 = 10e100 - DF_value::Float64 = 1 - iteration_history = Vector{IterationRecord}(undef, maxt) # initialize result vector +# ╔═╡ 4862cfb9-364b-4d34-9a30-38ce48ce069d +""" + SMA(fitness_function, lb, ub, maxt, N; z=0.03) + +The modified Slime Mould Algorithm + +Inputs: + + - fitness_function: The fitness function (takes single coordinate as input with no limit on dimentions) + - lb: lower bound: vector of lower bounds for each dimention + - ub: upper bound: vector of upper bounds for each dimention (should match lb) + - maxt: Maximum number of generations + - N: Population size + - z: Change of searching food behavior (0.03 by default) + +Outputs: + + - iteration_history: contains information on iteration, location of individuals, fitness of individuals, best fitness, worst fitness, best overall fitness for each iteration of the algorithm. + +""" +function SMA(fitness_function, lb, ub, maxt, N; z=0.03) + + # Initialize vectors + slime_array = [rand(lb[d]:ub[d]) for k = 1:N, d = 1:length(lb)] # initialize slimes with random positions + slime_list = [slime_array[i,:] for i in 1:N] # change to a vector of vectors + DF::Float64 = 10e100 # initialize the best fitness + DF_value = [float(1) for i in 1:length(lb)] # Initilize DF result vector + iteration_history = Vector{IterationRecordMulti}(undef, maxt) # initialize result vector + + # cycle through all the generations for current_iteration in 1:maxt # calculate fitness - fitness_list = [fitness_function(s) for s in slime_list] + fitness_list = [fitness_function(slime_list[s]) for s in 1:N] # update bestFitness Xb, worstFitness and DF bF, Xb = (findmin(fitness_list)[1], slime_list[findmin(fitness_list)[2]]) @@ -431,7 +603,17 @@ function SMA_1D(fitness_function, lb, ub, maxt, N; z=0.03) boundary = N/2 weight_list = [] for (rank,s) in enumerate(sortperm(fitness_list)) - push!(weight_list, W(fitness_list[s], bF, wF, (rank < boundary), current_iteration, maxt)) + push!( + weight_list, + W( + fitness_list[s], + bF, + wF, + (rank < boundary), + current_iteration, + maxt + ) + ) end # update p, vb and vc @@ -440,129 +622,71 @@ function SMA_1D(fitness_function, lb, ub, maxt, N; z=0.03) vb = Uniform(-a,a) vc = Uniform(-b,b) + slime_list_temp = [] for s in 1:N if rand(Uniform(0, 1)) < z - push!(slime_list_temp, rand(Uniform(lb[1],ub[1]))) + # Searching Food behavior + push!( + slime_list_temp, + [rand(Uniform(lb[i],ub[i])) for i in 1:length(lb)] + ) else - if rand(Uniform(0, 1)) < tanh(fitness_list[s] - DF) - Xa, Xb = sample(slime_list, 2, replace = false) - push!(slime_list_temp, clamp(Xb + rand(vb)*(weight_list[s]*Xa - Xb), lb[1], ub[1])) + p = tanh(fitness_list[s] - DF) + temp_individual = [] + if rand(Uniform(0, 1)) < p + # Approaching Food behavior + XA_ID, XB_ID = sample(1:N, 2, replace = false) + temp_individual = clamp.(Xb .+ rand(vb, length(ub)).*(weight_list[s] .* slime_list[XA_ID] .- slime_list[XB_ID]), lb, ub) else - push!(slime_list_temp, clamp(slime_list[s] * rand(vc), lb[1], ub[1])) + # Wrapping Food behavior + temp_individual = clamp.(slime_list[s] .+ slime_list[s] .* rand(vc, length(ub)), lb, ub) end + push!(slime_list_temp, slime_list[s].+tanh(fitness_list[s] - bF).*(temp_individual .- slime_list[s])) end end - iteration_history[current_iteration] = IterationRecord(current_iteration, slime_list, fitness_list, DF, DF_value, bF, wF, Xb) + iteration_history[current_iteration] = IterationRecordMulti( + current_iteration, + slime_list, + fitness_list, + DF, DF_value, + bF, wF, Xb + ) slime_list = deepcopy(slime_list_temp) end - return iteration_history end -# ╔═╡ 0762d6d0-31c1-4ae3-b76f-0f6aeb5ed27b -function fitness(solution) - a, b, c = 20, 0.2, 2 * pi - d = length(solution) - sum_1 = -a * exp(-b * sqrt(sum(solution^2) / d)) - sum_2 = exp(sum(cos(c * solution)) / d) - return sum_1 - sum_2 + a + exp(1) -end - -# ╔═╡ a965ba28-6a8a-48a3-a298-db151b7af80b -function fitness_2(solution) - return -solution*sin(sqrt(abs(solution))) -end - -# ╔═╡ 0ab5423b-3e36-4226-a690-e129aaa0f8c8 -begin - local d_lb - local d_ub - local d_s - d_lb = -200 - d_ub = 150 - d_s = fitness_2(0) - p_ex2_1 = plot(d_lb:((d_ub-d_lb)/1000):d_ub, - [1 for i in d_lb:((d_ub-d_lb)/1000):d_ub], - ylims= (0,1), - xlims= (d_lb,d_ub), - fill = (0, :green), - label = "Finding Food") - - p_ex2_1 = plot!(d_lb:((d_ub-d_lb)/1000):d_ub, - [(1 - d_z/1000) for i in d_lb:((d_ub-d_lb)/1000):d_ub], - ylims= (0,1), - xlims= (d_lb,d_ub), - fill = (0, :lightblue), - label = "Wrapping Food") - - p_ex2_1 = plot!(d_lb:((d_ub-d_lb)/1000):d_ub, - [tanh(abs(fitness_2(i)-d_s))*(1-(d_z/1000)) for i in d_lb:((d_ub-d_lb)/1000):d_ub], - ylims= (0,1), - xlims= (d_lb,d_ub), - fill = (0, :orange), - label = "Approaching Food", - title = "Chance Of Behavior", - xlabel = "Location", - ylabel = "Chance") +# ╔═╡ af296256-6662-49e9-b24d-c8550ce39c8d +""" + SMA_APPENDIX_1(fitness_function, lb, ub, maxt, N; z=0.03) +A copy of the modified Slime Mould Algorithm - p_ex2_2 = plot( - d_lb:d_ub, - [abs(fitness_2(s)) for s in d_lb:d_ub], - title = "Fitness Function", - xlims= (d_lb,d_ub), - xlabel = "Location", - ylabel = "Fitness") +Inputs: + - fitness_function: The fitness function (takes single coordinate as input with no limit on dimentions) + - lb: lower bound: vector of lower bounds for each dimention + - ub: upper bound: vector of upper bounds for each dimention (should match lb) + - maxt: Maximum number of generations + - N: Population size + - z: Change of searching food behavior (0.03 by default) - plot(p_ex2_2, p_ex2_1, - layout = (2, 1)) -end +Outputs: -# ╔═╡ f6e1875e-8780-457b-b7bc-beff24c5ceb9 -md""" -### Multi Dimentional Implementation: -#### Data Structures + - iteration_history: contains information on iteration, location of individuals, fitness of individuals, best fitness, worst fitness, best overall fitness for each iteration of the algorithm. """ +function SMA_APPENDIX_1(fitness_function, lb, ub, maxt, N; z=0.03) -# ╔═╡ 955d45f8-6040-4904-9fc9-ff13ffa41193 -begin - # This structure holds the information of a single generation - struct IterationRecordMulti - iteration::Int - slimes::Vector{Vector{Float64}} - fitness::Vector{Float64} - DF::Float64 - DF_value::Vector{Float64} - bF::Float64 - wF::Float64 - Xb::Vector{Float64} - end - - # This structure hold the information of the full algorithm run - struct SolutionRecordMulti - iteration::Vector{Float64} - slimes::Vector{Vector{Vector{Float64}}} - fitness::Vector{Vector{Float64}} - mean_fitness::Vector{Float64} - DF::Vector{Float64} - DF_value::Vector{Vector{Float64}} - bF::Vector{Float64} - wF::Vector{Float64} - Xb::Vector{Vector{Float64}} - end - -end - -# ╔═╡ 4862cfb9-364b-4d34-9a30-38ce48ce069d -function SMA(fitness_function, lb, ub, maxt, N; z=0.03) + # Initialize vectors slime_array = [rand(lb[d]:ub[d]) for k = 1:N, d = 1:length(lb)] # initialize slimes with random positions - slime_list = [slime_array[i,:] for i in 1:N] # put in list - DF::Float64 = 10e100 - DF_value = [float(1) for i in 1:length(lb)] + slime_list = [slime_array[i,:] for i in 1:N] # change to a vector of vectors + DF::Float64 = 10e100 # initialize the best fitness + DF_value = [float(1) for i in 1:length(lb)] # Initilize DF result vector iteration_history = Vector{IterationRecordMulti}(undef, maxt) # initialize result vector + + # cycle through all the generations for current_iteration in 1:maxt # calculate fitness fitness_list = [fitness_function(slime_list[s]) for s in 1:N] @@ -579,7 +703,17 @@ function SMA(fitness_function, lb, ub, maxt, N; z=0.03) boundary = N/2 weight_list = [] for (rank,s) in enumerate(sortperm(fitness_list)) - push!(weight_list, W(fitness_list[s], bF, wF, (rank < boundary), current_iteration, maxt)) + push!( + weight_list, + W( + fitness_list[s], + bF, + wF, + (rank < boundary), + current_iteration, + maxt + ) + ) end # update p, vb and vc @@ -592,38 +726,58 @@ function SMA(fitness_function, lb, ub, maxt, N; z=0.03) slime_list_temp = [] for s in 1:N if rand(Uniform(0, 1)) < z - push!(slime_list_temp, [rand(Uniform(lb[i],ub[i])) for i in 1:length(lb)]) + # Searching Food behavior + push!( + slime_list_temp, + [rand(Uniform(lb[i],ub[i])) for i in 1:length(lb)] + ) else p = tanh(fitness_list[s] - DF) temp_individual = [] if rand(Uniform(0, 1)) < p + # Approaching Food behavior XA_ID, XB_ID = sample(1:N, 2, replace = false) - temp_individual = clamp(Xb .+ rand(vb, length(ub)).*(weight_list[s] .* slime_list[XA_ID] .- slime_list[XB_ID]), lb, ub) - + temp_individual = clamp.(Xb .+ rand(vb, length(ub)).*(weight_list[s] .* slime_list[XA_ID] .- slime_list[XB_ID]), lb, ub) else - temp_individual = clamp(slime_list[s] .+ slime_list[s] .* rand(vc, length(ub)), lb, ub) - + # Wrapping Food behavior + temp_individual = clamp.(slime_list[s] .+ slime_list[s] .* rand(vc, length(ub)), lb, ub) end - #(slime_list[s].+tanh(fitness_list[s] - bF).*rand(Uniform(0, 1)).*(temp_individual .- slime_list[s])) push!(slime_list_temp, slime_list[s].+tanh(fitness_list[s] - bF).*(temp_individual .- slime_list[s])) end end - iteration_history[current_iteration] = IterationRecordMulti(current_iteration, slime_list, fitness_list, DF, DF_value, bF, wF, Xb) - #slime_list = slime_list .+ 0.5(slime_list .- slime_list_temp) + iteration_history[current_iteration] = IterationRecordMulti( + current_iteration, + slime_list, + fitness_list, + DF, DF_value, + bF, wF, Xb + ) slime_list = deepcopy(slime_list_temp) end - return iteration_history end -# ╔═╡ f13d0c05-44bc-41aa-9476-3f8cd74200f1 -md""" -#### Multi Dimentional SMA - +# ╔═╡ 0cebe58b-f1b2-4220-b15c-0f844cf22057 """ + SMA_APPENDIX_2(fitness_function, lb, ub, maxt, N; z=0.03) + +The original Slime Mould Algorithm + +Inputs: + + - fitness_function: The fitness function (takes single coordinate as input with no limit on dimentions) + - lb: lower bound: vector of lower bounds for each dimention + - ub: upper bound: vector of upper bounds for each dimention (should match lb) + - maxt: Maximum number of generations + - N: Population size + - z: Change of searching food behavior (0.03 by default) -# ╔═╡ 5856285d-12a2-40f5-b321-034174ef7e6d -function SMA_Appendix(fitness_function, lb, ub, maxt, N; z=0.03) +Outputs: + + - iteration_history: contains information on iteration, location of individuals, fitness of individuals, best fitness, worst fitness, best overall fitness for each iteration of the algorithm. + +""" +function SMA_APPENDIX_2(fitness_function, lb, ub, maxt, N; z=0.03) slime_array = [rand(lb[d]:ub[d]) for k = 1:N, d = 1:length(lb)] # initialize slimes with random positions slime_list = [slime_array[i,:] for i in 1:N] # put in list DF::Float64 = 10e100 @@ -657,14 +811,24 @@ function SMA_Appendix(fitness_function, lb, ub, maxt, N; z=0.03) slime_list_temp = [] for s in 1:N if rand(Uniform(0, 1)) < z + # Searching Food push!(slime_list_temp, [rand(Uniform(lb[i],ub[i])) for i in 1:length(lb)]) else - if rand(Uniform(0, 1)) < tanh(fitness_list[s] - DF) - Xa, Xb = sample(slime_list, 2, replace = false) - push!(slime_list_temp, clamp.(Xb .+ rand(vb,length(lb)).*(weight_list[s] .* Xa .- Xb), lb, ub)) - else - push!(slime_list_temp, clamp.(slime_list[s] .* rand(vc,length(lb)), lb, ub)) + p = tanh(fitness_list[s] - DF) + temp_individual = [] + for dim in 1:length(ub) + if rand(Uniform(0, 1)) < p + # Approaching Food + XA_ID, XB_ID = sample(1:N, 2, replace = false) + push!(temp_individual, clamp(Xb[dim] + rand(vb)*(weight_list[s] * slime_list[XA_ID][dim] - slime_list[XB_ID][dim]), lb[dim], ub[dim])) + + else + # Wrapping Food + push!(temp_individual, clamp(slime_list[s][dim] * rand(vc), lb[dim], ub[dim])) + + end end + push!(slime_list_temp, temp_individual) end end iteration_history[current_iteration] = IterationRecordMulti(current_iteration, slime_list, fitness_list, DF, DF_value, bF, wF, Xb) @@ -674,8 +838,27 @@ function SMA_Appendix(fitness_function, lb, ub, maxt, N; z=0.03) return iteration_history end -# ╔═╡ 0cebe58b-f1b2-4220-b15c-0f844cf22057 -function SMA_APPENDIX_2(fitness_function, lb, ub, maxt, N; z=0.03) +# ╔═╡ 0241a8e7-2810-488e-bbc2-38c3da9a431e +""" + SMA_APPENDIX_3(fitness_function, lb, ub, maxt, N; z=0.03) + +A modified version of the SMA where only the Wrapping Food formula was changed + +Inputs: + + - fitness_function: The fitness function (takes single coordinate as input with no limit on dimentions) + - lb: lower bound: vector of lower bounds for each dimention + - ub: upper bound: vector of upper bounds for each dimention (should match lb) + - maxt: Maximum number of generations + - N: Population size + - z: Change of searching food behavior (0.03 by default) + +Outputs: + + - iteration_history: contains information on iteration, location of individuals, fitness of individuals, best fitness, worst fitness, best overall fitness for each iteration of the algorithm. + +""" +function SMA_APPENDIX_3(fitness_function, lb, ub, maxt, N; z=0.03) slime_array = [rand(lb[d]:ub[d]) for k = 1:N, d = 1:length(lb)] # initialize slimes with random positions slime_list = [slime_array[i,:] for i in 1:N] # put in list DF::Float64 = 10e100 @@ -709,17 +892,20 @@ function SMA_APPENDIX_2(fitness_function, lb, ub, maxt, N; z=0.03) slime_list_temp = [] for s in 1:N if rand(Uniform(0, 1)) < z + # Searching Food push!(slime_list_temp, [rand(Uniform(lb[i],ub[i])) for i in 1:length(lb)]) else p = tanh(fitness_list[s] - DF) temp_individual = [] for dim in 1:length(ub) if rand(Uniform(0, 1)) < p + # Approaching Food XA_ID, XB_ID = sample(1:N, 2, replace = false) push!(temp_individual, clamp(Xb[dim] + rand(vb)*(weight_list[s] * slime_list[XA_ID][dim] - slime_list[XB_ID][dim]), lb[dim], ub[dim])) else - push!(temp_individual, clamp(slime_list[s][dim] * rand(vc), lb[dim], ub[dim])) + # MODIFIED Wrapping Food + push!(temp_individual, clamp(slime_list[s][dim] * (1+rand(vc)), lb[dim], ub[dim])) end end @@ -733,12 +919,21 @@ function SMA_APPENDIX_2(fitness_function, lb, ub, maxt, N; z=0.03) return iteration_history end -# ╔═╡ 3f9ee27d-f128-4d42-a144-d3f8856de4d3 -md""" -#### Help Functions +# ╔═╡ d1dca62c-788e-4d20-a528-dcb8f39a3d53 """ + ProcessRecordVectorMulti(RecordVector) -# ╔═╡ d1dca62c-788e-4d20-a528-dcb8f39a3d53 +Process the results from being a list of structs containing information about each iteration to a struct with information on location, fitness, and generation for the total algorithm run + +Inputs: + + - RecordVector: a vector of IterationRecordMulti for each iteration + +Outputs: + + - output: SolutionRecordMulti struct with information for the whole algorithm run + +""" function ProcessRecordVectorMulti(RecordVector) iterations = [i for i in 1:length(RecordVector)] DF_vector = [] @@ -763,6 +958,20 @@ function ProcessRecordVectorMulti(RecordVector) end # ╔═╡ a48e1156-fc46-4b58-b971-9b65b348d64b +""" + fitness_multi(solution) + +Multidimentional Ackley fitness function + +Inputs: + + - solution: The coordinate for an individual + +Outputs: + + - The fitness for these coordinates + +""" function fitness_multi(solution) a, b, c = 20, 0.2, 2 * pi d = length(solution) @@ -781,7 +990,9 @@ end begin gen_slider = @bind d_gen Slider(1:length(Ackley_1D_results.iteration), default = 5, show_value = true) md""" - Below is an interactive version of this plot. + The figure above shows 4 plots. The **first figure** (top left) shows the evolution of the best fitness and the mean fitness throughout the generations. The lowest fitness quickly reaches its minimum value, however, there are still fluctuations in the mean fitness because of the oscillating character of the algorithm. The **second figure** (top right) shows the location of the population at a specific generation (the x-axis does not have meaning, the points were spread for better visualization). The **third figure** (bottom left) shows the fitness function. In this case the 1D Ackley function. The points on this figure show where the population of a certain generation is located on this fitness function. Finally, the **last figure** (bottom right) shows the locations of the individuals over all generations. This figure shows that initially the individuals are randomly spread out but quickly converge on the optimal position. In later generations, some individuals still deviate. These are likely the few individuals that display *searching food* behavior. This can help the SMA get out of local optima. + + **Below is an interactive version of this plot.** Generation: $(gen_slider) """ @@ -793,7 +1004,7 @@ begin local results local record local p1, p2, p3, p4 - + results = Ackley_1D_results record = Ackley_1D_record @@ -801,13 +1012,14 @@ begin p1 = plot( results.iteration[1:i], [results.mean_fitness[1:i], results.DF[1:i]], - title ="Fitness Function", + title ="Fitness", label = ["Mean" "Lowest"], ylims=(-1, maximum(results.mean_fitness)), xlims=(0, length(results.iteration)), lw = 2, xlabel = "Generation", - ylabel = "Fitness") + ylabel = "Fitness" + ) p2 = scatter( [rand() for j in 1:length(record[1].slimes)], @@ -817,7 +1029,8 @@ begin title ="Locations in Gen: "*string(i), xticks = false, ylabel= "Location", - legend = false) + legend = false + ) p3 = plot( -100:100, @@ -826,11 +1039,11 @@ begin xlabel = "Location", ylabel = "Fitness", ylim = (-1,20), - legend = false) + legend = false + ) p3 = scatter!( reduce(vcat,Ackley_1D_record[i].slimes), - [fitness_multi(Ackley_1D_record[i].slimes[s]) for s in 1:length(Ackley_1D_record[i].slimes)] - + [fitness_multi(Ackley_1D_record[i].slimes[s]) for s in 1:length(Ackley_1D_record[i].slimes)] ) p4 = scatter( @@ -840,14 +1053,12 @@ begin markercolor = [(s == i ? :red : :green) for s in results.iteration], xlabel = "Generation", ylabel = "Location", - title = "All Locations") + title = "All Locations" + ) p4 = vline!([i], lw = 1, color = [:red]) - plot(p1, p2, p3, p4, - layout = (2, 2)) #"Generation: " * string(i) - + plot(p1, p2, p3, p4, layout = (2, 2)) end - gif(Ackley_1D, fps = 5) end @@ -857,19 +1068,22 @@ begin local record local p1, p2, p3, p4 local i + i = d_gen results = Ackley_1D_results record = Ackley_1D_record + p1 = plot( results.iteration[1:length(results.iteration)], [results.mean_fitness[1:length(results.iteration)], results.DF[1:length(results.iteration)]], - title ="Fitness Function", + title ="Fitness", label = ["Mean" "Lowest"], ylims=(-1, maximum(results.mean_fitness)), xlims=(0, length(results.iteration)), lw = 2, xlabel = "Generation", - ylabel = "Fitness") + ylabel = "Fitness" + ) p1 = vline!([i], lw = 1, color = [:red], label = false) p2 = scatter( @@ -880,7 +1094,8 @@ begin title ="Locations in Gen: "*string(i), xticks = false, ylabel= "Location", - legend = false) + legend = false + ) p3 = plot( -100:100, @@ -889,7 +1104,8 @@ begin xlabel = "Location", ylabel = "Fitness", ylim = (-1,21), - legend = false) + legend = false + ) p3 = scatter!( reduce(vcat,Ackley_1D_record[i].slimes), [fitness_multi(Ackley_1D_record[i].slimes[s]) for s in 1:length(Ackley_1D_record[i].slimes)] @@ -903,20 +1119,88 @@ begin markercolor = [(s == i ? :red : :green) for s in results.iteration], xlabel = "Generation", ylabel = "Location", - title = "All Locations") + title = "All Locations" + ) p4 = vline!([i], lw = 1, color = [:red]) - plot(p1, p2, p3, p4, - layout = (2, 2)) #"Generation: " * string(i) - - + plot(p1, p2, p3, p4, layout = (2, 2)) end # ╔═╡ e6a3536e-dfc1-494b-9b46-c33e22ed79f0 +""" + fitness_2_multi(solution) + +Multidimentional f8 function + +Inputs: + + - solution: The coordinate for an individual + +Outputs: + + - The fitness for these coordinates + +""" function fitness_2_multi(solution) return sum(-solution .* sin.(sqrt.(abs.(solution)))) end +# ╔═╡ 0ab5423b-3e36-4226-a690-e129aaa0f8c8 +begin + local d_lb + local d_ub + local d_s + + # settings + d_lb = -200 # lower bound + d_ub = 150 # upper bound + d_s = fitness_2_multi([0]) # best fitness + + + p_ex2_1 = plot( + d_lb:((d_ub-d_lb)/1000):d_ub, + [1 for i in d_lb:((d_ub-d_lb)/1000):d_ub], + ylims= (0,1), + xlims= (d_lb,d_ub), + fill = (0, :green), + label = "Finding Food" + ) + + p_ex2_1 = plot!( + d_lb:((d_ub-d_lb)/1000):d_ub, + [(1 - d_z/1000) for i in d_lb:((d_ub-d_lb)/1000):d_ub], + ylims= (0,1), + xlims= (d_lb,d_ub), + fill = (0, :lightblue), + label = "Wrapping Food" + ) + + p_ex2_1 = plot!( + d_lb:((d_ub-d_lb)/1000):d_ub, + [tanh(abs(fitness_2_multi([i])-d_s))*(1-(d_z/1000)) for i in d_lb:((d_ub-d_lb)/1000):d_ub], + ylims= (0,1), + xlims= (d_lb,d_ub), + fill = (0, :orange), + label = "Approaching Food", + title = "Chance Of Behavior", + xlabel = "Location", + ylabel = "Chance" + ) + + + p_ex2_2 = plot( + d_lb:d_ub, + [abs(fitness_2_multi([s])) for s in d_lb:d_ub], + title = "Fitness Function", + xlims= (d_lb,d_ub), + xlabel = "Location", + ylabel = "Fitness" + ) + + + plot(p_ex2_2, p_ex2_1, layout = (2, 1)) +end + # ╔═╡ 72b1f589-cae8-4ffb-a4d7-a50aeb1898ce begin f8_1D_record = SMA(fitness_2_multi, [-500], [500], 50, 20; z=0.03) @@ -927,7 +1211,9 @@ end begin gen_slider2 = @bind d_gen2 Slider(1:length(f8_1D_results.iteration), default = 5, show_value = true) md""" - Below is an interactive version of this plot. + This fitness function is much harder than the Ackly function. There are many local optima where an algorithm might get stuck. + + **Below is an interactive version of this plot.** Generation: $(gen_slider2) """ @@ -947,13 +1233,14 @@ begin p1 = plot( results.iteration[1:i], [results.mean_fitness[1:i], results.DF[1:i]], - title ="Fitness Function", + title ="Fitness", label = ["Mean" "Lowest"], ylims=(-500, 500), xlims=(0, length(results.iteration)), lw = 2, xlabel = "Generation", - ylabel = "Fitness") + ylabel = "Fitness" + ) p2 = scatter( [rand() for j in 1:length(record[1].slimes)], @@ -963,7 +1250,8 @@ begin title ="Locations in Gen: "*string(i), xticks = false, ylabel= "Location", - legend = false) + legend = false + ) p3 = plot( -500:500, @@ -972,7 +1260,8 @@ begin xlabel = "Location", ylabel = "Fitness", ylim = (-500,500), - legend = false) + legend = false + ) p3 = scatter!( reduce(vcat,record[i].slimes), [fitness_2_multi(record[i].slimes[s]) for s in 1:length(record[i].slimes)] @@ -986,14 +1275,12 @@ begin markercolor = [(s == i ? :red : :green) for s in results.iteration], xlabel = "Generation", ylabel = "Location", - title = "All Locations") + title = "All Locations" + ) p4 = vline!([i], lw = 1, color = [:red]) - plot(p1, p2, p3, p4, - layout = (2, 2)) #"Generation: " * string(i) - + plot(p1, p2, p3, p4, layout = (2, 2)) end - gif(f8_1D, fps = 5) end @@ -1003,19 +1290,22 @@ begin local record local p1, p2, p3, p4 local i + i = d_gen2 results = f8_1D_results record = f8_1D_record + p1 = plot( results.iteration[1:length(results.iteration)], [results.mean_fitness[1:length(results.iteration)], results.DF[1:length(results.iteration)]], - title ="Fitness Function", + title ="Fitness", label = ["Mean" "Lowest"], ylims=(-500, 500), xlims=(0, length(results.iteration)), lw = 2, xlabel = "Generation", - ylabel = "Fitness") + ylabel = "Fitness" + ) p1 = vline!([i], lw = 1, color = [:red], label = false) p2 = scatter( @@ -1026,7 +1316,8 @@ begin title ="Locations in Gen: "*string(i), xticks = false, ylabel= "Location", - legend = false) + legend = false + ) p3 = plot( -500:500, @@ -1035,7 +1326,8 @@ begin xlabel = "Location", ylabel = "Fitness", ylim = (-500,500), - legend = false) + legend = false + ) p3 = scatter!( reduce(vcat,record[i].slimes), [fitness_2_multi(record[i].slimes[s]) for s in 1:length(record[i].slimes)] @@ -1049,13 +1341,11 @@ begin markercolor = [(s == i ? :red : :green) for s in results.iteration], xlabel = "Generation", ylabel = "Location", - title = "All Locations") + title = "All Locations" + ) p4 = vline!([i], lw = 1, color = [:red]) - plot(p1, p2, p3, p4, - layout = (2, 2)) #"Generation: " * string(i) - - + plot(p1, p2, p3, p4, layout = (2, 2)) end # ╔═╡ d8497cde-7c0c-4e7e-91e0-6afb8d8cb411 @@ -1077,13 +1367,14 @@ begin p1 = plot( results.iteration[1:i], [results.mean_fitness[1:i], results.DF[1:i]], - title ="Fitness Function", + title ="Fitness", label = ["Mean" "Lowest"], ylims=(-500, 500), xlims=(0, length(results.iteration)), lw = 2, xlabel = "Generation", - ylabel = "Fitness") + ylabel = "Fitness" + ) p2 = scatter( [rand() for j in 1:length(record[1].slimes)], @@ -1093,7 +1384,8 @@ begin title ="Locations in Gen: "*string(i), xticks = false, ylabel= "Location", - legend = false) + legend = false + ) p3 = plot( -500:500, @@ -1102,11 +1394,11 @@ begin xlabel = "Location", ylabel = "Fitness", ylim = (-500,500), - legend = false) + legend = false + ) p3 = scatter!( reduce(vcat,record[i].slimes), - [fitness_2_multi(record[i].slimes[s]) for s in 1:length(record[i].slimes)] - + [fitness_2_multi(record[i].slimes[s]) for s in 1:length(record[i].slimes)] ) p4 = scatter( @@ -1116,217 +1408,493 @@ begin markercolor = [(s == i ? :red : :green) for s in results.iteration], xlabel = "Generation", ylabel = "Location", - title = "All Locations") + title = "All Locations" + ) p4 = vline!([i], lw = 1, color = [:red]) - plot(p1, p2, p3, p4, - layout = (2, 2)) #"Generation: " * string(i) - + plot(p1, p2, p3, p4, layout = (2, 2)) end - gif(f8_1D_OG, fps = 5) end -# ╔═╡ 61b48e5d-5be4-4f03-9c5e-c2bfc5b6419a -md""" -# HIER ONDER MOET NOG WEG!! - -""" - -# ╔═╡ b29ce423-a267-4290-b31b-e5ef4f64a56d -plot(Test2_results.iteration, [Test2_results.mean_fitness, Test2_results.DF], title = "Fitness", label = ["Mean Fitness of generation" "Lowest Fitness"], lw = 2) +# ╔═╡ 6600061c-d18e-4699-beec-adb58de12f41 +begin + f8_2D_record = SMA(fitness_2_multi, [-500, -500], [500, 500], 50, 50; z=0.03) + f8_2D_results = ProcessRecordVectorMulti(f8_2D_record) +end -# ╔═╡ f9548ad3-ce2e-413a-a548-bfe35b7e811f +# ╔═╡ 49a07a3d-51fa-4f38-b33d-e5127e744b04 begin - anim = @animate for i = 1:length(Test2_results.iteration) - plot(Test2_results.iteration[1:i], [Test2_results.mean_fitness[1:i], Test2_results.DF[1:i]], title ="Fitness", label = ["Mean Fitness of generation" "Lowest Fitness"], ylims=(-1, maximum(Test2_results.mean_fitness)), xlims=(0, length(Test2_results.iteration)), lw = 2, xlabel = "Generation", ylabel = "Fitness") + local x + local y + local results + local gen + + results = f8_2D_results + x = [i for i in -600:600] + y = [i for i in -600:600] + + f8_2D = @animate for gen = 1:length(results.iteration) + f(x,y) = fitness_2_multi([x,y]) + f8_2D_contour = contour(x,y,f) + f8_2D_contour = scatter!( + [results.slimes[gen][i][1] for i in 1:length(results.slimes[1])], + [results.slimes[gen][i][2] for i in 1:length(results.slimes[1])], + xlim=(-600,600), + ylim=(-600,600), + legend = false, + title="Fitness Contour Plot", + xlabel = "Dimention 1", + ylabel = "Dimention 2" + ) + + f8_2D_fitness = plot( + results.iteration[1:gen], + [results.mean_fitness[1:gen], results.DF[1:gen]], + title ="Fitness", + label = ["Mean" "Lowest"], + ylims=(-1000, 500), + xlims=(0, length(results.iteration)), + lw = 2, + xlabel = "Generation", + ylabel = "Fitness" + ) + + plot( + f8_2D_fitness, + f8_2D_contour, + layout = (1, 2), + size=(800,300) + ) + end - - gif(anim, "anim_fps30.gif", fps = 20) + gif(f8_2D, fps = 5) end -# ╔═╡ 192e8eeb-0514-4792-ba60-90f1f3207c0a +# ╔═╡ 36a3a18f-7537-46cc-b4f4-1551ae939be5 begin - anim2 = @animate for i = 1:length(Test2_results.iteration) - scatter([rand() for i in 1:length(Test2_record[1].slimes)], sort(Test2_record[i].slimes), ylims=(-100, 100), xlims=(0, 1), title ="Generation: " * string(i), xticks = false, ylabel= "Location") + local x + local y + local results + local gen + + results = f8_2D_results + x = [i for i in -600:600] + y = [i for i in -600:600] + f(x,y) = fitness_2_multi([x,y]) + f8_2D_3Dplot = @animate for gen = 1:length(results.iteration) + temp_camera = 30 + gen/2 + + f8_2D_scatter = plot( + x,y,f,st=:surface, + camera=(temp_camera,50), + xlim=(-600,600), + ylim=(-600,600), + zlim=(-1000,1000) + ) + + f8_2D_scatter = scatter!( + [[results.slimes[j][i][1] for i in 1:length(results.slimes[1])] for j in 1:length(results.iteration)], + [[results.slimes[j][i][2] for i in 1:length(results.slimes[1])] for j in 1:length(results.iteration)], + [[results.fitness[j][i] for i in 1:length(results.slimes[1])] for j in 1:length(results.iteration)], + xlim=(-600,600), + ylim=(-600,600), + zlim=(-1000,1000), + legend = false, + color = :green, + camera=(temp_camera,50) + ) + + f8_2D_scatter = scatter!( + [results.slimes[gen][i][1] for i in 1:length(results.slimes[1])], + [results.slimes[gen][i][2] for i in 1:length(results.slimes[1])], + results.fitness[gen], + xlim=(-600,600), + ylim=(-600,600), + zlim=(-1000,1000), + legend = false, + color = :red, + camera= (temp_camera,50), + title = "Fitness in generation: "*string(gen) + ) end - - gif(anim2, "anim_fps30.gif", fps = 5) + gif(f8_2D_3Dplot, fps = 5) end -# ╔═╡ e7f7e1d8-bbb0-4f5d-ac95-dec895527a52 -plot([1:1000], [[rand(Uniform(-atanh(-(s / 1001) + 1),atanh(-(s / 1001) + 1))) for s in 1:1000],[rand(Uniform(-(1 - (s/1001)),(1 - (s/1001)))) for s in 1:1000]], label = ["vb" "vc"], xlabel = "Iterations", ylabel = "variation") - - -# ╔═╡ 679beed3-fa57-4bb0-95a8-ca5198f07938 +# ╔═╡ f9f4361c-ec29-4055-a1da-d3b0f5a20295 begin - # maak later zo een fancy struct ding waarbij de fitness locatie etc, allemaal in een datatype zitten, orden dan alles zodat ge niet maximum enzo moet gebruiken maar gewoon 1 en -1 ofzo voor beste en slechtste?? - #call - Random.seed!(124) - lb = [-100] - ub = [100] - problem_size = 1 - - # uit functie - z = 0.01 - N = 20 - maxt = 100 - slime_list = [rand(lb[1]:ub[1]) for k in 1:N] # initialize slimes with position, change to more usefull default values. - DF = 1000 - DF_value = 0 # NOG NIET GEFIXT HIER!!! - weight_list_history = [] - vb_history = [] - vc_history = [] - p_history = [] - + local ub + local lb + local maxt + local N + local max_iter - iteration_history = Vector{IterationRecord}(undef, maxt) - for current_iteration in 1:maxt - global slime_list # WEG DOEN IN FUNCTIE!! - global fitness_list - global DF - # Calculate the fitness of all slime mould - fitness_list = [fitness(s) for s in slime_list] + max_iter = clamp(SIM1_max_iter,25,10000) + lb = [-500, -500] + ub = [500, 500] + maxt = 50 + N = 50 - # update bestFitness Xb - bF, bF_index = findmin(fitness_list) # max fitness - wF = maximum(fitness_list) # worst fitness - Xb = slime_list[bF_index] # location with max fitness - DF = min(bF, DF) - # Calculate the weights - boundary = N/2 - weight_list = [] - for (rank,s) in enumerate(sortperm(fitness_list)) - push!(weight_list, W(fitness_list[s], bF, wF, (rank < boundary), current_iteration, maxt)) - end - append!(weight_list_history, [weight_list]) - # update p, vb and vc - a = max(atanh(-(current_iteration / maxt) + 1), 10e-100) - b = max((1 - (current_iteration)/maxt), 10e-100) - vb = Uniform(-a,a) - vc = Uniform(-b,b) - - slime_list_temp = [] - for s in 1:N - if rand(Uniform(0, 1)) < z - push!(slime_list_temp, rand(Uniform(lb[1],ub[1]))) - else - p_temp = tanh(fitness_list[s] - DF) - push!(p_history, p_temp) - if rand(Uniform(0, 1)) < p_temp - Xa, Xb = sample(slime_list, 2, replace = false) - vb_temp = rand(vb) - push!(vb_history, vb_temp) - push!(slime_list_temp, clamp(Xb + vb_temp*(weight_list[s]*Xa - Xb), lb[1], ub[1])) - else - vc_temp = rand(vc) - push!(vc_history, vc_temp) - push!(slime_list_temp, clamp(slime_list[s] * vc_temp, lb[1], ub[1])) - end - end - end - iteration_history[current_iteration] = IterationRecord(current_iteration, slime_list, fitness_list, DF, DF_value, bF, wF, Xb) - slime_list = deepcopy(slime_list_temp) + OG_results = [] + Modified_results = [] + Modified_2_results = [] + + for i in 1:max_iter + f8_2D_record_MODIFIED = SMA(fitness_2_multi, lb, ub, maxt, N; z=0.03) + f8_2D_results_MODIFIED = ProcessRecordVectorMulti(f8_2D_record_MODIFIED) + push!(Modified_results,f8_2D_results_MODIFIED.DF[end]) + + f8_2D_record_OG = SMA_APPENDIX_2(fitness_2_multi, lb, ub, maxt, N; z=0.03) + f8_2D_results_OG = ProcessRecordVectorMulti(f8_2D_record_OG) + push!(OG_results,f8_2D_results_OG.DF[end]) + + f8_2D_record_MODIFIED_2 = SMA_APPENDIX_2(fitness_2_multi, lb, ub, maxt, N; z=0.03) + f8_2D_results_MODIFIED_2 = ProcessRecordVectorMulti(f8_2D_record_MODIFIED_2) + push!(Modified_2_results,f8_2D_results_MODIFIED_2.DF[end]) end -end + + OG_results_mean = round(mean(OG_results)) + OG_results_minimum = round(minimum(OG_results)) + OG_results_median = round(median(OG_results)) + Modified_results_mean = round(mean(Modified_results)) + Modified_results_minimum = round(minimum(Modified_results)) + Modified_results_median = round(median(Modified_results)) + Modified_2_results_mean = round(mean(Modified_2_results)) + Modified_2_results_minimum = round(minimum(Modified_2_results)) + Modified_2_results_median = round(median(Modified_2_results)) + + scatter( + [[rand()/1.3 for j in 1:max_iter],[rand()/1.3+1 for j in 1:max_iter], [rand()/1.3+2 for j in 1:max_iter]], + [OG_results, Modified_results, Modified_2_results], + xlims=(-0.5, 3.5), + title ="Final fitness scores", + xticks = false, + ylabel= "Fitness", + markeralpha = 0.7, + labels = ["Original" "Modified" "Modified_2"] + ) + + boxplot!( + [[0.5/1.3 for j in 1:max_iter],[0.5/1.3+1 for j in 1:max_iter],[0.5/1.3+2 for j in 1:max_iter]], + [OG_results, Modified_results, Modified_2_results], + outliers = false, + label=false, + fillalpha = 0.3, + fillcolor = repeat([:blue :orange :green], outer = max_iter) + ) -# ╔═╡ 26f3b743-b7a1-43e8-b07f-1b4e3ebb42fb -Test1 = ProcessRecordVector(iteration_history) +end -# ╔═╡ 874bcad6-cf73-417a-82e6-093c6bcdd0d8 +# ╔═╡ ba12b93e-83d2-4c8d-91d9-ff98afff6f10 md""" -### Different fitness function: +The results of this simulation are:\ +**Original Algorithm:**\ +Mean: $(OG_results_mean)\ +Median: $(OG_results_median)\ +Minimum: $(OG_results_minimum)\ +**Modified Algorithm:**\ +Mean: $(Modified_results_mean)\ +Median: $(Modified_results_median)\ +Minimum: $(Modified_results_minimum)\ +**Modified_2 Algorithm:**\ +Mean: $(Modified_2_results_mean)\ +Median: $(Modified_2_results_median)\ +Minimum: $(Modified_2_results_minimum)\ + +**Discussion:** For this low amount of dimensions and small intervals for the design space, all algorithms perform similarly. Most runs result either in the global optimum or one local optimum (which is why the boxplots look strange). """ -# ╔═╡ 40167574-d958-49a8-bfcc-59f95f98e7a1 -plot(-500:500, - [fitness_2(s) for s in -500:500], - title = "Fitness Function", - xlabel = "Location", - ylabel = "Fitness") - -# ╔═╡ a071b8d5-f938-42a7-92e6-9883ad90aa09 +# ╔═╡ 60cecddd-601e-4113-90c5-19d3d045136a begin - Test3_record = SMA_1D(fitness_2, [-500], [500], 100, 20; z=0.03) - Test3_results = ProcessRecordVector(Test3_record) + local ub, lb, maxt, N, max_iter + local OG_results, Modified_results, Modified_2_results + local OG_results_mean, OG_results_minimum, OG_results_median, Modified_results_mean, Modified_results_minimum, Modified_results_median, Modified_2_results_mean, Modified_2_results_minimum, Modified_2_results_median + local simulation_figure + SIM2_max_iter_button + + # Initiate algorithm settings + max_iter = clamp(SIM2_max_iter,25,10000) + lb = [100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100] + ub = [10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000, 10000] + maxt = 50 + N = 50 + + # Initiate result vectors + OG_results = [] + Modified_results = [] + Modified_2_results = [] + + for i in 1:max_iter + # Modified algorithm + f8_2D_record_MODIFIED = SMA(fitness_2_multi, lb, ub, maxt, N; z=0.03) + f8_2D_results_MODIFIED = ProcessRecordVectorMulti(f8_2D_record_MODIFIED) + push!(Modified_results,f8_2D_results_MODIFIED.DF[end]) + + # Original algorithm + f8_2D_record_OG = SMA_APPENDIX_2(fitness_2_multi, lb, ub, maxt, N; z=0.03) + f8_2D_results_OG = ProcessRecordVectorMulti(f8_2D_record_OG) + push!(OG_results,f8_2D_results_OG.DF[end]) + + # Modified_2 algorithm + f8_2D_record_MODIFIED_2 = SMA_APPENDIX_2(fitness_2_multi, lb, ub, maxt, N; z=0.03) + f8_2D_results_MODIFIED_2 = ProcessRecordVectorMulti(f8_2D_record_MODIFIED_2) + push!(Modified_2_results,f8_2D_results_MODIFIED_2.DF[end]) + end + + # Calculate performance metrics + OG_results_mean = round(mean(OG_results)) + OG_results_minimum = round(minimum(OG_results)) + OG_results_median = round(median(OG_results)) + Modified_results_mean = round(mean(Modified_results)) + Modified_results_minimum = round(minimum(Modified_results)) + Modified_results_median = round(median(Modified_results)) + Modified_2_results_mean = round(mean(Modified_2_results)) + Modified_2_results_minimum = round(minimum(Modified_2_results)) + Modified_2_results_median = round(median(Modified_2_results)) + + # Create the figure + ## first scatter the points + simulation_figure = scatter( + [ + [rand()/1.3 for j in 1:max_iter], + [rand()/1.3+1 for j in 1:max_iter], + [rand()/1.3+2 for j in 1:max_iter] + ], + [OG_results, Modified_results, Modified_2_results], + xlims=(-0.5, 3.5), + title ="Final fitness scores", + xticks = false, + ylabel= "Fitness", + markeralpha = 0.7, + labels = ["Original" "Modified" "Modified_2"] + ) + + ## Overlay the boxplots + simulation_figure = boxplot!( + [ + [0.5/1.3 for j in 1:max_iter], + [0.5/1.3+1 for j in 1:max_iter], + [0.5/1.3+2 for j in 1:max_iter] + ], + [OG_results, Modified_results, Modified_2_results], + outliers = false, + label = false, + fillalpha = 0.3, + fillcolor = repeat([:blue :orange :green], outer = max_iter) + ) + +md""" +$(simulation_figure) + +The results of this simulation are:\ +**Original Algorithm:**\ +Mean: $(OG_results_mean)\ +Median: $(OG_results_median)\ +Minimum: $(OG_results_minimum)\ +**Modified Algorithm:**\ +Mean: $(Modified_results_mean)\ +Median: $(Modified_results_median)\ +Minimum: $(Modified_results_minimum)\ +**Modified_2 Algorithm:**\ +Mean: $(Modified_2_results_mean)\ +Median: $(Modified_2_results_median)\ +Minimum: $(Modified_2_results_minimum)\ + +**Discussion:** We are now using a design space with 15 dimensions and much larger intervals. The fact that there is no large population of points at the lowest fitness value (and that the boxplots look so clean) indicates that none of the algorithms are consistently reaching the global minimum. This may be because of the low amount of generations for each run, or the limited population size, especially because of the high complexity of the 15D problem. +""" end -# ╔═╡ 772f6482-2679-4672-97f5-96468c468f68 +# ╔═╡ 95f1d794-fba6-4743-862b-e2c0a5a0e1ed begin - anim4 = @animate for i = 1:length(Test3_results.iteration) - p1 = plot( - Test3_results.iteration[1:i], - [Test3_results.mean_fitness[1:i], Test3_results.DF[1:i]], - title ="Fitness", - label = ["Mean" "Lowest"], - ylims=(minimum(Test3_results.DF)-100, maximum(Test3_results.mean_fitness)), - xlims=(0, length(Test3_results.iteration)), - lw = 2, - xlabel = "Generation", - ylabel = "Fitness") - - p2 = scatter( - [rand() for i in 1:length(Test3_record[1].slimes)], - sort(Test3_record[i].slimes), - ylims=(-500, 500), - xlims=(0, 1), - title ="Slime Location per Generation", - xticks = false, - ylabel= "Location") - - p3 = plot( - -500:500, - [fitness_2(s) for s in -500:500], - title = "Fitness Function", - xlabel = "Location", - ylabel = "Fitness") - - p4 = scatter( - Test3_results.iteration, - reduce(vcat,transpose.(Test3_results.slimes)), - legend = false, - markercolor = [(s == i ? :red : :green) for s in Test3_results.iteration], - xlabel = "Generation", - ylabel = "Location", - title = "Slime Location") - p4 = plot!(Test3_results.iteration, [-418.9829 for i in Test3_results.iteration]) - - plot(p1, p2, p3, p4, - layout = (2, 2)) #"Generation: " * string(i) - + local ub, lb, maxt, N, max_iter + local OG_results, Modified_results, Modified_2_results + local OG_results_mean, OG_results_minimum, OG_results_median, Modified_results_mean, Modified_results_minimum, Modified_results_median, Modified_2_results_mean, Modified_2_results_minimum, Modified_2_results_median + local simulation_figure + + SIM3_max_iter_button + + max_iter = clamp(SIM3_max_iter,25,10000) + lb = [100, 100, 100, 100, 100] + ub = [10000, 10000, 10000, 10000, 10000] + maxt = 500 + N = 50 + + OG_results = [] + Modified_results = [] + Modified_2_results = [] + + for i in 1:max_iter + f8_2D_record_MODIFIED = SMA(fitness_2_multi, lb, ub, maxt, N; z=0.03) + f8_2D_results_MODIFIED = ProcessRecordVectorMulti(f8_2D_record_MODIFIED) + push!(Modified_results,f8_2D_results_MODIFIED.DF[end]) + + f8_2D_record_OG = SMA_APPENDIX_2(fitness_2_multi, lb, ub, maxt, N; z=0.03) + f8_2D_results_OG = ProcessRecordVectorMulti(f8_2D_record_OG) + push!(OG_results,f8_2D_results_OG.DF[end]) + + f8_2D_record_MODIFIED_2 = SMA_APPENDIX_2(fitness_2_multi, lb, ub, maxt, N; z=0.03) + f8_2D_results_MODIFIED_2 = ProcessRecordVectorMulti(f8_2D_record_MODIFIED_2) + push!(Modified_2_results,f8_2D_results_MODIFIED_2.DF[end]) end - - gif(anim4, "anim4.gif", fps = 5) -end - -# ╔═╡ 3762e4c0-63a5-40d3-beab-0db781d83af0 - - -# ╔═╡ fff32e43-8c5c-416f-9734-b356478d17ab + + OG_results_mean = round(mean(OG_results)) + OG_results_minimum = round(minimum(OG_results)) + OG_results_median = round(median(OG_results)) + Modified_results_mean = round(mean(Modified_results)) + Modified_results_minimum = round(minimum(Modified_results)) + Modified_results_median = round(median(Modified_results)) + Modified_2_results_mean = round(mean(Modified_2_results)) + Modified_2_results_minimum = round(minimum(Modified_2_results)) + Modified_2_results_median = round(median(Modified_2_results)) + + simulation_figure = scatter( + [[rand()/1.3 for j in 1:max_iter],[rand()/1.3+1 for j in 1:max_iter], [rand()/1.3+2 for j in 1:max_iter]], + [OG_results, Modified_results, Modified_2_results], + xlims=(-0.5, 3.5), + title ="Final fitness scores", + xticks = false, + ylabel= "Fitness", + markeralpha = 0.7, + labels = ["Original" "Modified" "Modified_2"] + ) + + simulation_figure = boxplot!( + [[0.5/1.3 for j in 1:max_iter],[0.5/1.3+1 for j in 1:max_iter],[0.5/1.3+2 for j in 1:max_iter]], + [OG_results, Modified_results, Modified_2_results], + outliers = false, + label=false, + fillalpha = 0.3, + fillcolor = repeat([:blue :orange :green], outer = max_iter) + ) md""" -## Multidimentional implementation - +$(simulation_figure) + +The results of this simulation are:\ +**Original Algorithm:**\ +Mean: $(OG_results_mean)\ +Median: $(OG_results_median)\ +Minimum: $(OG_results_minimum)\ +**Modified Algorithm:**\ +Mean: $(Modified_results_mean)\ +Median: $(Modified_results_median)\ +Minimum: $(Modified_results_minimum)\ +**Modified_2 Algorithm:**\ +Mean: $(Modified_2_results_mean)\ +Median: $(Modified_2_results_median)\ +Minimum: $(Modified_2_results_minimum)\ + +**Discussion:** Here we have increased the amount of generations from 50 to 500 and we see a clear advantage for the original algorithm. """ +end -# ╔═╡ e4c3ed05-38ef-4440-82ac-c2a41616ad12 +# ╔═╡ ed950215-5b2c-4216-b377-881b094f5c91 begin - lb_2 = [-10, -100] - ub_2 = [10, 100] - teeest = [rand(lb_2[d]:ub_2[d]) for k = 1:N, d = 1:length(lb_2)] + local ub, lb, maxt, N, max_iter + local OG_results, Modified_results, Modified_2_results + local OG_results_mean, OG_results_minimum, OG_results_median, Modified_results_mean, Modified_results_minimum, Modified_results_median, Modified_2_results_mean, Modified_2_results_minimum, Modified_2_results_median + local simulation_figure + + + max_iter = 25 + lb = [100, 100, 100, 100, 100] + ub = [10000, 10000, 10000, 10000, 10000] + maxt = 50 + N = 50 + + OG_results = [] + Modified_results = [] + Modified_2_results = [] + + for j in 25:20:500 + maxt=j + OG_results_temp = [] + Modified_results_temp = [] + Modified_2_results_temp = [] + for i in 1:max_iter + f8_2D_record_MODIFIED = SMA(fitness_2_multi, lb, ub, maxt, N; z=0.03) + f8_2D_results_MODIFIED = ProcessRecordVectorMulti(f8_2D_record_MODIFIED) + push!(Modified_results_temp,f8_2D_results_MODIFIED.DF[end]) + + f8_2D_record_OG = SMA_APPENDIX_2(fitness_2_multi, lb, ub, maxt, N; z=0.03) + f8_2D_results_OG = ProcessRecordVectorMulti(f8_2D_record_OG) + push!(OG_results_temp,f8_2D_results_OG.DF[end]) + + f8_2D_record_MODIFIED_2 = SMA_APPENDIX_2(fitness_2_multi, lb, ub, maxt, N; z=0.03) + f8_2D_results_MODIFIED_2 = ProcessRecordVectorMulti(f8_2D_record_MODIFIED_2) + push!(Modified_2_results_temp,f8_2D_results_MODIFIED_2.DF[end]) + end + push!(Modified_results, Modified_results_temp) + push!(Modified_2_results, [Modified_2_results_temp]) + push!(OG_results, [OG_results_temp]) + end + plot( + [25:20:500], + [ + [median(i) for i in OG_results], + [median(i) for i in Modified_results], + [median(i) for i in Modified_2_results] + ], + title = "Median Fitness for Different maxt values", + ylabel = "Median Fitness", + xlabel = "maxt", + labels = ["Original" "Modified" "Modified_2"] + ) end -# ╔═╡ 8a7a9e2a-ad0a-4996-9057-ccc05d5ff577 -teeest2 = [teeest[i,:] for i in 1:N] - -# ╔═╡ 83011d1f-d9c7-472e-b9b3-98b11a072df5 +# ╔═╡ 96d04bb5-b8db-4fb3-b4b0-64150fb76a99 begin - multi1_record = SMA(fitness_multi, [-100], [100], 50, 10; z=0.03) - multi1_result = ProcessRecordVectorMulti(multi1_record) + local ub, lb, maxt, N, max_iter + local OG_results, Modified_results, Modified_2_results + local OG_results_mean, OG_results_minimum, OG_results_median, Modified_results_mean, Modified_results_minimum, Modified_results_median, Modified_2_results_mean, Modified_2_results_minimum, Modified_2_results_median + local simulation_figure + + + max_iter = 25 + lb = [100, 100, 100, 100, 100] + ub = [10000, 10000, 10000, 10000, 10000] + maxt = 50 + N = 50 + + OG_results = [] + Modified_results = [] + Modified_2_results = [] + + for j in 25:20:500 + maxt=N + OG_results_temp = [] + Modified_results_temp = [] + Modified_2_results_temp = [] + for i in 1:max_iter + f8_2D_record_MODIFIED = SMA(fitness_2_multi, lb, ub, maxt, N; z=0.03) + f8_2D_results_MODIFIED = ProcessRecordVectorMulti(f8_2D_record_MODIFIED) + push!(Modified_results_temp,f8_2D_results_MODIFIED.DF[end]) + + f8_2D_record_OG = SMA_APPENDIX_2(fitness_2_multi, lb, ub, maxt, N; z=0.03) + f8_2D_results_OG = ProcessRecordVectorMulti(f8_2D_record_OG) + push!(OG_results_temp,f8_2D_results_OG.DF[end]) + + f8_2D_record_MODIFIED_2 = SMA_APPENDIX_2(fitness_2_multi, lb, ub, maxt, N; z=0.03) + f8_2D_results_MODIFIED_2 = ProcessRecordVectorMulti(f8_2D_record_MODIFIED_2) + push!(Modified_2_results_temp,f8_2D_results_MODIFIED_2.DF[end]) + end + push!(Modified_results, Modified_results_temp) + push!(Modified_2_results, [Modified_2_results_temp]) + push!(OG_results, [OG_results_temp]) + end + plot( + [25:20:500], + [ + [median(i) for i in OG_results], + [median(i) for i in Modified_results], + [median(i) for i in Modified_2_results] + ], + title = "Median Fitness for Different Population Sizes", + ylabel = "Median Fitness", + xlabel = "Population size", + labels = ["Original" "Modified" "Modified_2"] + ) end -# ╔═╡ a476cff9-e37d-4e21-a205-6b003bd04c62 -plot(multi1_result.iteration, [multi1_result.mean_fitness, multi1_result.DF], title = "Fitness", label = ["Mean Fitness of generation" "Lowest Fitness"], lw = 2) - # ╔═╡ 00000000-0000-0000-0000-000000000001 PLUTO_PROJECT_TOML_CONTENTS = """ [deps] @@ -1335,18 +1903,26 @@ Plots = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" PlutoUI = "7f904dfe-b85e-4ff6-b463-dae2292396a8" Random = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" StatsBase = "2913bbd2-ae8a-5f71-8c99-4fb6c76f3a91" +StatsPlots = "f3b207a7-027a-5e70-b257-86293d7955fd" [compat] Distributions = "~0.25.41" -Plots = "~1.25.6" -PlutoUI = "~0.7.30" +Plots = "~1.25.5" +PlutoUI = "~0.7.32" StatsBase = "~0.33.14" +StatsPlots = "~0.14.30" """ # ╔═╡ 00000000-0000-0000-0000-000000000002 PLUTO_MANIFEST_TOML_CONTENTS = """ # This file is machine-generated - editing it directly is not advised +[[AbstractFFTs]] +deps = ["ChainRulesCore", "LinearAlgebra"] +git-tree-sha1 = "6f1d9bc1c08f9f4a8fa92e3ea3cb50153a1b40d4" +uuid = "621f4979-c628-5d54-868e-fcf4e3e8185c" +version = "1.1.0" + [[AbstractPlutoDingetjes]] deps = ["Pkg"] git-tree-sha1 = "8eaf9f1b4921132a4cff3f36a1d9ba923b14a481" @@ -1362,9 +1938,27 @@ version = "3.3.3" [[ArgTools]] uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +[[Arpack]] +deps = ["Arpack_jll", "Libdl", "LinearAlgebra"] +git-tree-sha1 = "2ff92b71ba1747c5fdd541f8fc87736d82f40ec9" +uuid = "7d9fca2a-8960-54d3-9f78-7d1dccf2cb97" +version = "0.4.0" + +[[Arpack_jll]] +deps = ["Libdl", "OpenBLAS_jll", "Pkg"] +git-tree-sha1 = "e214a9b9bd1b4e1b4f15b22c0994862b66af7ff7" +uuid = "68821587-b530-5797-8361-c406ea357684" +version = "3.5.0+3" + [[Artifacts]] uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +[[AxisAlgorithms]] +deps = ["LinearAlgebra", "Random", "SparseArrays", "WoodburyMatrices"] +git-tree-sha1 = "66771c8d21c8ff5e3a93379480a2307ac36863f7" +uuid = "13072b0f-2c55-5437-9ae7-d433b7a33950" +version = "1.0.1" + [[Base64]] uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" @@ -1392,6 +1986,12 @@ git-tree-sha1 = "bf98fa45a0a4cee295de98d4c1462be26345b9a1" uuid = "9e997f8a-9a97-42d5-a9f1-ce6bfc15e2c0" version = "0.1.2" +[[Clustering]] +deps = ["Distances", "LinearAlgebra", "NearestNeighbors", "Printf", "SparseArrays", "Statistics", "StatsBase"] +git-tree-sha1 = "75479b7df4167267d75294d14b58244695beb2ac" +uuid = "aaaa29a8-35af-508c-8bc3-b662a17a0fe5" +version = "0.14.2" + [[ColorSchemes]] deps = ["ColorTypes", "Colors", "FixedPointNumbers", "Random"] git-tree-sha1 = "6b6f04f93710c71550ec7e16b650c1b9a612d0b6" @@ -1442,6 +2042,12 @@ git-tree-sha1 = "bfc1187b79289637fa0ef6d4436ebdfe6905cbd6" uuid = "e2d170a0-9d28-54be-80f0-106bbe20a464" version = "1.0.0" +[[DataValues]] +deps = ["DataValueInterfaces", "Dates"] +git-tree-sha1 = "d88a19299eba280a6d062e135a43f00323ae70bf" +uuid = "e7dc6d0d-1eca-5fa6-8ad6-5aecde8b7ea5" +version = "0.4.13" + [[Dates]] deps = ["Printf"] uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" @@ -1456,6 +2062,12 @@ git-tree-sha1 = "80c3e8639e3353e5d2912fb3a1916b8455e2494b" uuid = "b429d917-457f-4dbc-8f4c-0cc954292b1d" version = "0.4.0" +[[Distances]] +deps = ["LinearAlgebra", "SparseArrays", "Statistics", "StatsAPI"] +git-tree-sha1 = "3258d0659f812acde79e8a74b11f17ac06d0ca04" +uuid = "b4f34e82-e78d-54a5-968a-f98e89d6e8f7" +version = "0.10.7" + [[Distributed]] deps = ["Random", "Serialization", "Sockets"] uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" @@ -1500,6 +2112,18 @@ git-tree-sha1 = "d8a578692e3077ac998b50c0217dfd67f21d1e5f" uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" version = "4.4.0+0" +[[FFTW]] +deps = ["AbstractFFTs", "FFTW_jll", "LinearAlgebra", "MKL_jll", "Preferences", "Reexport"] +git-tree-sha1 = "463cb335fa22c4ebacfd1faba5fde14edb80d96c" +uuid = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" +version = "1.4.5" + +[[FFTW_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "c6033cc3892d0ef5bb9cd29b7f2f0331ea5184ea" +uuid = "f5851436-0d7a-5f13-b9de-f02708fd171a" +version = "3.3.10+0" + [[FillArrays]] deps = ["LinearAlgebra", "Random", "SparseArrays", "Statistics"] git-tree-sha1 = "8756f9935b7ccc9064c6eef0bff0ad643df733a3" @@ -1618,10 +2242,22 @@ git-tree-sha1 = "098e4d2c533924c921f9f9847274f2ad89e018b8" uuid = "83e8ac13-25f8-5344-8a64-a9f2b223428f" version = "0.5.0" +[[IntelOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "d979e54b71da82f3a65b62553da4fc3d18c9004c" +uuid = "1d5cc7b8-4909-519e-a0f8-d0f5ad9712d0" +version = "2018.0.3+2" + [[InteractiveUtils]] deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +[[Interpolations]] +deps = ["AxisAlgorithms", "ChainRulesCore", "LinearAlgebra", "OffsetArrays", "Random", "Ratios", "Requires", "SharedArrays", "SparseArrays", "StaticArrays", "WoodburyMatrices"] +git-tree-sha1 = "b15fc0a95c564ca2e0a7ae12c1f095ca848ceb31" +uuid = "a98d9a8b-a2ab-59e6-89dd-64a1c18fca59" +version = "0.13.5" + [[InverseFunctions]] deps = ["Test"] git-tree-sha1 = "a7254c0acd8e62f1ac75ad24d5db43f5f19f3c65" @@ -1661,6 +2297,12 @@ git-tree-sha1 = "d735490ac75c5cb9f1b00d8b5509c11984dc6943" uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" version = "2.1.0+0" +[[KernelDensity]] +deps = ["Distributions", "DocStringExtensions", "FFTW", "Interpolations", "StatsBase"] +git-tree-sha1 = "591e8dc09ad18386189610acafb970032c519707" +uuid = "5ab0869b-81aa-558d-bb23-cbf5423bbe9b" +version = "0.6.3" + [[LAME_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "f6250b16881adf048549549fba48b1161acdac8c" @@ -1684,6 +2326,10 @@ git-tree-sha1 = "a8f4f279b6fa3c3c4f1adadd78a621b13a506bce" uuid = "23fbe1c1-3f47-55db-b15f-69d7ec21a316" version = "0.15.9" +[[LazyArtifacts]] +deps = ["Artifacts", "Pkg"] +uuid = "4af54fe1-eca0-43a8-85a7-787d91b784e3" + [[LibCURL]] deps = ["LibCURL_jll", "MozillaCACerts_jll"] uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" @@ -1764,6 +2410,12 @@ version = "0.3.6" [[Logging]] uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +[[MKL_jll]] +deps = ["Artifacts", "IntelOpenMP_jll", "JLLWrappers", "LazyArtifacts", "Libdl", "Pkg"] +git-tree-sha1 = "5455aef09b40e5020e1520f551fa3135040d4ed0" +uuid = "856f044c-d86e-5d09-b602-aeab76dc8ba7" +version = "2021.1.1+2" + [[MacroTools]] deps = ["Markdown", "Random"] git-tree-sha1 = "3d3e902b31198a27340d0bf00d6ac452866021cf" @@ -1801,20 +2453,47 @@ uuid = "a63ad114-7e13-5084-954f-fe012c677804" [[MozillaCACerts_jll]] uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +[[MultivariateStats]] +deps = ["Arpack", "LinearAlgebra", "SparseArrays", "Statistics", "StatsBase"] +git-tree-sha1 = "8d958ff1854b166003238fe191ec34b9d592860a" +uuid = "6f286f6a-111f-5878-ab1e-185364afe411" +version = "0.8.0" + [[NaNMath]] -git-tree-sha1 = "f755f36b19a5116bb580de457cda0c140153f283" +git-tree-sha1 = "b086b7ea07f8e38cf122f5016af580881ac914fe" uuid = "77ba4419-2d1f-58cd-9bb1-8ffee604a2e3" -version = "0.3.6" +version = "0.3.7" + +[[NearestNeighbors]] +deps = ["Distances", "StaticArrays"] +git-tree-sha1 = "16baacfdc8758bc374882566c9187e785e85c2f0" +uuid = "b8a86587-4115-5ab1-83bc-aa920d37bbce" +version = "0.4.9" [[NetworkOptions]] uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +[[Observables]] +git-tree-sha1 = "fe29afdef3d0c4a8286128d4e45cc50621b1e43d" +uuid = "510215fc-4207-5dde-b226-833fc4488ee2" +version = "0.4.0" + +[[OffsetArrays]] +deps = ["Adapt"] +git-tree-sha1 = "043017e0bdeff61cfbb7afeb558ab29536bbb5ed" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.10.8" + [[Ogg_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" version = "1.3.5+1" +[[OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" + [[OpenLibm_jll]] deps = ["Artifacts", "Libdl"] uuid = "05823500-19ac-5b8b-9628-191a04bc5112" @@ -1856,9 +2535,9 @@ version = "0.11.5" [[Parsers]] deps = ["Dates"] -git-tree-sha1 = "92f91ba9e5941fc781fecf5494ac1da87bdac775" +git-tree-sha1 = "0b5cfbb704034b5b4c1869e36634438a047df065" uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" -version = "2.2.0" +version = "2.2.1" [[Pixman_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] @@ -1884,15 +2563,15 @@ version = "1.1.3" [[Plots]] deps = ["Base64", "Contour", "Dates", "Downloads", "FFMPEG", "FixedPointNumbers", "GR", "GeometryBasics", "JSON", "Latexify", "LinearAlgebra", "Measures", "NaNMath", "PlotThemes", "PlotUtils", "Printf", "REPL", "Random", "RecipesBase", "RecipesPipeline", "Reexport", "Requires", "Scratch", "Showoff", "SparseArrays", "Statistics", "StatsBase", "UUIDs", "UnicodeFun", "Unzip"] -git-tree-sha1 = "db7393a80d0e5bef70f2b518990835541917a544" +git-tree-sha1 = "68e602f447344154f3b80f7d14bfb459a0f4dadf" uuid = "91a5bcdd-55d7-5caf-9e0b-520d859cae80" -version = "1.25.6" +version = "1.25.5" [[PlutoUI]] deps = ["AbstractPlutoDingetjes", "Base64", "ColorTypes", "Dates", "Hyperscript", "HypertextLiteral", "IOCapture", "InteractiveUtils", "JSON", "Logging", "Markdown", "Random", "Reexport", "UUIDs"] -git-tree-sha1 = "5c0eb9099596090bb3215260ceca687b888a1575" +git-tree-sha1 = "ae6145ca68947569058866e443df69587acc1806" uuid = "7f904dfe-b85e-4ff6-b463-dae2292396a8" -version = "0.7.30" +version = "0.7.32" [[Preferences]] deps = ["TOML"] @@ -1924,6 +2603,12 @@ uuid = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" deps = ["Serialization"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +[[Ratios]] +deps = ["Requires"] +git-tree-sha1 = "01d341f502250e81f6fec0afe662aa861392a3aa" +uuid = "c84ed2f1-dad5-54f0-aa8e-dbefe2724439" +version = "0.4.2" + [[RecipesBase]] git-tree-sha1 = "6bf3f380ff52ce0832ddd3a2a7b9538ed1bcca7d" uuid = "3cdcf5f2-1ef4-517c-9805-6587b60abb01" @@ -1931,9 +2616,9 @@ version = "1.2.1" [[RecipesPipeline]] deps = ["Dates", "NaNMath", "PlotUtils", "RecipesBase"] -git-tree-sha1 = "37c1631cb3cc36a535105e6d5557864c82cd8c2b" +git-tree-sha1 = "7ad0dfa8d03b7bcf8c597f59f5292801730c55b8" uuid = "01d81517-befc-4cb6-b9ec-a95719d0359c" -version = "0.5.0" +version = "0.4.1" [[Reexport]] git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" @@ -1973,6 +2658,12 @@ git-tree-sha1 = "0b4b7f1393cff97c33891da2a0bf69c6ed241fda" uuid = "6c6a2e73-6563-6170-7368-637461726353" version = "1.1.0" +[[SentinelArrays]] +deps = ["Dates", "Random"] +git-tree-sha1 = "15dfe6b103c2a993be24404124b8791a09460983" +uuid = "91c51154-3ec4-41a3-a24f-3f23e20d615c" +version = "1.3.11" + [[Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" @@ -2001,9 +2692,9 @@ uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" [[SpecialFunctions]] deps = ["ChainRulesCore", "IrrationalConstants", "LogExpFunctions", "OpenLibm_jll", "OpenSpecFun_jll"] -git-tree-sha1 = "e08890d19787ec25029113e88c34ec20cac1c91e" +git-tree-sha1 = "e6bf188613555c78062842777b116905a9f9dd49" uuid = "276daf66-3868-5448-9aa4-cd146d93841b" -version = "2.0.0" +version = "2.1.0" [[StaticArrays]] deps = ["LinearAlgebra", "Random", "Statistics"] @@ -2028,9 +2719,15 @@ version = "0.33.14" [[StatsFuns]] deps = ["ChainRulesCore", "InverseFunctions", "IrrationalConstants", "LogExpFunctions", "Reexport", "Rmath", "SpecialFunctions"] -git-tree-sha1 = "bedb3e17cc1d94ce0e6e66d3afa47157978ba404" +git-tree-sha1 = "f35e1879a71cca95f4826a14cdbf0b9e253ed918" uuid = "4c63d2b9-4356-54db-8cca-17b64c39e42c" -version = "0.9.14" +version = "0.9.15" + +[[StatsPlots]] +deps = ["Clustering", "DataStructures", "DataValues", "Distributions", "Interpolations", "KernelDensity", "LinearAlgebra", "MultivariateStats", "Observables", "Plots", "RecipesBase", "RecipesPipeline", "Reexport", "StatsBase", "TableOperations", "Tables", "Widgets"] +git-tree-sha1 = "e1e5ed9669d5521d4bbdd4fab9f0945a0ffceba2" +uuid = "f3b207a7-027a-5e70-b257-86293d7955fd" +version = "0.14.30" [[StructArrays]] deps = ["Adapt", "DataAPI", "StaticArrays", "Tables"] @@ -2046,6 +2743,12 @@ uuid = "4607b0f0-06f3-5cda-b6b1-a6196a1729e9" deps = ["Dates"] uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +[[TableOperations]] +deps = ["SentinelArrays", "Tables", "Test"] +git-tree-sha1 = "e383c87cf2a1dc41fa30c093b2a19877c83e1bc1" +uuid = "ab02a1b2-a7df-11e8-156e-fb1833f50b87" +version = "1.2.0" + [[TableTraits]] deps = ["IteratorInterfaceExtensions"] git-tree-sha1 = "c06b2f539df1c6efa794486abfb6ed2022561a39" @@ -2101,6 +2804,18 @@ git-tree-sha1 = "66d72dc6fcc86352f01676e8f0f698562e60510f" uuid = "2381bf8a-dfd0-557d-9999-79630e7b1b91" version = "1.23.0+0" +[[Widgets]] +deps = ["Colors", "Dates", "Observables", "OrderedCollections"] +git-tree-sha1 = "80661f59d28714632132c73779f8becc19a113f2" +uuid = "cc8bc4a8-27d6-5769-a93b-9d913e69aa62" +version = "0.6.4" + +[[WoodburyMatrices]] +deps = ["LinearAlgebra", "SparseArrays"] +git-tree-sha1 = "de67fa59e33ad156a590055375a30b23c40299d3" +uuid = "efce3f68-66dc-5838-9240-27a6d6f5f9b6" +version = "0.5.5" + [[XML2_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "Zlib_jll"] git-tree-sha1 = "1acf5bdf07aa0907e0a37d3718bb88d4b687b74a" @@ -2302,7 +3017,8 @@ version = "0.9.1+5" # ╔═╡ Cell order: # ╠═0efef0ae-1de8-40e0-b689-e473ef9183e8 -# ╠═40272dcb-7ff1-4a5d-b201-9dc548d81d8c +# ╟─40272dcb-7ff1-4a5d-b201-9dc548d81d8c +# ╟─facf73a4-255a-4bf3-baa0-ef20f692e0bd # ╟─55d82d37-b380-44a5-a234-504329b58e3f # ╟─fb5e61c6-aae4-42c1-a088-ce87afe3ea01 # ╟─f614543b-ccea-401e-a0ad-a74eb9076b40 @@ -2317,14 +3033,14 @@ version = "0.9.1+5" # ╟─91106045-43a1-427c-a300-e5200ad112ff # ╟─8663be81-9919-46a8-977a-1c11bbed0f73 # ╟─6992e045-0daf-46bf-a17d-62ca7945e4af -# ╠═4862cfb9-364b-4d34-9a30-38ce48ce069d +# ╟─4862cfb9-364b-4d34-9a30-38ce48ce069d # ╟─2cb438ee-ae5e-4421-bf5c-369154aaef81 +# ╟─0f532a5b-741e-4c7c-8742-6108859ebd58 # ╠═ab975494-0a3e-46fe-b3cb-74fa87010018 # ╟─c9a1e998-a378-4d59-90c5-138257ac439e # ╟─1d12c6dd-7f0a-458c-ad43-9ffdc98acf31 # ╟─60c3954b-d519-4f2b-9faa-efe85e34f774 # ╟─daf5a973-e73e-4a2b-8c6a-15a60f461a07 -# ╟─787210f9-0ead-481d-a1ba-cc91cc7347cc # ╠═72b1f589-cae8-4ffb-a4d7-a50aeb1898ce # ╟─f595c7ab-5b6e-441a-b7b3-c804e8e0c7ab # ╟─79428f16-504e-4551-8289-83e5b86f53e2 @@ -2333,41 +3049,37 @@ version = "0.9.1+5" # ╠═d8497cde-7c0c-4e7e-91e0-6afb8d8cb411 # ╟─c722ed1a-83dd-4634-ad4c-4d59738db97a # ╟─af816df6-6212-44bf-9301-a3dc4e7bf764 +# ╟─d0170f42-ce09-41c6-a7e4-86fbca1749ab +# ╟─306f5d53-df88-4af3-bbec-25c947c0cb9f +# ╠═6600061c-d18e-4699-beec-adb58de12f41 +# ╟─ea6fb2f4-6455-44af-a574-3768bad151a9 +# ╟─49a07a3d-51fa-4f38-b33d-e5127e744b04 +# ╠═36a3a18f-7537-46cc-b4f4-1551ae939be5 +# ╟─bad4cc28-ad6a-4d1e-9b72-642f394f2374 +# ╟─c2e2ec60-4433-43b9-b08e-ecb577900bc4 +# ╟─6583d269-9eab-4a0c-b81e-a25d18b3a5c8 +# ╟─f9f4361c-ec29-4055-a1da-d3b0f5a20295 +# ╟─ba12b93e-83d2-4c8d-91d9-ff98afff6f10 +# ╟─6fb1c386-ef44-458e-b3f5-8929309758eb +# ╟─60cecddd-601e-4113-90c5-19d3d045136a +# ╟─1b5114d9-37b0-469a-ab16-02574a5803a0 +# ╟─95f1d794-fba6-4743-862b-e2c0a5a0e1ed +# ╟─bfef39eb-e71f-4342-b0b8-6357d00f96c6 +# ╟─ed950215-5b2c-4216-b377-881b094f5c91 +# ╟─96d04bb5-b8db-4fb3-b4b0-64150fb76a99 +# ╟─67ded75a-be8a-4989-976b-d0d9e6b1a3e1 # ╟─094c3ae9-7af0-4dc4-874e-fdad2c18c10d -# ╟─16a13599-bdef-4d23-82e9-905fff10dccc -# ╟─d56b8eda-3629-4ed3-9960-0ff1dbf713de -# ╟─a2da2e63-26af-4e86-b968-674727484e47 -# ╟─96233615-fe85-40cf-8a76-303cc67338c4 -# ╟─f7c5026a-0bd0-428b-a339-dfff7865997d -# ╟─280122cc-54ec-4235-821d-815f7ab4f1cc -# ╠═5e62b60e-6c00-11ec-34fa-4b57e5168947 -# ╟─0762d6d0-31c1-4ae3-b76f-0f6aeb5ed27b -# ╠═a965ba28-6a8a-48a3-a298-db151b7af80b # ╟─f6e1875e-8780-457b-b7bc-beff24c5ceb9 # ╠═955d45f8-6040-4904-9fc9-ff13ffa41193 # ╟─f13d0c05-44bc-41aa-9476-3f8cd74200f1 -# ╟─5856285d-12a2-40f5-b321-034174ef7e6d -# ╠═0cebe58b-f1b2-4220-b15c-0f844cf22057 +# ╟─1a2cc51d-b97f-4192-9284-f94eff0853ba +# ╟─af296256-6662-49e9-b24d-c8550ce39c8d +# ╟─0cebe58b-f1b2-4220-b15c-0f844cf22057 +# ╟─0241a8e7-2810-488e-bbc2-38c3da9a431e # ╟─3f9ee27d-f128-4d42-a144-d3f8856de4d3 -# ╠═d1dca62c-788e-4d20-a528-dcb8f39a3d53 -# ╠═a48e1156-fc46-4b58-b971-9b65b348d64b -# ╠═e6a3536e-dfc1-494b-9b46-c33e22ed79f0 -# ╠═61b48e5d-5be4-4f03-9c5e-c2bfc5b6419a -# ╟─b29ce423-a267-4290-b31b-e5ef4f64a56d -# ╠═f9548ad3-ce2e-413a-a548-bfe35b7e811f -# ╠═192e8eeb-0514-4792-ba60-90f1f3207c0a -# ╠═e7f7e1d8-bbb0-4f5d-ac95-dec895527a52 -# ╟─679beed3-fa57-4bb0-95a8-ca5198f07938 -# ╠═26f3b743-b7a1-43e8-b07f-1b4e3ebb42fb -# ╠═874bcad6-cf73-417a-82e6-093c6bcdd0d8 -# ╟─40167574-d958-49a8-bfcc-59f95f98e7a1 -# ╠═a071b8d5-f938-42a7-92e6-9883ad90aa09 -# ╠═772f6482-2679-4672-97f5-96468c468f68 -# ╠═3762e4c0-63a5-40d3-beab-0db781d83af0 -# ╟─fff32e43-8c5c-416f-9734-b356478d17ab -# ╠═e4c3ed05-38ef-4440-82ac-c2a41616ad12 -# ╠═8a7a9e2a-ad0a-4996-9057-ccc05d5ff577 -# ╠═83011d1f-d9c7-472e-b9b3-98b11a072df5 -# ╠═a476cff9-e37d-4e21-a205-6b003bd04c62 +# ╟─5e62b60e-6c00-11ec-34fa-4b57e5168947 +# ╟─d1dca62c-788e-4d20-a528-dcb8f39a3d53 +# ╟─a48e1156-fc46-4b58-b971-9b65b348d64b +# ╟─e6a3536e-dfc1-494b-9b46-c33e22ed79f0 # ╟─00000000-0000-0000-0000-000000000001 # ╟─00000000-0000-0000-0000-000000000002 From 39f3e6a2fe45651caf5840becc8c052bb8c7fe0d Mon Sep 17 00:00:00 2001 From: NatanTourne <71643946+NatanTourne@users.noreply.github.com> Date: Sun, 30 Jan 2022 21:11:48 +0100 Subject: [PATCH 5/8] Add files via upload --- readme_figure.gif | Bin 0 -> 261013 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 readme_figure.gif diff --git a/readme_figure.gif b/readme_figure.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6c1fbc735a2901453d92a6fe8b94695dba4beb3 GIT binary patch literal 261013 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

Yn2~y8>pK)+Ds;iU@yaf`w{`bDmEV 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∋Zc7={zJOAITd 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ⅈviWnypIsgYM}dEfuuLv@?WhFj0Bv<2g+@ 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 Date: Sun, 30 Jan 2022 21:15:32 +0100 Subject: [PATCH 6/8] Update README.md --- README.md | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e2ced9a6..ca21509e 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,21 @@ -# STMO-ZOO +# STMO-ZOO: Slime Mould Algorithm (SMA) +**By Natan Tourne** -Welcome to the STMO zoo! This is your final assignment for the course Selected Topics in Mathematical Optimization. Your goal is to implement an optimization method in Julia and contribute this to this repository. To pass, you have to: +![slime2](https://biohaviour.com/wp-content/uploads/2020/11/SlimeMold.gif) -- fork this repo and create a pull request; -- add a module to `src` with **at least one function** -- add at least one unit test to the folder `test`; -- document all your functions and add a page to the documentation page; -- make a notebook in [Pluto](https://github.com/fonsp/Pluto.jl) and add it to `notebooks`; -- perform a small code review of two other students. +Physarum polycephalum, an acelular slime mold, is well known for its problem solving abilities. In this notebook we explore the Slime Mold Algorithm (SMA) which attempts to replicate this organisms special properties and use it to solve a wider array of problems. We will first look at the biological background and then explore the mathematical background of the algorithm. Finally, we will investigate its performance and compare it to modified versions of the algorithm. -Depending on the project you choose some of these individual assignments might be really minimalistic, with other parts larger. For example, if you want to develop an application, say solving the graph coloring problem with Tabu Search, you might have only a single function in the source code (e.g., generating an instance) but have a fairly large notebook with a tutorial. On the other hand, if you work on a method, e.g., implementing Bee Colony Optimization, you might have many functions in the source code, while your notebook is only a demonstration on the test functions. +**Note: The notebook requires a few minutes to generate the figures when first opened. Some of the cells have been dissabled by default to reduce this problem.** -[![Build Status](https://travis-ci.org/MichielStock/STMOZOO.svg?branch=master)](https://travis-ci.org/MichielStock/STMOZOO)[![Coverage Status](https://coveralls.io/repos/github/MichielStock/STMOZOO/badge.svg?branch=master)](https://coveralls.io/github/MichielStock/STMOZOO?branch=master) \ No newline at end of file +![preview](https://raw.githubusercontent.com/NatanTourne/STMOZOO/master/readme_figure.gif) + +The notebooks requires the following packages: + - Random + - Distributions + - PlutoUI + - StatsBase + - Plots + - StatsPlots + + +[![Build Status](https://travis-ci.org/MichielStock/STMOZOO.svg?branch=master)](https://travis-ci.org/MichielStock/STMOZOO)[![Coverage Status](https://coveralls.io/repos/github/MichielStock/STMOZOO/badge.svg?branch=master)](https://coveralls.io/github/MichielStock/STMOZOO?branch=master) From d4f4f45a0aa741b4778ba1115b76cbb844efb153 Mon Sep 17 00:00:00 2001 From: NatanTourne <71643946+NatanTourne@users.noreply.github.com> Date: Sun, 30 Jan 2022 21:19:31 +0100 Subject: [PATCH 7/8] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ca21509e..faa93a4f 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,9 @@ ![slime2](https://biohaviour.com/wp-content/uploads/2020/11/SlimeMold.gif) -Physarum polycephalum, an acelular slime mold, is well known for its problem solving abilities. In this notebook we explore the Slime Mold Algorithm (SMA) which attempts to replicate this organisms special properties and use it to solve a wider array of problems. We will first look at the biological background and then explore the mathematical background of the algorithm. Finally, we will investigate its performance and compare it to modified versions of the algorithm. +Physarum polycephalum, an acellular slime mold, is well known for its problem-solving abilities. In this notebook, we explore the Slime Mold Algorithm (SMA) which attempts to replicate this organism's special properties and use it to solve a wider array of problems. We will first look at the biological background and then explore the mathematical background of the algorithm. Finally, we will investigate its performance and compare it to modified versions of the algorithm. -**Note: The notebook requires a few minutes to generate the figures when first opened. Some of the cells have been dissabled by default to reduce this problem.** +**Note: The notebook requires a few minutes to generate the figures when first opened. Some of the cells have been disabled by default to reduce this problem.** ![preview](https://raw.githubusercontent.com/NatanTourne/STMOZOO/master/readme_figure.gif) From aba47b664b666129c222172780405f793d7068a4 Mon Sep 17 00:00:00 2001 From: NatanTourne <71643946+NatanTourne@users.noreply.github.com> Date: Mon, 31 Jan 2022 17:36:54 +0100 Subject: [PATCH 8/8] Add files via upload --- notebook/SMA.jl | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/notebook/SMA.jl b/notebook/SMA.jl index f9195438..02bd9a05 100644 --- a/notebook/SMA.jl +++ b/notebook/SMA.jl @@ -28,16 +28,15 @@ md""" ## The Slime Mold ### Background -Slime Molds are a group of **Amoebozoa** (protists) classified under the infraphylum **Mycetozoa**, although the term has been used less strictly in the past. Within this group, there are three classes: **Myxogastria, Dictyosteliida, and Protosteloids**. (This classification is still disputed and likely to change.) +Slime Molds are a group of **Amoebozoa** (protists) classified under the infraphylum **Mycetozoa**, although the term has been used less strictly in the past. Within this group, there are three classes: **Myxogastria, Dictyosteliida, and Protosteloids**. (This classification is still disputed and likely to change.) While a species of the Myxogastria group is the subject of this notebook, we will quickly look at the others' weird properties as well. Slime molds are noted because of their special characteristics. Slime molds from the Protosteloids group are amoebae capable of making fruiting bodies and spores. Species from the group Dicotyosteliida are referred to as **cellular** slime molds. When food is available they feed and divide as normal unicellular amoebae. However, when food becomes limited these individuals aggregate to form a **pseudoplasmodium** or **grex**. This multicellular complex can then move like a slug with a greatly increased capacity to migrate. When conditions are suitable this grex differentiates further into a **sorocarp** or fruiting body used to spread spores. This unique life cycle (shown in the figure) challenges the concepts of unicellularity, multicellularity, and what makes up an individual. - +(**Note: This figure is included because it is interesting. This is not the life cycle of the organism of interest!**) ![Dictyostelium Life Cycle](https://upload.wikimedia.org/wikipedia/commons/thumb/8/81/Dicty_Life_Cycle_H01.svg/1024px-Dicty_Life_Cycle_H01.svg.png) -Lastly, the species in the group of Myxogastria are known as **acellular** slime molds. They can have multiple different morphological phases like microscopic individual cells, and fruiting bodies, but they are most recognized in their slimy amorphous form shown in the figure. Despite their ability to grow to a size of up to a meter and weigh multiple kg's, they are still made up of only a single cell. **Physarum polycephalum**, a species from this last group, will be the focus of this work. - +Lastly, the species in the group of Myxogastria are known as **acellular** slime molds and are the real stars of the show. They can have multiple different morphological phases like microscopic individual cells, and fruiting bodies, but they are most recognized in their slimy amorphous form shown in the figure. Despite their ability to grow to a size of up to a meter and weigh multiple kg's, they are still made up of only a **single cell**! **Physarum polycephalum**, a species from this last group, will be the focus of this work. ![slime](https://upload.wikimedia.org/wikipedia/commons/6/6d/Physarum_polycephalum_plasmodium.jpg) ### Problem Solving @@ -3054,7 +3053,7 @@ version = "0.9.1+5" # ╠═6600061c-d18e-4699-beec-adb58de12f41 # ╟─ea6fb2f4-6455-44af-a574-3768bad151a9 # ╟─49a07a3d-51fa-4f38-b33d-e5127e744b04 -# ╠═36a3a18f-7537-46cc-b4f4-1551ae939be5 +# ╟─36a3a18f-7537-46cc-b4f4-1551ae939be5 # ╟─bad4cc28-ad6a-4d1e-9b72-642f394f2374 # ╟─c2e2ec60-4433-43b9-b08e-ecb577900bc4 # ╟─6583d269-9eab-4a0c-b81e-a25d18b3a5c8