@@ -13,7 +13,7 @@ Class {
1313 #classVars : [
1414 'Primes'
1515 ],
16- #category : 'Math-FunctionFit'
16+ #category : # 'Math-FunctionFit'
1717}
1818
1919{ #category : #utils }
@@ -34,18 +34,27 @@ PMAnotherChromosomeManager class >> integerDigitsFor: anInteger base: aBase [
3434
3535{ #category : #utils }
3636PMAnotherChromosomeManager class >> numberOfHamersleyPoints: n dimension: d randomized: aBoolean [
37- "a bit randomized "
38- |dist|
39- dist :=1.0 / n.
40- ^(1 to: n) collect: [:number| (1 to: d)collect: [:dim|
41- ( dim=1)
42- ifTrue:[aBoolean ifTrue: [(number/n)- dist random] ifFalse: [(number/n)]]
43- ifFalse: [|sum prime|
44- sum :=0.
45- prime :=Primes at: dim-1.
46- (self integerDigitsFor: number base: prime)
47- reverse withIndexDo: [:i :index|sum:= i/(prime raisedToInteger: index)+sum.].
48- aBoolean ifTrue: [sum + dist random] ifFalse: [sum] ] ]].
37+ "a bit randomized "
38+ | dist randomNumberGenerator |
39+ dist := 1.0 / n.
40+ randomNumberGenerator := Random new.
41+
42+ ^(1 to: n) collect: [ :number |
43+ (1 to: d) collect: [ :dim |
44+ (dim=1)
45+ ifTrue: [ aBoolean
46+ ifTrue: [ (number/n) - (randomNumberGenerator nextBetween: 0 and: dist) ]
47+ ifFalse: [ number/n ] ]
48+ ifFalse: [ |sum prime|
49+ sum := 0.
50+ prime := Primes at: dim - 1.
51+
52+ (self integerDigitsFor: number base: prime) reverse withIndexDo: [ :i :index |
53+ sum := i / (prime raisedToInteger: index) + sum ].
54+
55+ aBoolean
56+ ifTrue: [ sum + (randomNumberGenerator nextBetween: 0 and: dist) ]
57+ ifFalse: [ sum ] ] ]].
4958]
5059
5160{ #category : #'instance creation' }
@@ -57,27 +66,44 @@ PMAnotherChromosomeManager class >> origin: anArray range: anotherArray [
5766PMAnotherChromosomeManager >> crossover: aChromosome1 and: aChromosome2 [
5867"the Discrete Recombination operator
5968that does not prefer schemata of certain parameters based on their position"
60- |new1 new2|
61- aChromosome1=aChromosome2 ifTrue:[^Array with:( self mutate: aChromosome2) with: (self mutate: aChromosome1) ].
69+ | new1 new2 |
70+
71+ aChromosome1 = aChromosome2 ifTrue:[
72+ ^ Array
73+ with: (self mutate: aChromosome2)
74+ with: (self mutate: aChromosome1) ].
75+
6276 new1 := self clone: aChromosome1.
6377 new2 := self clone: aChromosome2.
64- 2 to: new1 size do: [:i| (Float random <0.5)ifTrue:[
78+
79+ 2 to: new1 size do: [ :i |
80+ (randomNumberGenerator next < 0.5) ifTrue: [
6581 new1 at: i put: (aChromosome2 at: i).
66- new2 at: i put: (aChromosome1 at: i)]].
67- ^Array with: new1 with: new2
82+ new2 at: i put: (aChromosome1 at: i) ] ].
83+
84+ ^ Array with: new1 with: new2
6885]
6986
7087{ #category : #operation }
7188PMAnotherChromosomeManager >> eirCrossover: aChromosome1 and: aChromosome2 [
72- "the Extended Intermediate Recombination 0.5 operator, slightly changed to make it more similar to linecrossover (distribution is more centered around Chromosome1, which is better than C2)"
73- | r new1 new2 dif|
74- dif:=aChromosome2 - aChromosome1.
75- dif norm=0 ifTrue:[^Array with:( self mutate: aChromosome2) with: (self mutate: aChromosome1) ].
76- r:=(1 to: aChromosome1 size) collect:[:i| 2.0 random -0.5] .
77- new1 := aChromosome1+ (r * dif).
78- r:=(1 to: aChromosome1 size) collect:[:i| 1.0 random -0.5] .
79- new2 := aChromosome1+ (r * dif).
80- ^Array with: new1 with: new2
89+ "the Extended Intermediate Recombination 0.5 operator, slightly changed to make it more similar to linecrossover (distribution is more centered around Chromosome1, which is better than C2)"
90+ | randomNumbers new1 new2 dif |
91+ dif := aChromosome2 - aChromosome1.
92+
93+ dif norm = 0 ifTrue: [
94+ ^ { self mutate: aChromosome2 . self mutate: aChromosome1 } ].
95+
96+ randomNumbers := (1 to: aChromosome1 size) collect: [ :i |
97+ randomNumberGenerator nextBetween: -0.5 and: 1.5 ].
98+
99+ new1 := aChromosome1 + (randomNumbers * dif).
100+
101+ randomNumbers := (1 to: aChromosome1 size) collect: [ :i |
102+ randomNumberGenerator nextBetween: -0.5 and: 0.5 ].
103+
104+ new2 := aChromosome1 + (randomNumbers * dif).
105+
106+ ^ { new1 . new2 }
81107
82108]
83109
@@ -116,20 +142,25 @@ PMAnotherChromosomeManager >> lineCrossOver: aChromosome1 and: aChromosome2 [
116142
117143{ #category : #operation }
118144PMAnotherChromosomeManager >> mutate: aVector [
119- "BGA mutation"
120- | isMutated threshold new index|
121- isMutated :=false.
122- threshold :=1/ aVector size asFloat .
123- new :=aVector copy.
124- 1 to: aVector size do:[:i| Float random < threshold ifTrue:[
125- isMutated :=true.
145+ "BGA mutation"
146+ | isMutated threshold new index |
147+
148+ isMutated := false.
149+ threshold := 1 / aVector size asFloat.
150+ new := aVector copy.
151+
152+ 1 to: aVector size do: [ :i |
153+ randomNumberGenerator next < threshold ifTrue: [
154+ isMutated := true.
126155 new at: i put: (new at: i) +
127- ((Float random <0.5 ifTrue: [0.5] ifFalse:[0.5 negated ] )*(self randomRangeAt: i))]].
156+ ((randomNumberGenerator next < 0.5 ifTrue: [ 0.5 ] ifFalse:[ -0.5 ]) * (self randomRangeAt: i)) ] ].
157+
128158 isMutated ifFalse: [
129- index := aVector size random + 1 .
159+ index := randomNumberGenerator nextIntegerBetween: 1 and: aVector size .
130160 new at: index put: (new at: index) +
131- ((Float random <0.5 ifTrue: [0.5] ifFalse:[0.5 negated ] )*(self randomRangeAt: index))].
132- ^new
161+ ((randomNumberGenerator next < 0.5 ifTrue: [ 0.5 ] ifFalse:[ -0.5 ]) * (self randomRangeAt: index)) ].
162+
163+ ^ new
133164]
134165
135166{ #category : #accessing }
@@ -156,7 +187,7 @@ PMAnotherChromosomeManager >> printOn: aStream [
156187{ #category : #operation }
157188PMAnotherChromosomeManager >> process: aChromosome1 and: aChromosome2 [
158189 | roll |
159- roll := Number random .
190+ roll := randomNumberGenerator next .
160191 roll < rateOfCrossover
161192 ifTrue: [population addAll: (self crossover: aChromosome1 and: aChromosome2)]
162193 ifFalse:
@@ -224,8 +255,8 @@ PMAnotherChromosomeManager >> rateOfMutation: aNumber [
224255
225256{ #category : #private }
226257PMAnotherChromosomeManager >> smallDistribution [
227- "an exponential distribution as used by H. Mühlenbein"
228- ^ 2 raisedTo: (16 *Float random negated)
258+ "an exponential distribution as used by H. Mühlenbein"
259+ ^ 2 raisedTo: (16 * randomNumberGenerator next negated)
229260]
230261
231262{ #category : #private }
0 commit comments