Scramble Mutation Operator
'Default Float 0 is "0.01" and represents Minimum Swath Size. Valid Values are [0, 0.75]
'Default Float 0 is "0.53" and represents Maximum Swath Size. Valid Values are [0, 0.75]
'If randswapsize is less than 2, we force it to be 2 so that a scramble happens each time
Public Sub Scramble_Mutation(ByRef Child As PChromo)
'X refers to the starting index of the first swap area
'Y refers to the starting index of the second swap area
'These areas are "randomwapsize" long
Dim counterscra As Integer = 0
Dim randswathsize As Integer = RAND.Next(Scramble_Master.Doubles(0) * AlleleCount, Scramble_Master.Doubles(1) * AlleleCount) 'Doubles(0) = Min Swath Size || Doubles(1) = Max Swath Size
If randswathsize < 2 Then randswathsize = 2
Dim X As Integer = RAND.Next(0, AlleleCount - randswathsize)
Dim K(randswathsize - 1) As Integer
Dim NewK(randswathsize - 1) As Integer
For counterscra = 0 To randswathsize - 1
K(counterscra) = Child.Alleles(X + counterscra)
Next
Dim TempK As Integer = 0
If (randswathsize <= 2) Then
TempK = K(0)
K(0) = K(1)
K(1) = TempK
End If
If (randswathsize > 2) Then
Dim done As Boolean = False
counterscra = 0
While (counterscra < randswathsize)
Dim swap1 = RAND.Next(0, randswathsize - 1)
Dim swap2 = RAND.Next(0, randswathsize - 1)
If (swap2 = swap1) Then
While (done = False)
swap2 = RAND.Next(0, randswathsize - 1)
If (swap2 <> swap1) Then
done = True
End If
End While
End If
TempK = K(swap1)
K(swap1) = K(swap2)
K(swap2) = TempK
counterscra += 1
End While
End If
For counterscra = 0 To randswathsize - 1
Child.Alleles(X + counterscra) = K(counterscra)
Next
End Sub