模擬退火——投影尋蹤
附錄:模擬退火投影尋蹤
運行環境:Matlab2014a
程序一:
clear all;close all;clc
%導入數據,列項是指標,行項是指標的數據,比如一個指標01-15年的數據
x=[0.167634 0.171094
0.190174 0.193634
0.175962 0.179422
0.182961 0.186421
0.169013 0.172473
0.190852 0.194312
0.175527 0.178987
0.194058 0.197518
0.186534 0.189994
0.148956 0.152416
0.142630 0.146090
0.138551 0.142011
0.156366 0.159826
0.182605 0.186065
0.186847 0.190307];
%矩陣維度計算,目的在於方便後面的計算
[a,b]=size(x);
%如果各指標數據的單位不同,則需歸一化處理
%max1=max(x);
%min1=min(x);
%正向指標歸一化,例子如下:
%x(:,1)=(0.98*max1(1)-x(:,1))/(0.98*max1(1)-0.02*min1(1));
%x(:,1)指的是x矩陣中的第一列
%負向指標歸一化,例子如下:
%x(:,2)=(x(:,2)-0.02*min1(2))/(0.98max1(2)-0.02*min1(2));
%x(:,2)指的是x矩陣中的第二列
%此外也可直接將歸一化的數據直接導入x矩陣中就不用以上加%的程序了
%這裡的最大最小為什麼要乘以個0.98和0.02呢,這裡小編直接說結果把說下吧,
%如果不分別乘以0.98和0.02,那麼最終的r矩陣可能會出現0,從而干擾結果
tic
for k=1:a
%退火尋找最優投影方向 temperature=100;%初始溫度 iter=100;%迭代次數 L=1;%用於記錄迭代的次數n=2;%指標個數
c=suiji(n);%隨機生成初始值,在遺傳演算法中就相當於初始種群 p=c; y=Target(x,c); while temperature>0.01 for i=L:iterc1=suiji(n);%這裡為什麼還要隨機呢,目的在於避免演算法陷入局部最優值這一缺陷
y1=Target(x,c1);%計算目標函數值
delta_e=y1-y;
if delta_e>0
y=y1;
p=c1;
else
if
exp(delta_e/temperature)>rand()y=y1;
p=c1;
end
end
endL=L+1;
temperature=temperature*0.99; end w(k)=y; e(k,:)=p;end
toc
disp(max(w));
%求得各樣本投影值 r
c=e(find(w==max(w)),:)%c記錄的是每個指標的權重值,也就是通過對數據分析,賦予了指標一個參比性的一個值
%這裡的find(w==max(w)是什麼意思呢,是找到w矩陣中最後一個最大值的位置,目的也是為了尋找最優的結果
%e記錄的是經L次迭代生成的一個參比性值的矩陣
for i=1:a
for j=1:b r(i,j)=sum(x(i,j).*c(j));%每行每列的評價值 endend
sum(r)%01-15年間每個指標的評價值,即總體評價
程序二:
function a=suiji(n)
%初始化
for k=1:n
b(k)=rand();end
temp=sum(b.^2);
a=sqrt(b.^2/temp);
end
程序三:
function y=Target(x,a)
%計算目標函數值,見模型步驟3
[m,n]=size(x);
for i=1:m
s1=0; for j=1:n s1=s1+a(j)*x(i,j); endz(i)=s1;end
Sz=std(z);%方差
R=0.1*Sz;
s3=0;
for i=1:m
for j=1:m r=abs(z(i)-z(j));t=R-r; if t>=0 u=1; else u=0; end s3=s3+t*u; endend
Dz=s3;
y=Sz*Dz;
end
推薦閱讀:
※2017年美國數學建模比賽的一點心得
※灰色模型的MATLAB代碼——數學建模必備
※我的數學建模之路 (關於2017年所有參賽歷程及tips)
※【MCM/ICM】數學建模基礎知識儲備(一)
※差分方程建模
TAG:數學建模 |