Slide 1

Slide 1 text

[email protected] @BWKnopper github.com/bknopper MAKING DARWIN PROUD Coding Evolutionary Algorithms

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 Evolutionary Algorithms • 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 #devmotion #EvolutionaryAlgorithms @BWKnopper @JCore_nl

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 • Plain Java 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 for solution 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 • Powerful example • First evolvedobject to travel throughspace • 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 • Travelling Salesman 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 • Travelling Salesman Problem • Use case to show you • Evolutionary Algorithm Design • Plain Java Code • Demo

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 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 • Signifying the route • for n = 10 • Enables • Calculating distance (fitness function) • Mutation • Recombination 1 5 6 3 4 2 1 1 10 9 4 7 3 5 6 8 2 1

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

[email protected] @BWKnopper github.com/bknopper Evaluation Function (Fitness Function) • Summeddistance: • d1,2 + d2,4 + … + d5,1 • Used NASA WorldWind • Minimize! 1 5 6 3 4 2 1

Slide 27

Slide 27 text

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

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 */ private void calculateFitness() { /* initialize total distance */ double totalDistance = 0; /* calculate total distance */ /* store totalDistance as this candidate solution's fitness */ this.fitness = totalDistance; }

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 */ private void calculateFitness() { /* initialize total distance */ double totalDistance = 0; /* * For all Cities in the route (except the last one) get the distance between this * City and the next and add it to the totalDistance */ for (int i = 0; i < route.size() - 1; i++) { } /* store totalDistance as this candidate solution's fitness */ this.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 */ private void calculateFitness() { /* initialize total distance */ double totalDistance = 0; /* * For all Cities in the route (except the last one) get the distance between this * City and the next and add it to the totalDistance */ for (int i = 0; i < route.size() - 1; i++) { City city = route.get(i); City nextCity = route.get(i + 1); totalDistance += city.calculateDistance(nextCity); } /* store totalDistance as this candidate solution's fitness */ this.fitness = totalDistance; }

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

[email protected] @BWKnopper github.com/bknopper Figuresfrom “Introduction to EvolutionaryComputing” 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 improvement stagnation 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 populationwith 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 populationwith 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 x out of random y • In our example: • Best x out of random y

Slide 38

Slide 38 text

[email protected] @BWKnopper github.com/bknopper private List parentSelection() { }

Slide 39

Slide 39 text

[email protected] @BWKnopper github.com/bknopper private List parentSelection() { List tempPopulation = new ArrayList<>(population); List randomCandidates = new ArrayList<>(); }

Slide 40

Slide 40 text

[email protected] @BWKnopper github.com/bknopper private List parentSelection() { List tempPopulation = new ArrayList<>(population); List randomCandidates = new ArrayList<>(); /* create parent pool */ for(int i = 0; i < parentPoolSize; i++) { } }

Slide 41

Slide 41 text

[email protected] @BWKnopper github.com/bknopper private List parentSelection() { List tempPopulation = new ArrayList<>(population); List randomCandidates = new ArrayList<>(); /* create parent pool */ for(int i = 0; i < parentPoolSize; i++) { /* select a random candidate solution from the temp population */ int randomlySelectedIndex = random.nextInt(tempPopulation.size()); CandidateSolution randomSelection = tempPopulation.get(randomlySelectedIndex); randomCandidates.add(randomSelection); } }

Slide 42

Slide 42 text

[email protected] @BWKnopper github.com/bknopper private List parentSelection() { List tempPopulation = new ArrayList<>(population); List randomCandidates = new ArrayList<>(); /* create parent pool */ for(int i = 0; i < parentPoolSize; i++) { /* select a random candidate solution from the temp population */ int randomlySelectedIndex = random.nextInt(tempPopulation.size()); CandidateSolution randomSelection = tempPopulation.get(randomlySelectedIndex); randomCandidates.add(randomSelection); /* delete the candidate from the temp population, so we can't pick it again */ tempPopulation.remove(randomlySelectedIndex); } }

Slide 43

Slide 43 text

[email protected] @BWKnopper github.com/bknopper private List parentSelection() { List tempPopulation = new ArrayList<>(population); List randomCandidates = new ArrayList<>(); /* create parent pool */ for(int i = 0; i < parentPoolSize; i++) { /* select a random candidate solution from the temp population */ int randomlySelectedIndex = random.nextInt(tempPopulation.size()); CandidateSolution randomSelection = tempPopulation.get(randomlySelectedIndex); randomCandidates.add(randomSelection); /* delete the candidate from the temp population, so we can't pick it again */ tempPopulation.remove(randomlySelectedIndex); } /* Sort the population so that the best candidates are up front */ Collections.sort(randomCandidates); }

Slide 44

Slide 44 text

[email protected] @BWKnopper github.com/bknopper private List parentSelection() { List tempPopulation = new ArrayList<>(population); List randomCandidates = new ArrayList<>(); /* create parent pool */ for(int i = 0; i < parentPoolSize; i++) { /* select a random candidate solution from the temp population */ int randomlySelectedIndex = random.nextInt(tempPopulation.size()); CandidateSolution randomSelection = tempPopulation.get(randomlySelectedIndex); randomCandidates.add(randomSelection); /* delete the candidate from the temp population, so we can't pick it again */ tempPopulation.remove(randomlySelectedIndex); } /* Sort the population so that the best candidates are up front */ Collections.sort(randomCandidates); /* return a list with size parentSelectionSize with the best CandidateSolutions */ return randomCandidates.subList(0, parentSelectionSize); }

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 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 48

Slide 48 text

[email protected] @BWKnopper github.com/bknopper public List recombine(CandidateSolution otherParent) { }

Slide 49

Slide 49 text

[email protected] @BWKnopper github.com/bknopper public List recombine(CandidateSolution otherParent) { /* get routes of both parents */ List parentRoute1 = getRoute(); List parentRoute2 = otherParent.getRoute(); }

Slide 50

Slide 50 text

[email protected] @BWKnopper github.com/bknopper public List recombine(CandidateSolution otherParent) { /* get routes of both parents */ List parentRoute1 = getRoute(); List parentRoute2 = otherParent.getRoute(); /* initialize the routes for the children */ List childRoute1 = new ArrayList(); List childRoute2 = new ArrayList(); }

Slide 51

Slide 51 text

[email protected] @BWKnopper github.com/bknopper public List recombine(CandidateSolution otherParent) { /* get routes of both parents */ List parentRoute1 = getRoute(); List parentRoute2 = otherParent.getRoute(); /* initialize the routes for the children */ List childRoute1 = new ArrayList(); List childRoute2 = new ArrayList(); /* randomize cutIndex for "cross-and-fill point" */ int cutIndex = new Random().nextInt(parentRoute1.size()); }

Slide 52

Slide 52 text

[email protected] @BWKnopper github.com/bknopper public List recombine(CandidateSolution otherParent) { /* get routes of both parents */ List parentRoute1 = getRoute(); List parentRoute2 = otherParent.getRoute(); /* initialize the routes for the children */ List childRoute1 = new ArrayList(); List childRoute2 = new ArrayList(); /* randomize cutIndex for "cross-and-fill point" */ int cutIndex = new Random().nextInt(parentRoute1.size()); /* copy the first part of the parents cut into the children */ childRoute1.addAll(parentRoute1.subList(0, cutIndex)); childRoute2.addAll(parentRoute2.subList(0, cutIndex)); }

Slide 53

Slide 53 text

[email protected] @BWKnopper github.com/bknopper public List recombine(CandidateSolution otherParent) { /* get routes of both parents */ List parentRoute1 = getRoute(); List parentRoute2 = otherParent.getRoute(); /* initialize the routes for the children */ List childRoute1 = new ArrayList(); List childRoute2 = new ArrayList(); /* randomize cutIndex for "cross-and-fill point" */ int cutIndex = new Random().nextInt(parentRoute1.size()); /* copy the first part of the parents cut into the children */ childRoute1.addAll(parentRoute1.subList(0, cutIndex)); childRoute2.addAll(parentRoute2.subList(0, cutIndex)); /* perform crossfill for both children */ crossFill(childRoute1, parentRoute2, cutIndex); crossFill(childRoute2, parentRoute1, cutIndex); }

Slide 54

Slide 54 text

[email protected] @BWKnopper github.com/bknopper public List recombine(CandidateSolution otherParent) { /* get routes of both parents */ List parentRoute1 = getRoute(); List parentRoute2 = otherParent.getRoute(); /* initialize the routes for the children */ List childRoute1 = new ArrayList(); List childRoute2 = new ArrayList(); /* randomize cutIndex for "cross-and-fill point" */ int cutIndex = new Random().nextInt(parentRoute1.size()); /* copy the first part of the parents cut into the children */ childRoute1.addAll(parentRoute1.subList(0, cutIndex)); childRoute2.addAll(parentRoute2.subList(0, cutIndex)); /* perform crossfill for both children */ crossFill(childRoute1, parentRoute2, cutIndex); crossFill(childRoute2, parentRoute1, cutIndex); /* create new children using the new children routes */ CandidateSolution child1 = new CandidateSolution(childRoute1); CandidateSolution child2 = new CandidateSolution(childRoute2); }

Slide 55

Slide 55 text

[email protected] @BWKnopper github.com/bknopper public List recombine(CandidateSolution otherParent) { /* get routes of both parents */ List parentRoute1 = getRoute(); List parentRoute2 = otherParent.getRoute(); /* initialize the routes for the children */ List childRoute1 = new ArrayList(); List childRoute2 = new ArrayList(); /* randomize cutIndex for "cross-and-fill point" */ int cutIndex = new Random().nextInt(parentRoute1.size()); /* copy the first part of the parents cut into the children */ childRoute1.addAll(parentRoute1.subList(0, cutIndex)); childRoute2.addAll(parentRoute2.subList(0, cutIndex)); /* perform crossfill for both children */ crossFill(childRoute1, parentRoute2, cutIndex); crossFill(childRoute2, parentRoute1, cutIndex); /* create new children using the new children routes */ CandidateSolution child1 = new CandidateSolution(childRoute1); CandidateSolution child2 = new CandidateSolution(childRoute2); /* put the children in a list and return it (omitted for layout reasons) */ }

Slide 56

Slide 56 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) */ private void crossFill(List childRoute, List parentRoute, int cutIndex) { }

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) */ private void crossFill(List childRoute, List parentRoute, int cutIndex) { /* traverse the parent route from the cut index on and add every city not yet in the child to the child */ for (int i = cutIndex; i < parentRoute.size(); i++) { } 1 4 2 5 6 3 1 }

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) */ private void crossFill(List childRoute, List parentRoute, int cutIndex) { /* traverse the parent route from the cut index on and add every city not yet in the child to the child */ for (int i = cutIndex; i < parentRoute.size(); i++) { City nextCityOnRoute = parentRoute.get(i); if (!childRoute.contains(nextCityOnRoute)) { childRoute.add(nextCityOnRoute); } } 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) */ private void crossFill(List childRoute, List parentRoute, int cutIndex) { /* traverse the parent route from the cut index on and add every city not yet in the child to the child */ for (int i = cutIndex; i < parentRoute.size(); i++) { City nextCityOnRoute = parentRoute.get(i); if (!childRoute.contains(nextCityOnRoute)) { childRoute.add(nextCityOnRoute); } } 1 4 2 5 6 3 1 1 4 2 5 6 3 1 /* traverse the parent route from the start of the route and add every city not yet in the child to the child */ for (int i = 0; i < cutIndex; i++) { City nextCityOnRoute = parentRoute.get(i); if (!childRoute.contains(nextCityOnRoute)) { childRoute.add(nextCityOnRoute); } } }

