Skip to content

Commit 431f028

Browse files
committed
Final code from Article 5
1 parent fad39e5 commit 431f028

File tree

9 files changed

+35
-54
lines changed

9 files changed

+35
-54
lines changed

MattEland.FSharpGeneticAlgorithm.Logic/Genetics.fs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,25 @@
44
open MattEland.FSharpGeneticAlgorithm.Logic.Actors
55
open MattEland.FSharpGeneticAlgorithm.Logic.World
66

7-
type SquirrelPriorities =
7+
type ActorChromosome =
88
{
99
dogImportance: double
1010
acornImportance: double
1111
rabbitImportance: double
1212
treeImportance: double
13-
selfImportance: double
13+
squirrelImportance: double
1414
randomImportance: double
1515
}
1616

1717
let getRandomGene (random: System.Random): double = (random.NextDouble() * 2.0) - 1.0
1818

19-
let getRandomPriorities (random: System.Random) =
19+
let getRandomChromosome (random: System.Random) =
2020
{
2121
dogImportance = getRandomGene random;
2222
acornImportance = getRandomGene random;
2323
rabbitImportance = getRandomGene random;
2424
treeImportance = getRandomGene random;
25-
selfImportance = getRandomGene random;
25+
squirrelImportance = getRandomGene random;
2626
randomImportance = getRandomGene random;
2727
}
2828

@@ -32,8 +32,8 @@
3232
else
3333
0.0
3434

35-
let evaluateTile(brain: SquirrelPriorities, world: World, pos: WorldPos, random: System.Random): float =
36-
evaluateProximity(world.Squirrel, pos, brain.selfImportance) +
35+
let evaluateTile(brain: ActorChromosome, world: World, pos: WorldPos, random: System.Random): float =
36+
evaluateProximity(world.Squirrel, pos, brain.squirrelImportance) +
3737
evaluateProximity(world.Rabbit, pos, brain.rabbitImportance) +
3838
evaluateProximity(world.Doggo, pos, brain.dogImportance) +
3939
evaluateProximity(world.Acorn, pos, brain.acornImportance) +

MattEland.FSharpGeneticAlgorithm.Logic/Simulator.fs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -115,22 +115,18 @@ let decreaseTimer (state: GameState) =
115115
else
116116
state
117117

118-
let simulateActors (state: GameState) getRandomNumber =
118+
let simulateActors (state: GameState, getRandomNumber) =
119119
moveRandomly state state.World.Rabbit getRandomNumber
120120
|> simulateDoggo
121121
|> decreaseTimer
122122

123-
let handleBrainMove brain state (random: System.Random) =
123+
let handleChromosomeMove (state: GameState, random: System.Random, chromosome: ActorChromosome) =
124124
if state.SimState = SimulationState.Simulating then
125125
let current = state.World.Squirrel.Pos
126126
let movedPos = getCandidates(current, state.World, true)
127-
|> Seq.sortBy(fun pos -> evaluateTile(brain, state.World, pos, random))
127+
|> Seq.sortBy(fun pos -> evaluateTile(chromosome, state.World, pos, random))
128128
|> Seq.head
129129
let newState = moveActor state state.World.Squirrel movedPos
130-
simulateActors(newState) random.Next
130+
simulateActors(newState, random.Next)
131131
else
132-
state
133-
134-
let simulateAiTurn state (random: System.Random) brain =
135-
let newState = handleBrainMove brain state random
136-
simulateActors(newState) random.Next
132+
state

MattEland.FSharpGeneticAlgorithm.Tests/Tests.fs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ let ``Rabbit should move randomly`` () =
2929
let originalPos = state.World.Rabbit.Pos
3030

3131
// Act
32-
let newWorld = simulateActors state getRandomNumber
32+
let newWorld = simulateActors(state, getRandomNumber)
3333

