Skip to content

Commit 490e0f4

Browse files
committed
-DE strategyの整理
-JADEの修正
1 parent f49ccdd commit 490e0f4

File tree

10 files changed

+222
-120
lines changed

10 files changed

+222
-120
lines changed

LibOptimization/My Project/AssemblyInfo.vb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Imports System.Runtime.InteropServices
1212
<Assembly: AssemblyDescription("Numeric Optimization Library for .NET Framework")>
1313
<Assembly: AssemblyCompany("")>
1414
<Assembly: AssemblyProduct("LibOptimization")>
15-
<Assembly: AssemblyCopyright("tomitomi3")>
15+
<Assembly: AssemblyCopyright("tomitomi3 (https://github.com/tomitomi3/LibOptimization)")>
1616
<Assembly: AssemblyTrademark("")>
1717

1818
<Assembly: ComVisible(False)>

LibOptimization/Optimization/clsOptDE.vb

Lines changed: 84 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ Namespace Optimization
2222
''' [1]Storn, R., Price, K., "Differential Evolution – A Simple and Efficient Heuristic for Global Optimization over Continuous Spaces", Journal of Global Optimization 11: 341–359.
2323
''' [2]Price, K. and Storn, R., "Minimizing the Real Functions of the ICEC’96 contest by Differential Evolution", IEEE International Conference on Evolutionary Computation (ICEC’96), may 1996, pp. 842–844.
2424
''' [3]Sk. Minhazul Islam, Swagatam Das, "An Adaptive Differential Evolution Algorithm With Novel Mutation and Crossover Strategies for Global Numerical Optimization", IEEE TRANSACTIONS ON SYSTEMS, MAN, AND CYBERNETICS—PART B: CYBERNETICS, VOL. 42, NO. 2, APRIL 2012, pp482-500.
25+
''' [4]田邊遼司, and 福永Alex. "自動チューナーを用いた異なる最大評価回数における Differential Evolution アルゴリズムのパラメータ設定の調査." 進化計算学会論文誌 6.2 (2015): 67-81.
2526
'''
2627
''' Implment:
2728
''' N.Tomi(tomi.nori+github at gmail.com)
@@ -66,12 +67,6 @@ Namespace Optimization
6667
''' </summary>
6768
Public Property F As Double = 0.5
6869