Slide 60

Slide 60 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE populationwith 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 populationwith 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 • Infeasible candidate 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 /** * Mutates the current individual by swapping two random cities in its * route. */ public void mutate() { } 1 6 5 3 4 2 1

Slide 64

Slide 64 text

[email protected] @BWKnopper github.com/bknopper /** * Mutates the current individual by swapping two random cities in its * route. */ public void mutate() { 1 6 5 3 4 2 1 1 6 5 3 4 2 1 Random random = new Random(); /* randomly select two indices in the route */ int indexFirstCity = random.nextInt(route.size()); int indexSecondCity = random.nextInt(route.size()); }

Slide 65

Slide 65 text

[email protected] @BWKnopper github.com/bknopper /** * Mutates the current individual by swapping two random cities in its * route. */ public void mutate() { 1 6 5 3 4 2 1 1 6 5 3 4 2 1 Random random = new Random(); /* randomly select two indices in the route */ int indexFirstCity = random.nextInt(route.size()); int indexSecondCity = random.nextInt(route.size()); /* Make sure they are different */ while (indexFirstCity == indexSecondCity) { indexSecondCity = random.nextInt(route.size()); } }

Slide 66

Slide 66 text

[email protected] @BWKnopper github.com/bknopper /** * Mutates the current individual by swapping two random cities in its * route. */ public void mutate() { 1 6 5 3 4 2 1 1 6 5 3 4 2 1 Random random = new Random(); /* randomly select two indices in the route */ int indexFirstCity = random.nextInt(route.size()); int indexSecondCity = random.nextInt(route.size()); /* Make sure they are different */ while (indexFirstCity == indexSecondCity) { indexSecondCity = random.nextInt(route.size()); } /* retrieve the Cities on the given indices */ City firstCity = route.get(indexFirstCity); City secondCity = route.get(indexSecondCity); }