3434
// Assert
3535
newWorld.World.Rabbit.Pos |> should not' (equal originalPos)
@@ -42,7 +42,7 @@ let ``Dog Should Eat Squirrel If Adjacent`` () =
4242
let state: GameState = {testState with World = {testState.World with Squirrel = customSquirrel}}
4343

4444
// Act
45-
let newState = simulateActors state getRandomNumber
45+
let newState = simulateActors(state, getRandomNumber)
4646

4747
// Assert
4848
newState.World.Doggo.Pos |> should equal newState.World.Squirrel.Pos
@@ -55,7 +55,7 @@ let ``Simulating actors should decrease the turns left counter`` () =
5555
let initialState = buildTestState
5656

5757
// Act
58-
let newState = simulateActors initialState getRandomNumber
58+
let newState = simulateActors(initialState, getRandomNumber)
5959

6060
// Assert
6161
newState.TurnsLeft |> should equal (initialState.TurnsLeft - 1)
@@ -66,7 +66,7 @@ let ``Running out of turns should lose the simulation`` () =
6666
let state: GameState = {buildTestState with TurnsLeft = 0}
6767

6868
// Act
69-
let newState = simulateActors state getRandomNumber
69+
let newState = simulateActors(state, getRandomNumber)
7070

7171
// Assert
7272
newState.SimState |> should equal SimulationState.Lost

MattEland.FSharpGeneticAlgorithm.WindowsClient/BrainInfoControl.xaml

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,19 @@
77
mc:Ignorable="d"
88
d:DataContext="{d:DesignInstance viewModels:BrainInfoViewModel}">
99
<StackPanel>
10+
<TextBlock Margin="0,10,0,10" FontWeight="Bold">Brain Info:</TextBlock>
11+
12+
<TextBlock Margin="0,10,0,0">Acorn</TextBlock>
13+
<ProgressBar Minimum="-1" Maximum="1" Value="{Binding AcornPriority, Mode=OneWay}"></ProgressBar>
1014
<TextBlock Margin="0,10,0,0">Dog</TextBlock>
1115
<ProgressBar Minimum="-1" Maximum="1" Value="{Binding DoggoPriority, Mode=OneWay}"></ProgressBar>
1216
<TextBlock Margin="0,10,0,0">Rabbit</TextBlock>
1317
<ProgressBar Minimum="-1" Maximum="1" Value="{Binding RabbitPriority, Mode=OneWay}"></ProgressBar>
14-
<TextBlock Margin="0,10,0,0">Acorn</TextBlock>
15-
<ProgressBar Minimum="-1" Maximum="1" Value="{Binding AcornPriority, Mode=OneWay}"></ProgressBar>
18+
<TextBlock Margin="0,10,0,0">Squirrel</TextBlock>
19+
<ProgressBar Minimum="-1" Maximum="1" Value="{Binding SquirrelPriority, Mode=OneWay}"></ProgressBar>
1620
<TextBlock Margin="0,10,0,0">Tree</TextBlock>
1721
<ProgressBar Minimum="-1" Maximum="1" Value="{Binding TreePriority, Mode=OneWay}"></ProgressBar>
1822
<TextBlock Margin="0,10,0,0">Random</TextBlock>
1923
<ProgressBar Minimum="-1" Maximum="1" Value="{Binding RandomPriority, Mode=OneWay}"></ProgressBar>
20-
<TextBlock Margin="0,10,0,0">Squirrel</TextBlock>
21-
<ProgressBar Minimum="-1" Maximum="1" Value="{Binding SquirrelPriority, Mode=OneWay}"></ProgressBar>
2224
</StackPanel>
2325
</UserControl>