69-
''' <summary>
70-
''' Differential weight(Scaling factor)(Default:0.5)
71-
''' CurrentToBest, randToBest
72-
''' </summary>
73-
Public Property Fdash As Double = 0.5
74-
7570
''' <summary>
7671
''' Cross over ratio(Default:0.9)
7772
''' </summary>
@@ -83,23 +78,23 @@ Namespace Optimization
8378
Public Property DEStrategy As EnumDEStrategyType = EnumDEStrategyType.DE_rand_1_bin
8479

8580
''' <summary>
86-
''' Enum Differential Evolution Strategy
81+
''' Enum Differential Evolution Strategy[3][4]
8782
''' </summary>
8883
Public Enum EnumDEStrategyType
89-
''' <summary>DE/rand/1/bin 強い大域検索</summary>
84+
''' <summary>DE/rand/1/bin - global searchability(大域検索)</summary>
9085
DE_rand_1_bin
91-
''' <summary>DE/rand/2/bin 強い大域検索</summary>
86+
''' <summary>DE/rand/2/bin - Strong global searchability(強い大域検索)</summary>
9287
DE_rand_2_bin
93-
''' <summary>DE/best/1/bin 強い局所検索</summary>
88+
''' <summary>DE/best/1/bin - local searchability(局所検索)</summary>
9489
DE_best_1_bin
95-
''' <summary>DE/best/2/bin 強い局所検索</summary>
90+
''' <summary>DE/best/2/bin - Strong local searchability(強い局所検索)</summary>
9691
DE_best_2_bin
97-
''' <summary>DE/current/1/bin 弱い大域検索</summary>
98-
DE_current_1_bin
99-
''' <summary>DE/currentToBest/1/bin 弱い局所検索</summary>
92+
''' <summary>DE/currentToRand/1/bin</summary>
93+
DE_current_to_rand_1_bin
94+
''' <summary>DE/currentToBest/1/bin - local searchability(局所検索)</summary>
10095
DE_current_to_Best_1_bin
101-
''' <summary>DE/randToBest/1/bin 大域・局所検索</summary>
102-
DE_rand_to_Best_1_bin
96+
''' <summary>DE/currentToBest/2/bin - local searchability(局所検索)</summary>
97+
DE_current_to_Best_2_bin
10398
End Enum
10499

105100
''' <summary>population</summary>
@@ -230,77 +225,79 @@ Namespace Optimization
230225
Dim child = New clsPoint(Me.m_func)
231226
Dim j = Me.m_rand.Next() Mod Me.m_func.NumberOfVariable
232227
Dim D = Me.m_func.NumberOfVariable - 1
233-
If Me.DEStrategy = EnumDEStrategyType.DE_rand_1_bin Then
234-
'DE/rand/1/bin
235-
For k = 0 To Me.m_func.NumberOfVariable - 1
236-
If Me.m_rand.NextDouble() < Me.CrossOverRatio OrElse k = D Then
237-
child(j) = p1(j) + Me.F * (p2(j) - p3(j))
238-
Else
239-
child(j) = xi(k)
240-
End If
241-
j = (j + 1) Mod Me.m_func.NumberOfVariable 'next
242-
Next
243-
ElseIf Me.DEStrategy = EnumDEStrategyType.DE_rand_2_bin Then
244-
'DE/rand/2/bin
245-
For k = 0 To Me.m_func.NumberOfVariable - 1
246-
If Me.m_rand.NextDouble() < Me.CrossOverRatio OrElse k = D Then
247-
child(j) = p1(j) + Me.F * (p2(j) + p3(j) - p4(j) - p5(j))
248-
Else
249-
child(j) = xi(k)
250-
End If
251-
j = (j + 1) Mod Me.m_func.NumberOfVariable 'next
252-
Next
253-
ElseIf Me.DEStrategy = EnumDEStrategyType.DE_best_1_bin Then
254-
'DE/best/1/bin
255-
For k = 0 To Me.m_func.NumberOfVariable - 1
256-
If Me.m_rand.NextDouble() < Me.CrossOverRatio OrElse k = D Then
257-
child(j) = best(j) + Me.F * (p1(j) - p2(j))
258-
Else
259-
child(j) = xi(k)
260-
End If
261-
j = (j + 1) Mod Me.m_func.NumberOfVariable 'next
262-
Next
263-
ElseIf Me.DEStrategy = EnumDEStrategyType.DE_best_2_bin Then
264-
'DE/best/2/bin
265-
For k = 0 To Me.m_func.NumberOfVariable - 1
266-
If Me.m_rand.NextDouble() < Me.CrossOverRatio OrElse k = D Then
267-
child(j) = best(j) + Me.F * (p1(j) + p2(j) - p3(j) - p4(j))
268-
Else
269-
child(j) = xi(k)
270-
End If
271-
j = (j + 1) Mod Me.m_func.NumberOfVariable 'next
272-
Next
273-
ElseIf Me.DEStrategy = EnumDEStrategyType.DE_current_1_bin Then
274-
'DE/current-to(target-to)/1/bin
275-
For k = 0 To Me.m_func.NumberOfVariable - 1
276-
If Me.m_rand.NextDouble() < Me.CrossOverRatio OrElse k = D Then
277-
child(j) = xi(j) + Me.F * (p2(j) - p3(j))
278-
Else
279-
child(j) = xi(k)
280-
End If
281-
j = (j + 1) Mod Me.m_func.NumberOfVariable 'next
282-
Next
283-
ElseIf Me.DEStrategy = EnumDEStrategyType.DE_current_to_Best_1_bin Then
284-
'DE/current-to-best/1/bin
285-
For k = 0 To Me.m_func.NumberOfVariable - 1
286-
If Me.m_rand.NextDouble() < Me.CrossOverRatio OrElse k = D Then
287-
child(j) = xi(j) + Me.Fdash * (best(j) - p1(j)) + Me.F * (p2(j) - p3(j))
288-
Else
289-
child(j) = xi(k)
290-
End If
291-
j = (j + 1) Mod Me.m_func.NumberOfVariable 'next
292-
Next
293-
ElseIf Me.DEStrategy = EnumDEStrategyType.DE_rand_to_Best_1_bin Then
294-
'DE/rand-to-best/1/bin
295-
For k = 0 To Me.m_func.NumberOfVariable - 1
296-
If Me.m_rand.NextDouble() < Me.CrossOverRatio OrElse k = D Then
297-
child(j) = p1(j) + Me.Fdash * (best(j) - p1(j)) + Me.F * (p2(j) - p3(j))
298-
Else
299-
child(j) = xi(k)
300-
End If
301-
j = (j + 1) Mod Me.m_func.NumberOfVariable 'next
302-
Next
303-
End If
228+
229+
Select Case Me.DEStrategy
230+
Case EnumDEStrategyType.DE_best_1_bin
231+
'DE/best/1/bin
232+
For k = 0 To Me.m_func.NumberOfVariable - 1
233+
If Me.m_rand.NextDouble() < Me.CrossOverRatio OrElse k = D Then
234+
child(j) = best(j) + Me.F * (p1(j) - p2(j))
235+
Else
236+
child(j) = xi(k)
237+
End If
238+
j = (j + 1) Mod Me.m_func.NumberOfVariable 'next
239+
Next
240+
Case EnumDEStrategyType.DE_best_2_bin
241+
'DE/best/2/bin
242+
For k = 0 To Me.m_func.NumberOfVariable - 1
243+
If Me.m_rand.NextDouble() < Me.CrossOverRatio OrElse k = D Then
244+
child(j) = best(j) + Me.F * (p1(j) + p2(j) - p3(j) - p4(j))
245+
Else
246+
child(j) = xi(k)
247+
End If
248+
j = (j + 1) Mod Me.m_func.NumberOfVariable 'next
249+
Next
250+
Case EnumDEStrategyType.DE_current_to_Best_1_bin
251+
'DE/current-to-best/1/bin
252+
For k = 0 To Me.m_func.NumberOfVariable - 1
253+
If Me.m_rand.NextDouble() < Me.CrossOverRatio OrElse k = D Then
254+
child(j) = xi(j) + Me.F * (best(j) - p1(j)) + Me.F * (p2(j) - p3(j))
255+
Else
256+
child(j) = xi(k)
257+
End If
258+
j = (j + 1) Mod Me.m_func.NumberOfVariable 'next
259+
Next
260+
Case EnumDEStrategyType.DE_current_to_Best_2_bin
261+
'DE/current-to-best/2/bin
262+
For k = 0 To Me.m_func.NumberOfVariable - 1
263+
If Me.m_rand.NextDouble() < Me.CrossOverRatio OrElse k = D Then
264+
child(j) = xi(j) + Me.F * (best(j) - p1(j)) + Me.F * (p2(j) - p3(j)) + Me.F * (p4(j) - p5(j))
265+
Else
266+
child(j) = xi(k)
267+
End If
268+
j = (j + 1) Mod Me.m_func.NumberOfVariable 'next
269+
Next
270+
Case EnumDEStrategyType.DE_current_to_rand_1_bin
271+
'DE/current-to-rand/1/bin
272+
For k = 0 To Me.m_func.NumberOfVariable - 1
273+
If Me.m_rand.NextDouble() < Me.CrossOverRatio OrElse k = D Then
274+
child(j) = xi(j) + Me.F * (p2(j) - p3(j))
275+
Else
276+
child(j) = xi(k)
277+
End If
278+
j = (j + 1) Mod Me.m_func.NumberOfVariable 'next
279+
Next
280+
Case EnumDEStrategyType.DE_rand_1_bin
281+
'DE/rand/1/bin
282+
For k = 0 To Me.m_func.NumberOfVariable - 1
283+
If Me.m_rand.NextDouble() < Me.CrossOverRatio OrElse k = D Then
284+
child(j) = p1(j) + Me.F * (p2(j) - p3(j))
285+
Else
286+
child(j) = xi(k)
287+
End If
288+
j = (j + 1) Mod Me.m_func.NumberOfVariable 'next
289+
Next
290+
Case EnumDEStrategyType.DE_rand_2_bin
291+
'DE/rand/2/bin
292+
For k = 0 To Me.m_func.NumberOfVariable - 1
293+
If Me.m_rand.NextDouble() < Me.CrossOverRatio OrElse k = D Then
294+
child(j) = p1(j) + Me.F * (p2(j) + p3(j) - p4(j) - p5(j))
295+
Else
296+
child(j) = xi(k)
297+
End If
298+
j = (j + 1) Mod Me.m_func.NumberOfVariable 'next
299+
Next
300+
End Select
304301
child.ReEvaluate() 'Evaluate child
305302

