Skip to content

Commit ff1f434

Browse files
committed
A few tweaks to the application for article purposes
1 parent 47db259 commit ff1f434

File tree

5 files changed

+54
-21
lines changed

5 files changed

+54
-21
lines changed

MattEland.FSharpGeneticAlgorithm.Logic/Fitness.fs

+16-11
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ let standardFitnessFunction (gameStates: GameState[]): float =
1616

1717
let finalStateBonus =
1818
match lastState.SimState with
19-
| SimulationState.Won -> 1000.0 - (gameLength * 10.0) // Reward quick wins
19+
| SimulationState.Won -> 1000.0 - (gameLength * 25.0) // Reward quick wins
2020
| _ -> -50.0 + gameLength
2121

2222
gotAcornBonus + finalStateBonus
@@ -31,15 +31,20 @@ let killRabbitFitnessFunction (gameStates: GameState[]): float =
3131
| true -> 100.0
3232
| false -> 0.0
3333

34+
let isSquirrelAlive = lastState.World.Squirrel.IsActive
35+
36+
let wonBonus =
37+
match lastState.SimState with
38+
| SimulationState.Won -> 250.0
39+
| _ -> match isSquirrelAlive with
40+
| true -> 0.0
41+
| false -> -100.0 + gameLength
42+
3443
let isRabbitAlive = lastState.World.Rabbit.IsActive
3544

36-
let finalStateBonus =
37-
match lastState.SimState with
38-
| SimulationState.Won -> match isRabbitAlive with
39-
| false -> 1000.0 // Heavily reward dead rabbits
40-
| true -> 250.0 - (gameLength * 10.0) // Reward quick wins
41-
| _ -> match isRabbitAlive with
42-
| true -> -50.0 + gameLength
43-
| false -> gameLength
44-
45-
gotAcornBonus + finalStateBonus
45+
let rabbitBonus =
46+
match isRabbitAlive with
47+
| false -> 1000.0 - (gameLength * 5.0) // Heavily reward dead rabbits
48+
| true -> 0.0
49+
50+
gotAcornBonus + rabbitBonus + wonBonus

MattEland.FSharpGeneticAlgorithm.Logic/Population.fs

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ let simulateGeneration states actors =
1010
|> Seq.sortByDescending (fun r -> r.totalScore)
1111

1212
let buildInitialPopulation random =
13-
Seq.init<ActorChromosome> 20 (fun _ -> getRandomChromosome random)
13+
Seq.init<ActorChromosome> 100 (fun _ -> getRandomChromosome random)
1414

1515
let simulateFirstGeneration states random =
1616
buildInitialPopulation random |> simulateGeneration states

MattEland.FSharpGeneticAlgorithm.WindowsClient/MainWindow.xaml

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
<StackPanel Margin="0,8,0,0" DockPanel.Dock="Top">
2424
<Button Margin="0,5" Command="{Binding AdvanceCommand}">Next Generation</Button>
2525
<Button Margin="0,5" Command="{Binding Advance10Command}">Next 10 Generations</Button>
26+
<Button Margin="0,5" Command="{Binding Advance100Command}">Next 100 Generations</Button>
2627
<Button Margin="0,5" Command="{Binding RandomizeCommand}">Randomize Worlds</Button>
2728
<Button Margin="0,5" Command="{Binding ResetCommand}">Reset</Button>
2829
<CheckBox IsChecked="{Binding ShowHeatMap}" x:Name="checkShowHeatMap" Foreground="White">Show Tile Attractiveness</CheckBox>

MattEland.FSharpGeneticAlgorithm.WindowsClient/ViewModels/MainViewModel.cs

+22-8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
using System.Collections.Generic;
33
using System.Collections.ObjectModel;
44
using System.Linq;
5+
using System.Threading;
6+
using System.Windows.Threading;
57
using MattEland.FSharpGeneticAlgorithm.Genetics;
68
using MattEland.FSharpGeneticAlgorithm.Logic;
79