MattEland.FSharpGeneticAlgorithm.WindowsClient/BrainInfoControl.xaml.cs

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,9 @@
1-
using System;
2-
using System.Collections.Generic;
3-
using System.Text;
4-
using System.Windows;
5-
using System.Windows.Controls;
6-
using System.Windows.Data;
7-
using System.Windows.Documents;
8-
using System.Windows.Input;
9-
using System.Windows.Media;
10-
using System.Windows.Media.Imaging;
11-
using System.Windows.Navigation;
12-
using System.Windows.Shapes;
13-
14-
namespace MattEland.FSharpGeneticAlgorithm.WindowsClient
1+
namespace MattEland.FSharpGeneticAlgorithm.WindowsClient
152
{
163
/// <summary>
174
/// Interaction logic for BrainInfoControl.xaml
185
/// </summary>
19-
public partial class BrainInfoControl : UserControl
6+
public partial class BrainInfoControl
207
{
218
public BrainInfoControl()
229
{

MattEland.FSharpGeneticAlgorithm.WindowsClient/MainWindow.xaml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@
3030
<Button Style="{StaticResource CommandButtonStyle}" Command="{Binding RandomizeCommand}">Randomize Brain</Button>
3131
<Button Style="{StaticResource CommandButtonStyle}" Command="{Binding ResetCommand}">Restart</Button>
3232

33-
<TextBlock Margin="0,10,0,10" FontWeight="Bold">Brain Info:</TextBlock>
3433
<windowsClient:BrainInfoControl DataContext="{Binding Brain}"></windowsClient:BrainInfoControl>
3534
</StackPanel>
3635
</Border>

MattEland.FSharpGeneticAlgorithm.WindowsClient/MainWindow.xaml.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System.Windows;
2-
using JetBrains.Annotations;
1+
using JetBrains.Annotations;
32
using MattEland.FSharpGeneticAlgorithm.WindowsClient.ViewModels;
43

54
namespace MattEland.FSharpGeneticAlgorithm.WindowsClient

MattEland.FSharpGeneticAlgorithm.WindowsClient/ViewModels/BrainInfoViewModel.cs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,17 @@ namespace MattEland.FSharpGeneticAlgorithm.WindowsClient.ViewModels
66
{
77
public class BrainInfoViewModel
88
{
9-
private readonly Genes.SquirrelPriorities _brain;
10-
11-
public BrainInfoViewModel([NotNull] Genes.SquirrelPriorities brain)
9+
public BrainInfoViewModel([NotNull] Genes.ActorChromosome brain)
1210
{
13-
_brain = brain ?? throw new ArgumentNullException(nameof(brain));
11+
Model = brain ?? throw new ArgumentNullException(nameof(brain));
1412
}
1513

16-
public double SquirrelPriority => _brain.selfImportance;
17-
public double DoggoPriority => _brain.dogImportance;
18-
public double RabbitPriority => _brain.rabbitImportance;
19-
public double AcornPriority => _brain.acornImportance;
20-
public double TreePriority => _brain.treeImportance;
21-
public double RandomPriority => _brain.randomImportance;
22-
public Genes.SquirrelPriorities Model => _brain;
14+
public double SquirrelPriority => Model.squirrelImportance;
15+
public double DoggoPriority => Model.dogImportance;
16+
public double RabbitPriority => Model.rabbitImportance;
17+
public double AcornPriority => Model.acornImportance;
18+
public double TreePriority => Model.treeImportance;
19+
public double RandomPriority => Model.randomImportance;
20+
public Genes.ActorChromosome Model { get; }
2321
}
2422
}

MattEland.FSharpGeneticAlgorithm.WindowsClient/ViewModels/MainViewModel.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,10 @@ public BrainInfoViewModel Brain
4141
public IEnumerable<ActorViewModel> Actors => _actors;
4242

4343
private void RandomizeBrain() =>
44-
Brain = new BrainInfoViewModel(Genes.getRandomPriorities(_random));
44+
Brain = new BrainInfoViewModel(Genes.getRandomChromosome(_random));
4545

4646
private void GetArtificialIntelligenceMove() =>
47-
State = Simulator.handleBrainMove(Brain.Model, _state, _random);
47+
State = Simulator.handleChromosomeMove(_state, _random, Brain.Model);
4848

4949
public ActionCommand ResetCommand { get; }
5050
public ActionCommand BrainCommand { get; }

0 commit comments

Comments
 (0)