306303
'Limit solution space

LibOptimization/Optimization/clsOptDEJADE.vb

Lines changed: 54 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ Namespace Optimization
1414
''' Refference:
1515
''' [1]Z.-H. Zhan, J. Zhang, Y. Li, and H. Chung, “JADE: Adaptive Differential Evolution With Optional External Archive” IEEE Trans. Systems, Man, and Cybernetics-Part B, vol. 39, no. 6, pp. 1362-1381, Dec. 2009.
1616
''' [2]阪井 節子,高濱 徹行, "パラメータの相関を考慮した適応型差分進化アルゴリズムJADEの改良", 不確実性の下での数理モデルとその周辺 Mathematical Model under Uncertainty and Related Topics RIMS 研究集会報告集
17-
''' (JADEの原著論文が見れなかったので[2]文献を参照)
18-
'''
17+
''' [3]田邊遼司, and 福永Alex. "自動チューナーを用いた異なる最大評価回数における Differential Evolution アルゴリズムのパラメータ設定の調査." 進化計算学会論文誌 6.2 (2015): 67-81. '''
18+
'''
1919
''' Implment:
2020
''' N.Tomi(tomi.nori+github at gmail.com)
2121
''' </remarks>
@@ -57,6 +57,9 @@ Namespace Optimization
5757
''' <summary>population</summary>
5858
Private m_parents As New List(Of clsPoint)
5959

