Skip to content

Commit bea5a48

Browse files
committed
Improved the consistency of generation and evaluation
1 parent b87e935 commit bea5a48

File tree

4 files changed

+21
-18
lines changed

4 files changed

+21
-18
lines changed

MattEland.FSharpGeneticAlgorithm.Logic/Fitness.fs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,20 @@ let standardFitnessFunction (gameStates: GameState[]): float =
1111

1212
let gotAcornBonus =
1313
match lastState.World.Acorn.IsActive with
14-
| true -> 25.0
14+
| true -> 100.0
1515
| false -> 0.0
1616

1717
let finalStateBonus =
1818
match lastState.SimState with
19-
| SimulationState.Won -> 100.0 - gameLength // Reward quick wins
19+
| SimulationState.Won -> 500.0 - gameLength // Reward quick wins
2020
| SimulationState.Lost -> -50.0 + gameLength
2121
| _ -> 0.0 + gameLength
2222

2323
gotAcornBonus + finalStateBonus
24+
25+
let killRabbitFitnessFunction (gameStates: GameState[]): float =
26+
let rabbitBonus = Seq.map (fun s -> match s.World.Rabbit.IsActive with
27+
| false -> 10.0
28+
| _ -> 0.0) gameStates |> Seq.sum
29+
30+
rabbitBonus + standardFitnessFunction gameStates
Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,19 @@
11
module MattEland.FSharpGeneticAlgorithm.Genetics.Population
22

3-
open MattEland.FSharpGeneticAlgorithm.Logic.States
43
open MattEland.FSharpGeneticAlgorithm.Logic.Simulator
54
open MattEland.FSharpGeneticAlgorithm.Genetics.Genes
65
open MattEland.FSharpGeneticAlgorithm.Logic.World
76

8-
let simulateGeneration states random actors =
7+
let simulateGeneration states actors =
98
actors
10-
|> Seq.map (fun b -> simulate random b states)
9+
|> Seq.map (fun b -> simulate b states)
1110
|> Seq.sortByDescending (fun r -> r.totalScore)
1211

1312
let buildInitialPopulation random =
1413
Seq.init<ActorChromosome> 10 (fun _ -> getRandomChromosome random)
1514

1615
let simulateFirstGeneration states random =
17-
buildInitialPopulation random
18-
|> simulateGeneration states random
16+
buildInitialPopulation random |> simulateGeneration states
1917

2018
let mutateBrains (random: System.Random, brains: ActorChromosome[]): ActorChromosome[] =
2119
if brains.Length <> 10 then failwith "Expecting exactly 10 entries"
@@ -25,17 +23,17 @@ let mutateBrains (random: System.Random, brains: ActorChromosome[]): ActorChromo
2523
getRandomChromosome random;
2624
getRandomChromosome random;
2725
getRandomChromosome random;
26+
getRandomChromosome random;
27+
getRandomChromosome random;
2828
|]
2929

3030
let children = [|
3131
createChild(random, survivors.[0].genes, survivors.[1].genes, 0.05);
32-
createChild(random, survivors.[0].genes, survivors.[1].genes, 0.1);
3332
createChild(random, survivors.[0].genes, survivors.[1].genes, 0.25);
34-
createChild(random, survivors.[0].genes, survivors.[1].genes, 0.5);
3533
|]
3634

3735
Array.append children randos |> Array.append survivors
3836

3937
let mutateAndSimulateGeneration (random: System.Random, worlds: World[], results: SimulationResult[]) =
4038
let brains = Seq.map (fun b -> b.brain) results |> Seq.toArray
41-
mutateBrains(random, brains) |> simulateGeneration worlds random
39+
mutateBrains(random, brains) |> simulateGeneration worlds

MattEland.FSharpGeneticAlgorithm.Logic/Simulator.fs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ let handleChromosomeMove random chromosome state =
132132
state
133133

134134
let buildStartingStateForWorld world =
135-
{ World = world; SimState = SimulationState.Simulating; TurnsLeft = 30}
135+
{ World = world; SimState = SimulationState.Simulating; TurnsLeft = 50}
136136

137137
let buildStartingState (random: System.Random) =
138138
makeWorld 13 13 random.Next |> buildStartingStateForWorld
@@ -149,7 +149,6 @@ let simulateIndividualGame random brain fitnessFunction world: IndividualWorldRe
149149
states = gameStates.ToArray();
150150
}
151151

152-
153152
let simulateGame random brain fitnessFunction states =
154153
let results: IndividualWorldResult seq = Seq.map (fun world -> simulateIndividualGame random brain fitnessFunction world) states
155154
{
@@ -158,6 +157,7 @@ let simulateGame random brain fitnessFunction states =
158157
brain = brain
159158
}
160159

161-
let simulate random brain worlds =
160+
let simulate brain worlds =
162161
let states = Seq.map (fun w -> buildStartingStateForWorld w) worlds
163-
simulateGame random brain standardFitnessFunction states
162+
let random = new System.Random(42)
163+
simulateGame random brain killRabbitFitnessFunction states

MattEland.FSharpGeneticAlgorithm.WindowsClient/ViewModels/MainViewModel.cs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,10 @@ private void SimulateCurrentPopulation()
3232
if (!Population.Any()) return;
3333

3434
var pop = Population.Select(p => p.Brain.Model);
35-
var result = Genetics.Population.simulateGeneration(_worlds, GetRandomForSimulation(), pop).ToList();
35+
var result = Genetics.Population.simulateGeneration(_worlds, pop).ToList();
3636
UpdatePopulation(result);
3737
}
3838

39-
private Random GetRandomForSimulation() => new Random(42);
40-
4139
public SimulationResultViewModel SelectedBrain
4240
{
4341
get => _brain;
@@ -85,7 +83,7 @@ private void AdvanceToNextGeneration()
8583
var priorResults = Population.Select(p => p.Model).ToArray();
8684

8785
var brains = Genetics.Population.mutateBrains(_random, priorResults.Select(r => r.brain).ToArray());
88-
var generation = Genetics.Population.simulateGeneration(_worlds, GetRandomForSimulation(), brains).ToList();
86+
var generation = Genetics.Population.simulateGeneration(_worlds, brains).ToList();
8987

9088
UpdatePopulation(generation);
9189
}

0 commit comments

Comments
 (0)