@@ -17,7 +17,7 @@ public class GeneticAlgorithm : IGeneticAlgorithm
17
17
public int RandomNetworkAmount { get ; set ; }
18
18
public double MutationRate { get ; set ; }
19
19
public double MutationChance { get ; set ; }
20
- public Dictionary < IWeightedNetwork , double > NetworksAndFitness { get ; private set ; } = new Dictionary < IWeightedNetwork , double > ( ) ;
20
+ public IList < KeyValuePair < IWeightedNetwork , double > > NetworksAndFitness { get ; private set ; } = new List < KeyValuePair < IWeightedNetwork , double > > ( ) ;
21
21
public int InputNodes { get ; }
22
22
public int HiddenNodes { get ; }
23
23
public int HiddenLayers { get ; }
@@ -51,7 +51,7 @@ private void AddNewNetworks(int amount)
51
51
52
52
private void AddNewNetwork ( )
53
53
{
54
- NetworksAndFitness . Add ( new WeightedNetwork ( InputNodes , HiddenLayers , HiddenNodes , OutputNodes ) { ID = internalIdCounter } , 0 ) ;
54
+ NetworksAndFitness . Add ( new KeyValuePair < IWeightedNetwork , double > ( new WeightedNetwork ( InputNodes , HiddenLayers , HiddenNodes , OutputNodes ) { ID = internalIdCounter } , 0 ) ) ;
55
55
++ internalIdCounter ;
56
56
}
57
57
@@ -66,10 +66,10 @@ public void PropagateAllNetworks()
66
66
ResetAllFitnesses ( ) ;
67
67
for ( int inputIndex = 0 ; inputIndex < CurrentInput . Length ; inputIndex ++ )
68
68
{
69
- foreach ( IWeightedNetwork network in NetworksAndFitness . Keys )
69
+ foreach ( KeyValuePair < IWeightedNetwork , double > networkAndFitness in NetworksAndFitness )
70
70
{
71
- network . SetInput ( CurrentInput [ inputIndex ] ) ;
72
- network . Propagate ( ) ;
71
+ networkAndFitness . Key . SetInput ( CurrentInput [ inputIndex ] ) ;
72
+ networkAndFitness . Key . Propagate ( ) ;
73
73
}
74
74
if ( CurrentExpectedIsSet ( ) )
75
75
{
@@ -85,17 +85,17 @@ private bool CurrentExpectedIsSet()
85
85
86
86
private void ResetAllFitnesses ( )
87
87
{
88
- Dictionary < IWeightedNetwork , double > tempNetworkAndFitness = new Dictionary < IWeightedNetwork , double > ( ) ;
89
- foreach ( IWeightedNetwork network in NetworksAndFitness . Keys )
88
+ IList < KeyValuePair < IWeightedNetwork , double > > tempNetworkAndFitness = new List < KeyValuePair < IWeightedNetwork , double > > ( ) ;
89
+ foreach ( KeyValuePair < IWeightedNetwork , double > networkAndFitness in NetworksAndFitness )
90
90
{
91
- tempNetworkAndFitness . Add ( network , 0 ) ;
91
+ tempNetworkAndFitness . Add ( new KeyValuePair < IWeightedNetwork , double > ( networkAndFitness . Key , 0 ) ) ;
92
92
}
93
93
NetworksAndFitness = tempNetworkAndFitness ;
94
94
}
95
95
96
96
private void CalculateFitnesses ( double [ ] expected )
97
97
{
98
- Dictionary < IWeightedNetwork , double > tempNetworkAndFitness = new Dictionary < IWeightedNetwork , double > ( ) ;
98
+ IList < KeyValuePair < IWeightedNetwork , double > > tempNetworkAndFitness = new List < KeyValuePair < IWeightedNetwork , double > > ( ) ;
99
99
foreach ( KeyValuePair < IWeightedNetwork , double > networkAndFitness in NetworksAndFitness )
100
100
{
101
101
double fitness = networkAndFitness . Value ;
@@ -104,14 +104,14 @@ private void CalculateFitnesses(double[] expected)
104
104
{
105
105
fitness += 1 / ( Math . Pow ( output [ i ] - expected [ i ] , 2 ) + 1 ) ;
106
106
}
107
- tempNetworkAndFitness . Add ( networkAndFitness . Key , fitness ) ;
107
+ tempNetworkAndFitness . Add ( new KeyValuePair < IWeightedNetwork , double > ( networkAndFitness . Key , fitness ) ) ;
108
108
}
109
109
NetworksAndFitness = tempNetworkAndFitness ;
110
110
}
111
111
112
112
public void SortByFitness ( )
113
113
{
114
- NetworksAndFitness = NetworksAndFitness . OrderByDescending ( x => x . Value ) . ToDictionary ( x => x . Key , x => x . Value ) ;
114
+ NetworksAndFitness = NetworksAndFitness . OrderByDescending ( x => x . Value ) . ToList ( ) ;
115
115
}
116
116
117
117
public void BreedBestNetworks ( )
@@ -123,13 +123,13 @@ public void BreedBestNetworks()
123
123
124
124
private void RemoveUnneccessaryNetworks ( )
125
125
{
126
- List < KeyValuePair < IWeightedNetwork , double > > tempNetworkAndFitnessToKeep = NetworksAndFitness . Take ( NetworksToKeep ) . ToList ( ) ;
127
- NetworksAndFitness = tempNetworkAndFitnessToKeep . ToDictionary ( x => x . Key , x => x . Value ) ;
126
+ IList < KeyValuePair < IWeightedNetwork , double > > tempNetworkAndFitnessToKeep = NetworksAndFitness . Take ( NetworksToKeep ) . ToList ( ) ;
127
+ NetworksAndFitness = tempNetworkAndFitnessToKeep . ToList ( ) ;
128
128
}
129
129
130
130
private void BreedNewNetworks ( )
131
131
{
132
- List < IWeightedNetwork > networkAndLikelinesToBreed = GetBreedingPool ( ) ;
132
+ IList < IWeightedNetwork > networkAndLikelinesToBreed = GetBreedingPool ( ) ;
133
133
AddNewNetworks ( RandomNetworkAmount ) ;
134
134
BreedNetworks ( networkAndLikelinesToBreed ) ;
135
135
}
@@ -139,13 +139,13 @@ private List<IWeightedNetwork> GetBreedingPool()
139
139
return PoolGenerator . GenerateBreedingPool ( NetworksAndFitness ) ;
140
140
}
141
141
142
- private void BreedNetworks ( List < IWeightedNetwork > networkAndLikelinesToBreed )
142
+ private void BreedNetworks ( IList < IWeightedNetwork > networkAndLikelinesToBreed )
143
143
{
144
144
while ( NetworksAndFitness . Count < TotalNetworks )
145
145
{
146
146
int networkIndex = RandomNumberGenerator . GetNextNumber ( 0 , networkAndLikelinesToBreed . Count - 1 ) ;
147
147
IWeightedNetwork network = BreedNewNetwork ( networkAndLikelinesToBreed [ networkIndex ] ) ;
148
- NetworksAndFitness . Add ( network , 0 ) ;
148
+ NetworksAndFitness . Add ( new KeyValuePair < IWeightedNetwork , double > ( network , 0 ) ) ;
149
149
}
150
150
}
151
151
@@ -214,18 +214,18 @@ private void MutateNetwork(IWeightedNetwork network)
214
214
215
215
public double [ ] GetFitnesses ( )
216
216
{
217
- return NetworksAndFitness . Values . ToArray ( ) ;
217
+ return NetworksAndFitness . Select ( x => x . Value ) . ToArray ( ) ;
218
218
}
219
219
220
220
public void SetFitnesses ( double [ ] fitnesses )
221
221
{
222
222
ThrowIfArgumentDoesNotHaveCorrectLength ( fitnesses , TotalNetworks ) ;
223
223
224
- Dictionary < IWeightedNetwork , double > tempFitnessAndValues = new Dictionary < IWeightedNetwork , double > ( ) ;
224
+ IList < KeyValuePair < IWeightedNetwork , double > > tempFitnessAndValues = new List < KeyValuePair < IWeightedNetwork , double > > ( ) ;
225
225
for ( int i = 0 ; i < fitnesses . Length ; ++ i )
226
226
{
227
227
IWeightedNetwork network = NetworksAndFitness . ElementAt ( i ) . Key ;
228
- tempFitnessAndValues . Add ( network , fitnesses [ i ] ) ;
228
+ tempFitnessAndValues . Add ( new KeyValuePair < IWeightedNetwork , double > ( network , fitnesses [ i ] ) ) ;
229
229
}
230
230
NetworksAndFitness = tempFitnessAndValues ;
231
231
}
@@ -240,18 +240,20 @@ private void ThrowIfArgumentDoesNotHaveCorrectLength(double[] array, int expecte
240
240
241
241
public void SetFitness ( int networkIndex , double fitness )
242
242
{
243
- SetFitness ( NetworksAndFitness . Keys . ElementAt ( networkIndex ) , fitness ) ;
243
+ SetFitness ( NetworksAndFitness . Select ( x => x . Key ) . ElementAt ( networkIndex ) , fitness ) ;
244
244
}
245
245
246
246
public void SetFitness ( IWeightedNetwork network , double fitness )
247
247
{
248
248
ThrowIfNetworkNotInDictionary ( network ) ;
249
- NetworksAndFitness [ network ] = fitness ;
249
+ KeyValuePair < IWeightedNetwork , double > temp = NetworksAndFitness . FirstOrDefault ( x => x . Key == network ) ;
250
+ int index = NetworksAndFitness . IndexOf ( temp ) ;
251
+ NetworksAndFitness [ index ] = new KeyValuePair < IWeightedNetwork , double > ( network , fitness ) ;
250
252
}
251
253
252
254
private void ThrowIfNetworkNotInDictionary ( IWeightedNetwork network )
253
255
{
254
- if ( ! NetworksAndFitness . Keys . Contains ( network ) )
256
+ if ( ! NetworksAndFitness . Select ( x => x . Key ) . Contains ( network ) )
255
257
{
256
258
throw new ArgumentException ( $ "Network not found inside { nameof ( NetworksAndFitness ) } ") ;
257
259
}
0 commit comments