@@ -17,14 +19,20 @@ public MainViewModel()
1719
RandomizeCommand = new ActionCommand(RandomizeWorlds);
1820
AdvanceCommand = new ActionCommand(AdvanceToNextGeneration);
1921
Advance10Command = new ActionCommand(AdvanceToNext10Generation);
22+
Advance100Command = new ActionCommand(AdvanceToNext100Generation);
2023

2124
RandomizeWorlds();
2225
RandomizeBrains();
26+
27+
DispatcherTimer timer = new DispatcherTimer();
28+
timer.Interval = TimeSpan.FromMilliseconds(200);
29+
timer.Tick += (sender, e) => _brain.AdvanceTimer();
30+
timer.Start();
2331
}
2432

2533
private void RandomizeWorlds()
2634
{
27-
_worlds = WorldGeneration.makeWorlds(_random, 10);
35+
_worlds = WorldGeneration.makeWorlds(_random, 1);
2836
SimulateCurrentPopulation();
2937
}
3038

@@ -64,6 +72,7 @@ public bool ShowHeatMap
6472
public ActionCommand RandomizeCommand { get; }
6573
public ActionCommand AdvanceCommand { get; }
6674
public ActionCommand Advance10Command { get; }
75+
public ActionCommand Advance100Command { get; }
6776

6877
public ObservableCollection<SimulationResultViewModel> Population { get; } =
6978
new ObservableCollection<SimulationResultViewModel>();
@@ -94,23 +103,28 @@ private void UpdatePopulation(IEnumerable<Genes.SimulationResult> generation)
94103

95104
private void AdvanceToNext10Generation()
96105
{
97-
var priorResults = Population.Select(p => p.Model).ToArray();
98-
99-
var generation = Genetics.Population.mutateAndSimulateMultiple(_random, _worlds, 10, priorResults);
106+
AdvanceGenerations(10);
107+
}
100108

101-
UpdatePopulation(generation);
109+
private void AdvanceToNext100Generation()
110+
{
111+
AdvanceGenerations(100);
102112
}
103113

104-
private void AdvanceToNextGeneration()
114+
private void AdvanceGenerations(int numGenerations)
105115
{
106116
var priorResults = Population.Select(p => p.Model).ToArray();
107117

108-
var brains = Genetics.Population.mutateBrains(_random, priorResults.Select(r => r.brain).ToArray());
109-
var generation = Genetics.Population.simulateGeneration(_worlds, brains).ToList();
118+
var generation = Genetics.Population.mutateAndSimulateMultiple(_random, _worlds, numGenerations, priorResults);
110119

111120
UpdatePopulation(generation);
112121
}
113122

123+
private void AdvanceToNextGeneration()
124+
{
125+
AdvanceGenerations(1);
126+
}
127+
114128
private SimulationResultViewModel _brain;
115129
private World.World[] _worlds;
116130
private bool _showHeatMap;

MattEland.FSharpGeneticAlgorithm.WindowsClient/ViewModels/SimulationResultViewModel.cs

+14-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Collections.Generic;
1+
using System;
2+
using System.Collections.Generic;
23
using System.Collections.ObjectModel;
34
using System.Linq;
45
using MattEland.FSharpGeneticAlgorithm.Genetics;
@@ -46,5 +47,17 @@ public int CurrentIndex
4647
public int MaxStateIndex => _states.Count - 1;
4748
public BrainInfoViewModel Brain { get; }
4849
public Genes.SimulationResult Model { get; }
50+
51+
public void AdvanceTimer()
52+
{
53+
if (CurrentIndex == MaxStateIndex)
54+
{
55+
CurrentIndex = 0;
56+
}
57+
else
58+
{
59+
CurrentIndex++;
60+
}
61+
}
4962
}
5063
}

0 commit comments

Comments
 (0)