60+
''' <summary>archive</summary>
61+
Private m_archive As New List(Of clsPoint)
62+
6063
''' <summary>Constant raio 0 to 1(Adaptive paramter for muF, muCR)(Default:0.1)</summary>
6164
Public Property C As Double = 0.1
6265

@@ -90,6 +93,7 @@ Namespace Optimization
9093
Me.m_iteration = 0
9194
Me.m_parents.Clear()
9295
Me.m_error.Clear()
96+
Me.m_archive.Clear()
9397

9498
'init muF, muCR
9599
muCR = 0.5
@@ -196,31 +200,46 @@ Namespace Optimization
196200
CR = 1.0
197201
End If
198202

199-
'Sort Evaluate
200-
m_parents.Sort()
203+
'pick pBest
204+
Dim pbest As clsPoint = Nothing
205+
Dim pBestIndex = CInt(Me.PopulationSize * Random.NextDouble())
206+
If pBestIndex <= 2 Then
207+
If Random.NextDouble() > 0.5 Then
208+
pbest = Me.m_parents(0)
209+
Else
210+
pbest = Me.m_parents(1)
211+
End If
212+
ElseIf pBestIndex = Me.PopulationSize Then
213+
pbest = m_parents(PopulationSize - 1) 'worst
214+
Else
215+
pbest = m_parents(Random.Next(0, pBestIndex))
216+
End If
201217

