Slide 1

Slide 1 text

[email protected] @BWKnopper github.com/bknopper Evolutionary Algorithms: How to Go Darwin

Slide 2

Slide 2 text

[email protected] @BWKnopper github.com/bknopper 2

Slide 3

Slide 3 text

[email protected] @BWKnopper github.com/bknopper 3

Slide 4

Slide 4 text

[email protected] @BWKnopper github.com/bknopper 4

Slide 5

Slide 5 text

[email protected] @BWKnopper github.com/bknopper Let me introduce myself… • Bas W. Knopper • Dutch • JavaOne, J-Fall, GeeCon, JFokus Speaker • AI enthousiast • Soft spot for EvolutionaryAlgorithms • (Java) Developer • Managing Partner @ JCore

Slide 6

Slide 6 text

[email protected] @BWKnopper github.com/bknopper By Developers. For Developers. De missie van JCore is om ambitieuze Java Developers een traject te bieden waarmee ze sneller en beter Senior Java Developers kunnen worden. Wat (Java Consultancy) -> We helpen klanten met het realiseren van complexe IT projecten. Hoe Met ambitieuze en enthousiaste Java Consultants die een bijdrage leveren bij de klant. Waarom Vanuit een passie voor IT en het oplossen van complexe problemen.

Slide 7

Slide 7 text

[email protected] @BWKnopper github.com/bknopper What I would like to accomplish… • Interest • Understanding • How & when • Add to toolbox • Attention @DevFestNL #EvolutionaryAlgorithms #golang @BWKnopper

Slide 8

Slide 8 text

[email protected] @BWKnopper github.com/bknopper Agenda • Introduction • NASA • Evolution Concepts • Puzzle Solving Time: Traveling Salesman Problem • Evolutionary Algorithm Design • Go Code • Demo! • Frameworks • Checklist

Slide 9

Slide 9 text

[email protected] @BWKnopper github.com/bknopper NASA • Space Technology 5 mission • launched March 22, 2006, and completed June 20, 2006 • Three full service 25-kilogram-class spacecraft

Slide 10

Slide 10 text

[email protected] @BWKnopper github.com/bknopper NASA Continued • Needs even smaller antenna • That still functions according to spec • Need forsolution that’s not easy to engineer • So they used an EA that made these:

Slide 11

Slide 11 text

[email protected] @BWKnopper github.com/bknopper

Slide 12

Slide 12 text

[email protected] @BWKnopper github.com/bknopper Recap • Powerfulexample • First evolved object to travel through space • How?

Slide 13

Slide 13 text

[email protected] @BWKnopper github.com/bknopper Evolution

Slide 14

Slide 14 text

[email protected] @BWKnopper github.com/bknopper Evolution - “Survival of the fittest” Finite Resources Lifeforms with a basic instinct towards Reproduction Natural Selection

Slide 15

Slide 15 text

[email protected] @BWKnopper github.com/bknopper Recombination Mutation

Slide 16

Slide 16 text

[email protected] @BWKnopper github.com/bknopper Recombination Mutation

Slide 17

Slide 17 text

[email protected] @BWKnopper github.com/bknopper From evolution to problem solving Environment Problem Individual Candidate Solution

Slide 18

Slide 18 text

[email protected] @BWKnopper github.com/bknopper Puzzle solving time! • More down to earth example • TravellingSalesman Problem

Slide 19

Slide 19 text

[email protected] @BWKnopper github.com/bknopper Travelling Salesman Problem • Given n cities • n = number of cities to visit • Find (optimal) route for visiting all cities • Visit every city only once • Return to origin city • Search space is huge • For 30 cities there are 30! ≈ 10^32 possible routes That’s 100.000.000.000.000.000.000.000.000.000.000 possible routes! Brute force might not be the best solution…

Slide 20

Slide 20 text

[email protected] @BWKnopper github.com/bknopper Puzzle solving time! • More down to earth example • TravellingSalesman Problem • Use case to show you • EvolutionaryAlgorithm Design • Plain Go Code • Demo

Slide 21

