實驗9 模擬退火演算法求解揹包問題

2021-09-10 10:54:28 字數 4031 閱讀 8391

傳送門(所有的實驗都使用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....