202-
'pick different parent without i
203-
Dim randIndex As List(Of Integer) = clsUtil.RandomPermutaion(m_parents.Count, i)
218+
'xi,g
204219
Dim xi = m_parents(i)
205-
Dim p1 As clsPoint = m_parents(randIndex(0))
206-
Dim p2 As clsPoint = m_parents(randIndex(1))
220+
221+
'pick xr1,g different parent without i
222+
Dim tempIndex1 = clsUtil.RandomPermutaion(m_parents.Count, i)
223+
Dim r1Index = tempIndex1(0)
224+
Dim p1 As clsPoint = m_parents(r1Index)
225+
226+
'pick xr2~,g different parent without i, xr1,g
227+
Dim sumIndex = m_parents.Count + m_archive.Count
228+
Dim tempIndex2 = clsUtil.RandomPermutaion(0, sumIndex, {i, r1Index})
229+
Dim r2Index = tempIndex2(0)
230+
Dim p2 As clsPoint = Nothing
231+
If r2Index >= m_parents.Count Then
232+
r2Index = r2Index - m_parents.Count
233+
p2 = m_archive(r2Index)
234+
Else
235+
p2 = m_parents(r2Index)
236+
End If
207237

208238
'Mutation and Crossover
209239
Dim child = New clsPoint(ObjectiveFunction)
210240
Dim j = Random.Next() Mod ObjectiveFunction.NumberOfVariable
211241
Dim D = ObjectiveFunction.NumberOfVariable - 1
212242

213-
'DE/current-to-pbest/1 for JADE Strategy. current 100p% p<-(0,1)
214-
Dim p = CInt(Me.PopulationSize * Random.NextDouble()) 'range is 0 to PopulationSize
215-
Dim pbest As clsPoint = Nothing
216-
If p = 0 Then
217-
pbest = m_parents(0) 'best
218-
ElseIf p >= Me.PopulationSize Then
219-
pbest = m_parents(PopulationSize - 1) 'worst
220-
Else
221-
pbest = m_parents(Random.Next(0, p))
222-
End If
223-
224243
'crossover
225244
For k = 0 To ObjectiveFunction.NumberOfVariable - 1
226245
If Random.NextDouble() < CR OrElse k = D Then
@@ -237,6 +256,9 @@ Namespace Optimization
237256

238257
'Survive
239258
If child.Eval < m_parents(i).Eval Then
259+
'add archive
260+
m_archive.Add(m_parents(i).Copy)
261+
240262
'replace
241263
m_parents(i) = child
242264

@@ -245,18 +267,29 @@ Namespace Optimization
245267
sumFSquare += F ^ 2
246268
sumCR += CR
247269
countSuccess += 1
270+
Else
271+
248272
End If
249273
Next 'population iteration
250274

275+
'remove archive
276+
Dim removeCount = m_archive.Count - PopulationSize
277+
If removeCount > 0 Then
278+
clsUtil.RandomizeArray(m_archive)
279+
m_archive.RemoveRange(m_archive.Count - removeCount, removeCount)
280+
End If
281+
251282
'calc muF, muCR
252283
If countSuccess > 0 Then
253-
muCR = (1 - C) * muCR + C * (sumCR / countSuccess) '(1-c) * muCR + c * meanA(CRs)
284+
'μCR = (1 − c) · μCR + c · meanA(SCR)
285+
muCR = (1 - C) * muCR + C * (sumCR / countSuccess)
286+
'μF = (1 − c) · μF + c · meanL (SF)
254287
muF = (1 - C) * muF + C * (sumFSquare / sumF)
255288
Else
256289
muCR = (1 - C) * muCR
257290
muF = (1 - C) * muF
258-
'Console.WriteLine("muF={0}, muCR={1}", muF, muCR)
259291
End If
292+
'Console.WriteLine("muF={0}, muCR={1}", muF, muCR)
260293
Next
261294

262295
Return False

0 commit comments

Comments
 (0)