Slide 67

Slide 67 text

[email protected] @BWKnopper github.com/bknopper /** * Mutates the current individual by swapping two random cities in its * route. */ public void mutate() { 1 6 5 3 4 2 1 1 6 5 3 4 2 1 1 2 5 3 4 6 1 Random random = new Random(); /* randomly select two indices in the route */ int indexFirstCity = random.nextInt(route.size()); int indexSecondCity = random.nextInt(route.size()); /* Make sure they are different */ while (indexFirstCity == indexSecondCity) { indexSecondCity = random.nextInt(route.size()); } /* retrieve the Cities on the given indices */ City firstCity = route.get(indexFirstCity); City secondCity = route.get(indexSecondCity); /* Changer! */ route.set(indexFirstCity, secondCity); route.set(indexSecondCity, firstCity); }

Slide 68

Slide 68 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE populationwith 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 populationwith 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 populationwith 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 */ private void 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 */ private void selectSurvivors() { Collections.sort(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 */ private void selectSurvivors() { Collections.sort(population); population = population.subList(0, populationSize); }

Slide 75

Slide 75 text

[email protected] @BWKnopper github.com/bknopper EA Algorithm (Pseudocode) INITIALISE populationwith 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… • Mutationprobability • Populationsize • Nr of offspring • Terminationcondition(# 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! • Backend • Java code shown • Used NASA World Wind to do calculations on the backend • Frontend • AngularJs + Bootstrap + Google Maps J • https://github.com/bknopper/TSPEvolutionaryAlgorithmsDemo.git

Slide 79

Slide 79 text

[email protected] @BWKnopper github.com/bknopper Java Frameworks & API’s http://jgap.sourceforge.net/ http://watchmaker.uncommons.org

Slide 80

Slide 80 text

[email protected] @BWKnopper github.com/bknopper Java Frameworks & API’s • ECJ • http://cs.gmu.edu/~eclab/projects/ecj/ • MOEA Framework • http://www.moeaframework.org • JEAF • https://github.com/GII/JEAF • …

Slide 81

Slide 81 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 amount of time) • Am I facing an optimizationor search problem? • Can I encode a candidate solution to the problem? • Representation possible? • Can I determine the fitness of a candidate solution?

Slide 82

Slide 82 text

[email protected] @BWKnopper github.com/bknopper

Slide 83

Slide 83 text

[email protected] @BWKnopper github.com/bknopper Additional questions? • Contact me on @BWKnopper • Google it! • There’s lots to find… • Papers • Demo’s • Aforementioned Frameworks/API’s

Slide 84

Slide 84 text

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