Slide 21 text

[email protected] @BWKnopper github.com/bknopper • No GoPro(pun intended) • Big thanks to Rob Brinkman • Why then? Disclaimer

Slide 22

Slide 22 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions;

Slide 23

Slide 23 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions;

Slide 24

Slide 24 text

[email protected] @BWKnopper github.com/bknopper Candidate Solution - Representation • n = 6 • Label cities 1,2,3,4,5,6 • And base city 1 • Candidate Solution • Signifyingthe route • for n = 10 • Enables • Calculatingdistance (fitness function) • Mutation • Recombination 1 5 6 3 4 2 1 1 10 9 4 7 3 5 6 8 2 1

Slide 25

Slide 25 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions;

Slide 26

Slide 26 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions; EVALUATE each candidate;

Slide 27

Slide 27 text

[email protected] @BWKnopper github.com/bknopper Evaluation Function (Fitness Function) • Summed distance: • d1,2 + d2,4 + … + d5,1 • Used golang-geofor calculations • Minimize! 1 5 6 3 4 2 1

Slide 28

Slide 28 text

[email protected] @BWKnopper github.com/bknopper /** * Calculates the total distance of the whole route * and stores it as this candidate solution's fitness */ func (candidateSolution *CandidateSolution) calculateFitness() { }

Slide 29

Slide 29 text

[email protected] @BWKnopper github.com/bknopper /** * Calculates the total distance of the whole route * and stores it as this candidate solution's fitness */ func (candidateSolution *CandidateSolution) calculateFitness() { totalDistance := float64(0) for i := 0; i < (len(candidateSolution.Route) - 1); i++ { } candidateSolution.Fitness = totalDistance }

Slide 30

Slide 30 text

[email protected] @BWKnopper github.com/bknopper /** * Calculates the total distance of the whole route * and stores it as this candidate solution's fitness */ func (candidateSolution *CandidateSolution) calculateFitness() { totalDistance := float64(0) for i := 0; i < (len(candidateSolution.Route) - 1); i++ { city := candidateSolution.Route[i] nextCity := candidateSolution.Route[i + 1] totalDistance += city.calculateDistance(nextCity) } candidateSolution.Fitness = totalDistance }

Slide 31

Slide 31 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions; EVALUATE each candidate;

Slide 32

Slide 32 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions; EVALUATE each candidate; WHILE ( TERMINATION CONDITION is not satisfied ) { }

Slide 33

Slide 33 text

[email protected] @BWKnopper github.com/bknopper Figures from “Introduction toEvolutionary Computing” byA.E. Eiben & J.E. Smith (Springer) Termination Condition • EA’s are stochastic • May never find optimum

Slide 34

Slide 34 text

[email protected] @BWKnopper github.com/bknopper Termination Condition • Combination • Sure to terminate • Time • Max number of runs (generations) • Goal • Fitness threshold • Fitness improvementstagnation Figure from “Introduction to Evolutionary Computing” by A.E. Eiben & J.E. Smith (Springer)

Slide 35

Slide 35 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions; EVALUATE each candidate; WHILE ( TERMINATION CONDITION is not satisfied ) { }

Slide 36

Slide 36 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions; EVALUATE each candidate; WHILE ( TERMINATION CONDITION is not satisfied ) { 1 SELECT parents; }

Slide 37

Slide 37 text

[email protected] @BWKnopper github.com/bknopper Parent Selection • Where x is the number of parents: • Pick x best • Random x • Best xout of random y • In our example: • Best x out of random y

Slide 38

Slide 38 text

