傳送門(所有的實驗都使用python實現)
實驗1 bp神經網路實驗
實驗2 som網實驗
實驗3 hopfield實現八皇后問題
實驗4 模糊搜尋演算法**薄冰厚度
實驗5 遺傳演算法求解tsp問題
實驗6 蟻群演算法求解tsp問題
實驗7 粒子群優化演算法求解tsp問題
實驗8 分布估計演算法求解揹包問題
實驗9 模擬退火演算法求解揹包問題
實驗10 禁忌搜尋演算法求解tsp問題
一、實驗目的
理解並使用模擬退火演算法
二、實驗內容
實現基於模擬退火演算法的揹包問題求解
三、實驗環境
使用python3.0 在 eclipse進行編輯
四、實驗步驟
1、輸入介紹:
揹包物體的個數為10,揹包容量c,物品價值p,物品重量c。
引數設定 : time 迭代次數, balance 平衡次數 best記錄全域性最優 t 溫度 af退火率
2、產生個體:
隨機產生乙個合法的初始解
3、產生新解:
隨機選取物品
, 若
i 不在揹包中
, 則將其直接放入揹包中
, 或同時從揹包中隨機取出另一物品
j ; 若 i
已在揹包中
, 則將其取出
, 並同時隨機裝入另一物品
j .
4、計算揹包價值與合法性。
計算物品價值總和,並判斷是否超重。
5、接受新解:
(1)超重,放棄此解
(2)比當前解揹包價值更優,直接接受新解
(3)比當前解揹包價值更劣,概率接受新解,概率 p=exp(-dlt/t)其中dlt為揹包價值差。
6、更新全域性最優解。
7、若達到平衡次數,則下降溫度,重置平衡次數。否則繼續產生新解。
8、終止條件
揹包價值達到最優解或者溫度下降到x度以下。
執行截圖:
初始溫度200 退火率0.95 平衡次數5 找到最優解所需次數36
初始溫度200 退火率0.8 平衡次數5 找到最優解所需次數22
初始溫度200 退火率0.95 平衡次數10 找到最優解所需次數7
初始溫度200 退火率0.95 平衡次數100 找到最優解所需次數1
五、總結
退火率的設定對於演算法效率影響十分明顯,溫度下降過快雖然較早達到穩定,但是有時找不到最優解,溫度下降過慢會導致耗時增多,經過多次實驗得出,退火率選擇0.8為最佳。
平衡次數設定越多,所需迭代次數越少,但是單次迭代時間變長,所以平衡次數設定10次為最佳。
初始溫度設定將會影響解的搜尋範圍,溫度越高最終解的質量越優,但是耗時也相應變長,初始溫度設定200為最佳。
python原始碼
#coding:gbk
import random
import math
global m,c; # m個物品 ,揹包容量c
global time,balance; # time 迭代次數, balance 平衡次數
global best,t,af; #best 記錄全域性最優 t 溫度 af退火率
m=10; t=200.0; af =0.95;
time =10; balance = 100;
best_way=[0]*m; now_way=[0]*m # best_way 記錄全域性最優解方案 now_way 記錄當前解方案
weight=[95, 4, 60, 32, 23, 72, 80, 62,65, 46]; value=[55, 10, 47, 5, 4, 50, 8, 61,85, 87]
def cop(a,b,le): #複製函式 把b陣列的值賦值a陣列
for i in range(le):
a[i]=b[i]
def calc(x): #計算揹包價值
global c,wsum;
vsum=0;wsum=0;
for i in range(m):
vsum +=x[i]*value[i]; wsum += x[i]*weight[i];
return vsum;
def produce(): #初始產生隨機解
while (1>0):
for k in range(m):
if(random.random() < 0.5): now_way[k]=1;
else: now_way[k]=0;
calc(now_way)
if(wsum 0):
ob = random.randint(0,m-1);
if(x[ob]==1): x[ob]=0;break;
def put(x): #隨機放入揹包中不存在的物品
while(1>0):
ob = random.randint(0,m-1);
if(x[ob]==0): x[ob]=1;break;
def slove(): #迭代函式
global best,t,balance;
test=[0]*m;
now = 0; #當前揹包價值
for i in range(balance):
now = calc(now_way);
cop(test,now_way,m);
ob = random.randint(0,m-1); #隨機選取某個物品
if(test[ob]==1): put(test);test[ob]=0; #在揹包中則將其拿出,並加入其它物品
else: #不在揹包中則直接加入或替換掉已在揹包中的物品
if(random.random()<0.5):test[ob]=1;
else : get(test); test[ob]=1;
temp= calc(test);
if(wsum>c):continue; # 非法解則跳過
if(temp > best): best=temp; cop(best_way,test,m); #更新全域性最優
if(temp > now): cop(now_way,test,m); #直接接受新解
else:
g = 1.0*(temp-now)/t;
if(random.random() < math.exp(g)): #概率接受劣解
cop(now_way,test,m);
#*****************************主函式**********************
init();
isgood = 0;
for i in range(time):
slove();
t = t*af; #溫度下降
if(best==295):
print('找到最優解:295,迭代次數',i+1); isgood = 1; break; #達到最優解提前退出
if(isgood == 0): print('只找到次優解:',best,'迭代次數',time);
print('方案為:',best_way); #列印方案
模擬退火求解TSP問題
1.尋找下乙個解 2.計算下乙個解的能量 3.決定是否接受這個解 4.降溫 double randfloat double t0 1000000 tk 1,t t0,d 0.9999 int x initx 當前解 初始解 int anse,nowe 全域性最優解的能量,當前解的能量 anse no...
演算法實驗 回溯法求解0 1揹包問題
通過剪枝和衝突,走遍所有可能的選擇,最終得到最優解 1 每個節點有兩種選擇方法,依次對所有可能的方法進行遍歷 2 在遍歷的過程中通過設定一全域性變數用來比較所有的解法的結果,最終得到最優解 lagestv 0bestx 1 2 def jianzhi i,n,c,w,ww if i n return...
基於模擬退火的tsp問題求解
模擬退火演算法 於固體退火原理,是一種基於概率的演算法,將固體加溫至充分高,再讓其徐徐冷卻,加溫時,固體內部粒子隨溫公升變為無序狀,內能增大,而徐徐冷卻時粒子漸趨有序,在每個溫度都達到平衡態,最後在常溫時達到基態,內能減為最小。這是關於模擬退火的科普 模擬退火 模擬退火實現起來主要分為三個部分 1....