模拟退火算法--求解货郎担问题(C#实现)

具体原理已在 前面 已经介绍过了。下面是实现过程

退火过程由冷却进度表 (Cooling Schedule) 控制,包括控制参数的初值 t 及其衰减因子Δ t 、每个 t 值时的迭代次数 L 和停止条件 S 。本试验分别使用 Temperature 、 DiminishedRate 、 MarkovLength 、 AIM 来表示。其参数值经过多次试验反复测试得到最好的组合,当

Temperature = 300 、 DiminishedRate = 0.9

MarkovLength = 130000 、 AIM = 100

的时候最好。

--------------------------------------------

1

初始化:初始温度 T( 充分大 ) ,初始解状态 So( 是算法迭代的起点 ) , 每个 T 值的迭代次数 L

2 while ( true )

2 . 1 对 k=1 ,……, L 做第 2 . 1 . 1 至第 2 . 1 . 5 步:

2 . 1 . 1 先预算新解和当前解的差值 distinct

2 . 1 . 2 if(distinct<0||random(0..1)

  1<exp(distinct **="" 0.9="" 1="" 10="" 100="" 130000="" 144,="" 2="" 20000="" 3="" 4="" 5="" <="" _num="" aim="" bestpath="" currentpath="" diminish_="" diminish_t_num="" diminishedrate="" markovlength="" s="" t="" temperature="" temperature))="" |="" ²="" …="" ′并将新解作为当前解="" 则="" 则产生新解="" 初始路径为="" 如果="" 如果连续="" 对进度表中的每个参数进行了="" 次仍没有新的最好解产生则就假设找到了最好路径,跳出循环,结束程序,返回最优解。="" 次的测试。="" 此循环都没有更好的解产生则="" 步="" 测试条件:="" 表明此次退火没有产生新的最好解,并退出此次循环,进行退火,即跳到第="" 输出最佳路径="" 连续退火了="" 降温="" +="" ,="" ----------------------------------------------="" .="" :="" =="">=31000  ** **
  2
  3| 
  4
  531000-30600  ** **
  6
  7| 
  8
  930600-30400  ** **
 10
 11| 
 12
 1330300  -  30400 
 14
 15| 
 16
 17&lt;30300   
 18  
 19---|---|---|---|---|---  
 20  
 21200 
 22
 23| 
 24
 250 
 26
 27| 
 28
 295 
 30
 31| 
 32
 334 
 34
 35| 
 36
 371 
 38
 39| 
 40
 410   
 42  
 43250 
 44
 45| 
 46
 471 
 48
 49| 
 50
 517 
 52
 53| 
 54
 551 
 56
 57| 
 58
 590 
 60
 61| 
 62
 631   
 64  
 65** 300  **
 66
 67| 
 68
 69** 1  **
 70
 71| 
 72
 73** 4  **
 74
 75| 
 76
 77** 2  **
 78
 79| 
 80
 81** 2  **
 82
 83| 
 84
 85** 1  **  
 86  
 87350 
 88
 89| 
 90
 910 
 92
 93| 
 94
 957 
 96
 97| 
 98
 992 
100
101| 
102
1032 
104
105| 
106
1070   
108  
109400 
110
111| 
112
1132 
114
115| 
116
1173 
118
119| 
120
1214 
122
123| 
124
1251 
126
127| 
128
1290   
130  
131根据初始温度测试,温度  &lt;300  的时候效果不好出现大的数值的情况比较多,当在  300  -  400  的时候各个数据段的数据都会有,单中间的比例比较大,而温度  &gt; =  400  的时候出现的值趋于中间段,也就是温度越大效果越稳定,但是需要花费的时间更多了,因此综合起来,取  300  的温度比较适合,而且出现小值的情况也不少,在测试过程中曾经得到  30159.07  的数值。 
132
133²  DiminishedRate 
134
135测试条件: 
136
137Temperature  :  300  MarkovLength  :  130000  AIM  :  100  Diminish_ T _num  :  20000 
138
139DiminishedRate  ** **
140
141| 
142
143&gt;=31000  ** **
144
145| 
146
14731000-30600  ** **
148
149| 
150
15130600-30400  ** **
152
153| 
154
15530300  -  30400 
156
157| 
158
159&lt;30300   
160  
161---|---|---|---|---|---  
162  
1630.70 
164
165| 
166
1673 
168
169| 
170
1715 
172
173| 
174
1751 
176
177| 
178
1791 
180
181| 
182
1830   
184  
1850.80 
186
187| 
188
1891 
190
191| 
192
1935 
194
195| 
196
1974 
198
199| 
200
2010 
202
203| 
204
2050   
206  
207** 0.90  **
208
209| 
210
211** 0  **
212
213| 
214
215** 4  **
216
217| 
218
219** 4  **
220
221| 
222
223** 1  **
224
225| 
226
227** 1  **  
228  
2290.95 
230
231| 
232
2331 
234
235| 
236
2373 
238
239| 
240
2414 
242
243| 
244
2452 
246
247| 
248
2490   
250  
251温度的降低率,当在  0.9  的时候从时间和效果上考虑最好,当  &lt; =  0.7  的时候效果明显变差。在  0.95  的时候速度慢了一倍,而且效果也不是很好。 
252
253&lt;SPAN styl</exp(distinct>
Published At
Categories with Web编程
Tagged with
comments powered by Disqus