[email protected] @BWKnopper github.com/bknopper func (algorithm *Algorithm) parentSelection() CandidateSolutions {

Slide 39

Slide 39 text

[email protected] @BWKnopper github.com/bknopper func (algorithm *Algorithm) parentSelection() CandidateSolutions { tempPopulation := make(CandidateSolutions, algorithm.populationSize) copy(tempPopulation, algorithm.population) randomCandidates := make(CandidateSolutions, algorithm.parentPoolSize)

Slide 40

Slide 40 text

[email protected] @BWKnopper github.com/bknopper func (algorithm *Algorithm) parentSelection() CandidateSolutions { tempPopulation := make(CandidateSolutions, algorithm.populationSize) copy(tempPopulation, algorithm.population) randomCandidates := make(CandidateSolutions, algorithm.parentPoolSize) for i := 0; i < algorithm.parentPoolSize; i++ { /* pick random candidates */

Slide 41

Slide 41 text

[email protected] @BWKnopper github.com/bknopper func (algorithm *Algorithm) parentSelection() CandidateSolutions { tempPopulation := make(CandidateSolutions, algorithm.populationSize) copy(tempPopulation, algorithm.population) randomCandidates := make(CandidateSolutions, algorithm.parentPoolSize) for i := 0; i < algorithm.parentPoolSize; i++ { randomIndex := rand.Intn(len(tempPopulation)) randomCandidateSolution := tempPopulation[randomIndex]

Slide 42

Slide 42 text

[email protected] @BWKnopper github.com/bknopper func (algorithm *Algorithm) parentSelection() CandidateSolutions { tempPopulation := make(CandidateSolutions, algorithm.populationSize) copy(tempPopulation, algorithm.population) randomCandidates := make(CandidateSolutions, algorithm.parentPoolSize) for i := 0; i < algorithm.parentPoolSize; i++ { randomIndex := rand.Intn(len(tempPopulation)) randomCandidateSolution := tempPopulation[randomIndex] randomCandidates[i] = randomCandidateSolution

Slide 43

Slide 43 text

[email protected] @BWKnopper github.com/bknopper func (algorithm *Algorithm) parentSelection() CandidateSolutions { tempPopulation := make(CandidateSolutions, algorithm.populationSize) copy(tempPopulation, algorithm.population) randomCandidates := make(CandidateSolutions, algorithm.parentPoolSize) for i := 0; i < algorithm.parentPoolSize; i++ { randomIndex := rand.Intn(len(tempPopulation)) randomCandidateSolution := tempPopulation[randomIndex] randomCandidates[i] = randomCandidateSolution /* delete the candidate from the temp population, so we can't pick it again */ tempPopulation[randomIndex] = tempPopulation[len(tempPopulation)-1] tempPopulation = tempPopulation[:len(tempPopulation)-1] }

Slide 44

Slide 44 text

[email protected] @BWKnopper github.com/bknopper func (algorithm *Algorithm) parentSelection() CandidateSolutions { tempPopulation := make(CandidateSolutions, algorithm.populationSize) copy(tempPopulation, algorithm.population) randomCandidates := make(CandidateSolutions, algorithm.parentPoolSize) for i := 0; i < algorithm.parentPoolSize; i++ { randomIndex := rand.Intn(len(tempPopulation)) randomCandidateSolution := tempPopulation[randomIndex] randomCandidates[i] = randomCandidateSolution /* delete the candidate from the temp population, so we can't pick it again */ tempPopulation[randomIndex] = tempPopulation[len(tempPopulation)-1] tempPopulation = tempPopulation[:len(tempPopulation)-1] } /* Sort the population so that the best candidates are up front */ sort.Sort(randomCandidates)

Slide 45

Slide 45 text

[email protected] @BWKnopper github.com/bknopper func (algorithm *Algorithm) parentSelection() CandidateSolutions { tempPopulation := make(CandidateSolutions, algorithm.populationSize) copy(tempPopulation, algorithm.population) randomCandidates := make(CandidateSolutions, algorithm.parentPoolSize) for i := 0; i < algorithm.parentPoolSize; i++ { randomIndex := rand.Intn(len(tempPopulation)) randomCandidateSolution := tempPopulation[randomIndex] randomCandidates[i] = randomCandidateSolution /* delete the candidate from the temp population, so we can't pick it again */ tempPopulation[randomIndex] = tempPopulation[len(tempPopulation)-1] tempPopulation = tempPopulation[:len(tempPopulation)-1] } /* Sort the population so that the best candidates are up front */ sort.Sort(randomCandidates) /* return a list with size parentSelectionSize with the best CandidateSolutions */ return randomCandidates[0:algorithm.parentSelectionSize] }

Slide 46

Slide 46 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions; EVALUATE each candidate; WHILE ( TERMINATION CONDITION is not satisfied ) { 1 SELECT parents; }

Slide 47

Slide 47 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions; EVALUATE each candidate; WHILE ( TERMINATION CONDITION is not satisfied ) { 1 SELECT parents; 2 RECOMBINE pairs of parents; }

Slide 48

Slide 48 text

[email protected] @BWKnopper github.com/bknopper Recombination • In our example: • half-half does not work • “Cut-and-crossfill” 1 6 5 3 4 2 1 1 4 2 1 1 2 4 5 6 3 1 1 5 4 2 1 1 3 5 4 2 1 1 6 3 5 4 2 1 1 4 2 5 6 3 1 1 2 4 5 6 3 1 1 2 4 5 6 3 1 1 2 4 5 6 3 1

Slide 49

Slide 49 text

[email protected] @BWKnopper github.com/bknopper func (candidateSolution *CandidateSolution) recombine(otherParent CandidateSolution) CandidateSolutions {

Slide 50

Slide 50 text

[email protected] @BWKnopper github.com/bknopper func (candidateSolution *CandidateSolution) recombine(otherParent CandidateSolution) CandidateSolutions { /* get routes of both parents */ parentRoute1 := candidateSolution.VisitingCities parentRoute2 := otherParent.VisitingCities

Slide 51

Slide 51 text

[email protected] @BWKnopper github.com/bknopper func (candidateSolution *CandidateSolution) recombine(otherParent CandidateSolution) CandidateSolutions { /* get routes of both parents */ parentRoute1 := candidateSolution.VisitingCities parentRoute2 := otherParent.VisitingCities /* randomize cutIndex for "cross-and-fill point" */ cutIndex := int32(rand.Intn(len(parentRoute1)))

Slide 52

Slide 52 text

[email protected] @BWKnopper github.com/bknopper func (candidateSolution *CandidateSolution) recombine(otherParent CandidateSolution) CandidateSolutions { /* get routes of both parents */ parentRoute1 := candidateSolution.VisitingCities parentRoute2 := otherParent.VisitingCities /* randomize cutIndex for "cross-and-fill point" */ cutIndex := int32(rand.Intn(len(parentRoute1))) /* initialize the routes for the children */ childRoute1 := make(Cities, len(parentRoute1)) childRoute2 := make(Cities, len(parentRoute1))

Slide 53

Slide 53 text

[email protected] @BWKnopper github.com/bknopper func (candidateSolution *CandidateSolution) recombine(otherParent CandidateSolution) CandidateSolutions { /* get routes of both parents */ parentRoute1 := candidateSolution.VisitingCities parentRoute2 := otherParent.VisitingCities /* randomize cutIndex for "cross-and-fill point" */ cutIndex := int32(rand.Intn(len(parentRoute1))) /* initialize the routes for the children */ childRoute1 := make(Cities, len(parentRoute1)) childRoute2 := make(Cities, len(parentRoute1)) /* get the first part of both parent routes using the cut index */ partRoute1 := parentRoute1[0:cutIndex] partRoute2 := parentRoute2[0:cutIndex]

Slide 54

Slide 54 text

[email protected] @BWKnopper github.com/bknopper func (candidateSolution *CandidateSolution) recombine(otherParent CandidateSolution) CandidateSolutions { /* get routes of both parents */ parentRoute1 := candidateSolution.VisitingCities parentRoute2 := otherParent.VisitingCities /* randomize cutIndex for "cross-and-fill point" */ cutIndex := int32(rand.Intn(len(parentRoute1))) /* initialize the routes for the children */ childRoute1 := make(Cities, len(parentRoute1)) childRoute2 := make(Cities, len(parentRoute1)) /* get the first part of both parent routes using the cut index */ partRoute1 := parentRoute1[0:cutIndex] partRoute2 := parentRoute2[0:cutIndex] /* copy the first part of the parents cut into the children */ copy(childRoute1, partRoute1) copy(childRoute2, partRoute2)

Slide 55

Slide 55 text

[email protected] @BWKnopper github.com/bknopper func (candidateSolution *CandidateSolution) recombine(otherParent CandidateSolution) CandidateSolutions { /* get routes of both parents */ parentRoute1 := candidateSolution.VisitingCities parentRoute2 := otherParent.VisitingCities /* randomize cutIndex for "cross-and-fill point" */ cutIndex := int32(rand.Intn(len(parentRoute1))) /* initialize the routes for the children */ childRoute1 := make(Cities, len(parentRoute1)) childRoute2 := make(Cities, len(parentRoute1)) /* get the first part of both parent routes using the cut index */ partRoute1 := parentRoute1[0:cutIndex] partRoute2 := parentRoute2[0:cutIndex] /* copy the first part of the parents cut into the children */ copy(childRoute1, partRoute1) copy(childRoute2, partRoute2) candidateSolution.crossFill(childRoute1, parentRoute2, cutIndex) candidateSolution.crossFill(childRoute2, parentRoute1, cutIndex)

Slide 56

Slide 56 text

[email protected] @BWKnopper github.com/bknopper func (candidateSolution *CandidateSolution) recombine(otherParent CandidateSolution) CandidateSolutions { /* get routes of both parents */ parentRoute1 := candidateSolution.VisitingCities parentRoute2 := otherParent.VisitingCities /* randomize cutIndex for "cross-and-fill point" */ cutIndex := int32(rand.Intn(len(parentRoute1))) /* initialize the routes for the children */ childRoute1 := make(Cities, len(parentRoute1)) childRoute2 := make(Cities, len(parentRoute1)) /* get the first part of both parent routes using the cut index */ partRoute1 := parentRoute1[0:cutIndex] partRoute2 := parentRoute2[0:cutIndex] /* copy the first part of the parents cut into the children */ copy(childRoute1, partRoute1) copy(childRoute2, partRoute2) candidateSolution.crossFill(childRoute1, parentRoute2, cutIndex) candidateSolution.crossFill(childRoute2, parentRoute1, cutIndex) /* create new children using the new children routes */ child1 := NewCandidateSolution(getBaseCity(), childRoute1); child2 := NewCandidateSolution(getBaseCity(), childRoute2); /* put the children in a list and return it */ return CandidateSolutions{child1, child2} }

Slide 57

Slide 57 text

[email protected] @BWKnopper github.com/bknopper /** * Check the rest of the route in the crossing parent and add the cities that are not yet in the child * (in the order of the route of the crossing parent) */ func (candidateSolution *CandidateSolution) crossFill(childRoute Cities, parentRoute []City, cutIndex int32) {

Slide 58

Slide 58 text

[email protected] @BWKnopper github.com/bknopper /** * Check the rest of the route in the crossing parent and add the cities that are not yet in the child * (in the order of the route of the crossing parent) */ func (candidateSolution *CandidateSolution) crossFill(childRoute Cities, parentRoute []City, cutIndex int32) { /* * traverse the parent route from the cut index on and add every city * not yet in the child to the child */ childRouteIndex := cutIndex for i := cutIndex; i < int32(len(parentRoute)); i++ { nextCityOnRoute := parentRoute[i] if (!childRoute.contains(nextCityOnRoute)) { childRoute[childRouteIndex] = nextCityOnRoute childRouteIndex++ } } 1 4 2 5 6 3 1

Slide 59

Slide 59 text

[email protected] @BWKnopper github.com/bknopper /** * Check the rest of the route in the crossing parent and add the cities that are not yet in the child * (in the order of the route of the crossing parent) */ func (candidateSolution *CandidateSolution) crossFill(childRoute Cities, parentRoute []City, cutIndex int32) { /* * traverse the parent route from the cut index on and add every city * not yet in the child to the child */ childRouteIndex := cutIndex for i := cutIndex; i < int32(len(parentRoute)); i++ { nextCityOnRoute := parentRoute[i] if (!childRoute.contains(nextCityOnRoute)) { childRoute[childRouteIndex] = nextCityOnRoute childRouteIndex++ } } /* * traverse the parent route from the start of the route and add every * city not yet in the child to the child */ for i := 0; i < int(cutIndex); i++ { nextCityOnRoute := parentRoute[i] if (!childRoute.contains(nextCityOnRoute)) { childRoute[childRouteIndex] = nextCityOnRoute childRouteIndex++ } } } 1 4 2 5 6 3 1 1 4 2 5 6 3 1

Slide 60

Slide 60 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions; EVALUATE each candidate; WHILE ( TERMINATION CONDITION is not satisfied ) { 1 SELECT parents; 2 RECOMBINE pairs of parents; }

Slide 61

Slide 61 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions; EVALUATE each candidate; WHILE ( TERMINATION CONDITION is not satisfied ) { 1 SELECT parents; 2 RECOMBINE pairs of parents; 3 MUTATE the resulting offspring; }

Slide 62

Slide 62 text

[email protected] @BWKnopper github.com/bknopper 1 6 5 3 4 2 1 Mutation • Change of nr won’t work • Infeasiblecandidate solution • Swap to the rescue! 1 6 5 3 4 2 1 1 2 5 3 4 6 1

Slide 63

Slide 63 text

[email protected] @BWKnopper github.com/bknopper func (candidateSolution *CandidateSolution) mutate() { 1 6 5 3 4 2 1

Slide 64

Slide 64 text

[email protected] @BWKnopper github.com/bknopper func (candidateSolution *CandidateSolution) mutate() { /* randomly select two indices in the route */ indexFirstCity := int32(rand.Intn(len(candidateSolution.VisitingCities))) indexSecondCity := int32(rand.Intn(len(candidateSolution.VisitingCities))) 1 6 5 3 4 2 1 1 6 5 3 4 2 1

Slide 65

Slide 65 text

[email protected] @BWKnopper github.com/bknopper func (candidateSolution *CandidateSolution) mutate() { /* randomly select two indices in the route */ indexFirstCity := int32(rand.Intn(len(candidateSolution.VisitingCities))) indexSecondCity := int32(rand.Intn(len(candidateSolution.VisitingCities))) /* Make sure they are different */ for (indexFirstCity == indexSecondCity) { indexSecondCity = int32(rand.Intn(len(candidateSolution.VisitingCities))) } 1 6 5 3 4 2 1 1 6 5 3 4 2 1

Slide 66

Slide 66 text

[email protected] @BWKnopper github.com/bknopper func (candidateSolution *CandidateSolution) mutate() { /* randomly select two indices in the route */ indexFirstCity := int32(rand.Intn(len(candidateSolution.VisitingCities))) indexSecondCity := int32(rand.Intn(len(candidateSolution.VisitingCities))) /* Make sure they are different */ for (indexFirstCity == indexSecondCity) { indexSecondCity = int32(rand.Intn(len(candidateSolution.VisitingCities))) } /* Retrieve the cities */ firstCity := candidateSolution.VisitingCities[indexFirstCity] secondCity := candidateSolution.VisitingCities[indexSecondCity] 1 6 5 3 4 2 1 1 6 5 3 4 2 1

Slide 67

Slide 67 text

[email protected] @BWKnopper github.com/bknopper func (candidateSolution *CandidateSolution) mutate() { /* randomly select two indices in the route */ indexFirstCity := int32(rand.Intn(len(candidateSolution.VisitingCities))) indexSecondCity := int32(rand.Intn(len(candidateSolution.VisitingCities))) /* Make sure they are different */ for (indexFirstCity == indexSecondCity) { indexSecondCity = int32(rand.Intn(len(candidateSolution.VisitingCities))) } /* Retrieve the cities */ firstCity := candidateSolution.VisitingCities[indexFirstCity] secondCity := candidateSolution.VisitingCities[indexSecondCity] /* Changer! */ candidateSolution.VisitingCities[indexFirstCity] = secondCity candidateSolution.VisitingCities[indexFirstCity] = firstCity } 1 2 5 3 4 6 1 1 6 5 3 4 2 1 1 6 5 3 4 2 1

Slide 68

Slide 68 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions; EVALUATE each candidate; WHILE ( TERMINATION CONDITION is not satisfied ) { 1 SELECT parents; 2 RECOMBINE pairs of parents; 3 MUTATE the resulting offspring; }

Slide 69

Slide 69 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions; EVALUATE each candidate; WHILE ( TERMINATION CONDITION is not satisfied ) { 1 SELECT parents; 2 RECOMBINE pairs of parents; 3 MUTATE the resulting offspring; 4 EVALUATE new candidates; }

Slide 70

Slide 70 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions; EVALUATE each candidate; WHILE ( TERMINATION CONDITION is not satisfied ) { 1 SELECT parents; 2 RECOMBINE pairs of parents; 3 MUTATE the resulting offspring; 4 EVALUATE new candidates; 5 SELECT individuals for the next generation; }

Slide 71

Slide 71 text

[email protected] @BWKnopper github.com/bknopper Survivor Selection • Replacement Strategy • Do nothing • Replace Worst

Slide 72

Slide 72 text

[email protected] @BWKnopper github.com/bknopper /** * Selects the survivors by removing the worst candidate * solutions from the list, so we have the original * population size again */ func (algorithm *Algorithm) selectSurvivors() { }

Slide 73

Slide 73 text

[email protected] @BWKnopper github.com/bknopper /** * Selects the survivors by removing the worst candidate * solutions from the list, so we have the original * population size again */ func (algorithm *Algorithm) selectSurvivors() { sort.Sort(algorithm.population) }

Slide 74

Slide 74 text

[email protected] @BWKnopper github.com/bknopper /** * Selects the survivors by removing the worst candidate * solutions from the list, so we have the original * population size again */ func (algorithm *Algorithm) selectSurvivors() { sort.Sort(algorithm.population) algorithm.population = algorithm.population[:algorithm.populationSize] }

Slide 75

Slide 75 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE population with random candidate solutions; EVALUATE each candidate; WHILE ( TERMINATION CONDITION is not satisfied ) { 1 SELECT parents; 2 RECOMBINE pairs of parents; 3 MUTATE the resulting offspring; 4 EVALUATE new candidates; 5 SELECT individuals for the next generation; }

Slide 76

Slide 76 text

[email protected] @BWKnopper github.com/bknopper Tuning… • Mutation probability • Population size • Nr of offspring • Termination condition (# runs or fitness) • Parent selection • Survival selection • Initialisation • Random

Slide 77

Slide 77 text

[email protected] @BWKnopper github.com/bknopper EA Behavior Figures from “Introduction to Evolutionary Computing” by A.E. Eiben & J.E. Smith (Springer)

Slide 78

Slide 78 text

[email protected] @BWKnopper github.com/bknopper Demo! https://github.com/bknopper/TSPEvolutionaryAlgorithmsDemo.git

Slide 79

Slide 79 text

[email protected] @BWKnopper github.com/bknopper With great power comes great responsibility • I’m sure I cannot find a solution using a brute-force approach? • (within a reasonable amountof time) • Am I facing an optimization or search problem? • Can I encode a candidate solution to the problem? • Representationpossible? • Can I determine the fitness of a candidate solution?

Slide 80

Slide 80 text

[email protected] @BWKnopper github.com/bknopper Literature

Slide 81

Slide 81 text

[email protected] @BWKnopper github.com/bknopper

Slide 82

Slide 82 text

[email protected] @BWKnopper github.com/bknopper Additional questions? • Contact me on @BWKnopper • Google it! • There’slotstofind… • Papers • Demo’s

Slide 83

Slide 83 text

[email protected] @BWKnopper github.com/bknopper Slide 83 of 68

Slide 84

Slide 84 text

[email protected] @BWKnopper github.com/bknopper