@@ -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
0 commit comments