Direct Insertion Crossover Operator
Public Sub OrderSingleCrossover(ByRef Child As PChromo, ByRef Parent1 As PChromo, ByRef Parent2 As PChromo)
Dim counter1, counter2 As Integer
Dim CityTotal = AlleleCount - 1
Dim TempSeedPositionsMainC As New OrderMultipleCollection1
Dim AmountofSwaths As Integer = RAND.Next(0.3 * CityTotal, 0.7 * CityTotal) 'amount of swaths to create
Dim Swaths(AmountofSwaths - 1) As Integer
Dim Done As Boolean = False
Dim TempSwathSize As Integer = 0
Dim MaxSwathSize As Integer = AmountofSwaths * 2.5 'max swath size
Dim SwathHashTable1 As New Hashtable
'stack
'Dim P2Stack As New Stack
Dim P2Queue As New Queue
'Determines where all the seeds start
For counter1 = 0 To AmountofSwaths - 1
Swaths(counter1) = RAND.Next(0, CityTotal)
'If hashtable does not contain parent1.value then its ok to start another seed at this location
If (SwathHashTable1.ContainsKey(Parent1.Alleles(Swaths(counter1))) = False) Then
TempSwathSize = RAND.Next(1, MaxSwathSize)
SwathHashTable1.Add(Parent1.Alleles(Swaths(counter1)), Nothing)
Else
'Else, randomizer chose an already chosen location... so try for another
While (Done = False)
Swaths(counter1) = RAND.Next(0, CityTotal)
If (SwathHashTable1.ContainsKey(Parent1.Alleles(Swaths(counter1))) = False) Then
TempSwathSize = RAND.Next(1, MaxSwathSize)
SwathHashTable1.Add(Parent1.Alleles(Swaths(counter1)), Nothing)
Done = True
End If
End While
End If
Next
'move down parent 1 values
For counter1 = 0 To CityTotal
'this moves down parent 1 values to child
If (SwathHashTable1.Contains(Parent1.Alleles(counter1))) Then
Child.Alleles(counter1) = Parent1.Alleles(counter1)
Else
Child.Alleles(counter1) = -1
End If
'this sets which values of parent 2 to use
If (SwathHashTable1.ContainsKey(Parent2.Alleles(counter1)) = False) Then
P2Queue.Enqueue(Parent2.Alleles(counter1))
End If
Next
'move down parent2 values to child
For counter1 = 0 To CityTotal
If (Child.Alleles(counter1) = -1) Then
Child.Alleles(counter1) = P2Queue.Dequeue()
End If
Next
End Sub