為了參加國賽,這幾天學了模擬退火演算法,整理下當做模板方便國賽的時候用。
模擬退火用於處理最優化問題,可以求出當目標函式取得最小值時的決策變數的值。
在編寫程式時需要根據具體問題設計演算法,演算法描述為:
(1)解空間(初始解)
(2)目標函式
(3)新解的產生
① 2 變換法
② 3 變換法
(4)代價函式差
(5)接受準則
(6)降溫
(7)結束條件
下面matlab程式用於求解非線性規劃:
min f(x)=x1^2+x2^2+8
st.x1^2-x2>=0
-x1-x2^2+2=0
x1,x2>=0
matlab**:
clear
clc%生成初始解
sol_new2=1;%(1)解空間(初始解)
sol_new1=2-sol_new2^2;
sol_current1 = sol_new1;
sol_best1 = sol_new1;
sol_current2 = sol_new2;
sol_best2 = sol_new2;
e_current = inf;
e_best = inf;
rand('state',sum(clock)); %初始化隨機數發生器
t=90; %初始溫度
tf=89.9; %結束溫度
a = 0.99; %溫度下降比例
while t>=tf%(7)結束條件
for r=1:1000 %退火次數
%產生隨機擾動(3)新解的產生
sol_new2=sol_new2+rand*0.2;
sol_new1=2-sol_new2^2;
%檢查是否滿足約束
if sol_new1^2-sol_new2>=0 && -sol_new1-sol_new2^2+2==0 && sol_new1>=0 &&sol_new2>=0
else
sol_new2=rand*2;
sol_new1=2-sol_new2^2;
continue;
end%退火過程
e_new=sol_new1^2+sol_new2^2+8;%(2)目標函式
if e_new執行結果:
最優解為:
1.0038
0.9981
目標表示式的最小值等於:
10.0038
司守奎的演算法大全給出了利用模擬退火求解tsp問題的matlab演算法:
clc,clear
load sj.txt %載入敵方100 個目標的資料,資料按照**中的位置儲存在純文字檔案sj.txt 中
x=sj(:,1:2:8);x=x(:);
y=sj(:,2:2:8);y=y(:);
sj=[x y];
d1=[70,40];
sj=[d1;sj;d1];
sj=sj*pi/180;
%距離矩陣d
d=zeros(102);
for i=1:101
for j=i+1:102
temp=cos(sj(i,1)-sj(j,1))*cos(sj(i,2))*cos(sj(j,2))+sin(sj(i,2))*sin(sj(j,2));
d(i,j)=6370*acos(temp);
endendd=d+d';
s0=;sum=inf;
rand('state',sum(clock));
for j=1:1000
s=[1 1+randperm(100),102];
temp=0;
for i=1:101
temp=temp+d(s(i),s(i+1));
endif temprand(1)
s0=[s0(1:c1-1),s0(c2:-1:c1),s0(c2+1:102)];
sum=sum+df;
endt=t*at;
if tbreak;
endend% 輸出巡航路徑及路徑長度
s0,sum
模擬退火 爬山演算法 模板
學習部落格 題目鏈結 玄學演算法。一開始不知道調參wa到懷疑人生 後來嘗試改一下delta竟然過了。退火和爬山的區別其實就是當沒有更優解的時候退火會以乙個概率來接收,爬山就不接受。所以把else if exp res temp t rand max rand 注釋掉就是爬山了。pragma gcc ...
模擬退火模板
個人感覺模擬退火就是通過隨機法逐步趨近於最優值。結合例題進行說明 一 求三角形的費馬點 平面內到三個頂點距離和最小的點 includeusing namespace std struct point p 5 int row 4 向四個方向移動點尋找最優解 int col 4 double len p...
模擬退火法 matlab
模擬退火法 模擬退火法簡單解釋 為了找出地球上最高的山,一群兔子們開始想辦法。首先兔子們用酒將自己灌醉了,它們隨機地跳了很長的時間。在這期 間,它們可能走向高處,也可能踏入平地。但是,隨著時間的流逝,它們漸漸清醒了並朝著最高的方向跳去。最後就達到了珠穆朗瑪峰。所謂的退火是指將固體加熱到足夠高的溫度,...