智能优化算法
Matlab
下標(biāo)從1開(kāi)始!!
~=:相當(dāng)于不等于!=
eps表示的是一個(gè)數(shù)可以分辨的最小精度,返回1.0和下一個(gè)精度最高的雙精度浮點(diǎn)數(shù)的差值, 即2^(-52)。
Inf和-Inf分別代表正無(wú)窮和負(fù)無(wú)窮
y = length(x) 函數(shù)計(jì)算指定向量或矩陣的長(zhǎng)度y。如果參數(shù)變量x是向量,則返回其長(zhǎng)度;如果參數(shù)變量是非空矩陣,則length(x)與max(size(x))等價(jià)
矩陣取值
v(m , : ):取第m行
v( : ,m):取第m列
v(x,y):取第x行第y列
矩陣計(jì)算
[SortFit1,Index]=sort(Fit1):對(duì)Fit進(jìn)行排序,排序結(jié)果放入SortFit1矩陣,結(jié)果每位上的元素在原來(lái)列上的序號(hào)放入Index矩陣
[aa,bb]=size(A):aa=行數(shù),bb=列數(shù)
cumsum(x):對(duì)矩陣x進(jìn)行逐列累加,例:[a,b,c,d]=>[a,a+b,a+b+c,a+b+c+d]
sum(x):對(duì)矩陣x進(jìn)行逐列求和,即每列之和
取整函數(shù)
fix朝零方向取整,如fix(-1.3)=-1; fix(1.3)=1;
floor,顧名思義,就是地板,所以是取比它小的整數(shù),即朝下取整,如floor(-1.3)=-2; floor(1.3)=1;floor(-1.8)=-2,floor(1.8)=1
ceil,與floor相反,它的意思是天花板,也就是取比它大的最小整數(shù),即朝上取整,如ceil(-1.3)=-1; ceil(1.3)=2;ceil(-1.8)=-1,ceil(1.8)=2
round四舍五入到最近的整數(shù),如round(-1.3)=-1;round(-1.52)=-2;round(1.3)=1;round(1.52)=2
生成隨機(jī)數(shù)函數(shù)
rand 生成均勻分布的偽隨機(jī)數(shù)。分布在(0~1)之間
rand(m,n)生成m行n列的均勻分布的偽隨機(jī)數(shù)
randn 生成標(biāo)準(zhǔn)正態(tài)分布的偽隨機(jī)數(shù)(均值為0,方差為1)
randi 生成均勻分布的偽隨機(jī)整數(shù)
randi(iMax)在閉區(qū)間[1,iMax]生成均勻分布的偽隨機(jī)整數(shù)
randi(iMax,m,n)在開(kāi)區(qū)間[1,iMax]生成mXn型隨機(jī)矩陣
r = randi([iMin,iMax],m,n)在開(kāi)區(qū)間[iMin,iMax]生成m*n型隨機(jī)矩陣
randperm 生成整數(shù)的隨機(jī)排列
排序函數(shù)
B = sort(A) 按升序對(duì) A 的元素進(jìn)行排序。
如果 A 是向量,則 sort(A) 對(duì)向量元素進(jìn)行排序。
如果 A 是矩陣,則 sort(A) 會(huì)將 A 的列視為向量并對(duì)每列進(jìn)行排序,從上到下,從小到大
如果 A 是多維數(shù)組,則 sort(A) 會(huì)沿大小不等于 1 的第一個(gè)數(shù)組維度計(jì)算,并將這些元素視為向量
復(fù)制函數(shù)
B = repmat(A,x,y)生成重復(fù)數(shù)矩陣
若A是一個(gè)數(shù),則生成x*y的矩陣,全是A
若A是一個(gè)矩陣,將矩陣A復(fù)制2行3列
智能優(yōu)化算法
代表人物匯總
| 算法名 | 英文名 | 代表人物 |
|---|---|---|
| 遺傳算法GA | Genetic Algorithm | J.H.Holand |
| 差分進(jìn)化算法DE | Differential evolution | Storn |
| 免疫算法IA | Immune algorithm | Burnet |
| 蟻群算法ACO | Ant Colony optimization | M.Dorigo,V.Maniezzo,A.Colorni |
| 粒子群算法PSO | Particle swarm optimization | James Kennedy,Rusell Eberhart |
| 模擬退火算法SA | Simulated annealing | Metropolis |
| 禁忌搜索算法TS | Tabu Search | Glover |
| 神經(jīng)網(wǎng)絡(luò)算法NN | Neural Newwork | McCulloch,Pitts,J.J.Hopfield |
算法特點(diǎn)匯總
| 算法名字 | 特點(diǎn) | 優(yōu)缺點(diǎn) |
|---|---|---|
| 遺傳算法 | 群體搜索策略和簡(jiǎn)單的遺傳算子 | 全局搜索能力強(qiáng),局部搜索能力較弱,早熟,算法收斂性無(wú)法保證 |
| 差分進(jìn)化算法 | ||
| 免疫算法 | ||
| 蟻群算法 | ||
| 粒子群算法 | 收斂速度快但容易陷入局部最優(yōu)解 | |
| 模擬退火算法 | ||
| 禁忌搜索算法 | ||
| 神經(jīng)網(wǎng)絡(luò)算法 |
遺傳算法GA
? 遺傳算法模擬生物在自然環(huán)境中的遺傳和進(jìn)化的過(guò)程,從而形成自適應(yīng)全局優(yōu)化搜索算法,它借用了生物遺傳學(xué)的觀點(diǎn),通過(guò)自然選擇,遺傳,變異等機(jī)制,實(shí)現(xiàn)各個(gè)個(gè)體適應(yīng)性的提高
名詞解釋
| 遺傳學(xué)術(shù)語(yǔ) | 遺傳算法術(shù)語(yǔ) |
|---|---|
| 群體 | 可行解集 |
| 個(gè)體 | 可行解 |
| 染色體 | 可行解的編碼 |
| 基因 | 可行解編碼的分量 |
| 基因形式 | 遺傳編碼 |
| 適應(yīng)度 | 評(píng)價(jià)函數(shù)值 |
| 選擇 | 選擇操作 |
| 交叉 | 交叉操作 |
| 變異 | 變異操作 |
關(guān)鍵參數(shù)
群體規(guī)模Np:群體規(guī)模將影響遺傳優(yōu)化的最終結(jié)果以及遺傳算法的執(zhí)行效率。一般取10~200。
交叉概率Pc:交叉概率控制著交叉操作被使用的頻度。一般取0.25~1.00。
變異概率Pm:變異的主要目的是保持群體的多樣性,一般地頻度的變異可防止群體中重要基因的丟失。一般取0.001~0.1。
遺傳運(yùn)算的終止進(jìn)化代數(shù)G:終止遺傳代數(shù)表示遺傳算法運(yùn)行到指定的進(jìn)化代數(shù)之后就停止運(yùn)行。一般取100~1000。
主要流程
選擇
輪盤(pán)賭選擇(Roulette Wheel Selection)
一種回放式隨機(jī)采樣方法。每個(gè)個(gè)體進(jìn)入下一代的概率等于它的適應(yīng)度值與整個(gè)種群中個(gè)體適應(yīng)度值和的比例
輪盤(pán)賭選擇法是最簡(jiǎn)單也是最常用的選擇方法,在該方法中,各個(gè)個(gè)體的選擇概率和其適應(yīng)度值成比例,適應(yīng)度越大,選中概率也越大。但實(shí)際在進(jìn)行輪盤(pán)賭選擇時(shí)個(gè)體的選擇往往不是依據(jù)個(gè)體的選擇概率,而是根據(jù)“累積概率”來(lái)進(jìn)行選擇。
例子:
假設(shè)群體 A:a, b, c, d, e
適應(yīng)度 F1:0.45, 0.1, 0.1, 0.15, 0.2
對(duì)F1進(jìn)行累加操作得到F2(累積概率):0.45, 0.55, 0.65, 0.8, 1.0
生成排序隨機(jī)隊(duì)列MS:0.2, 0.3, 0.4 , 0.7 ,0.8 ,0.9
選擇完成群體 B:a, a, a, d, e, e
合并新舊種群取最優(yōu)
該選擇策略,是在交配產(chǎn)生的新子代和父代中,通過(guò)合并子代和父代,并且按照個(gè)體的適應(yīng)度進(jìn)行排序,選擇適應(yīng)度最佳的前 NP 個(gè)個(gè)體作為新的種群,達(dá)到更好的收斂的效果。
例子:
父代個(gè)體parent : a,b,c
父代適應(yīng)度parent_obj : 1 , 5 , 3
子代個(gè)體son : d , e , f
子代適應(yīng)度son_obj : 2 6 4
合并個(gè)體total = a,b,c,d,e,f
合并適應(yīng)度total_obj : 1,5,3,2,6,4
適應(yīng)度排序order : e,b,f,c,d,a
前 NP=3個(gè)作為下一代:save = e,b,f
交叉
單點(diǎn)交叉
單點(diǎn)交叉通過(guò)選取兩條染色體,在隨機(jī)選擇的位置點(diǎn)上進(jìn)行分割并交換右側(cè)的部分,從而得到兩個(gè)不同的子染色體。
例子:
(空格處代表該處為隨機(jī)生成的交叉點(diǎn),往后的基因需要進(jìn)行交換操作)
待交叉染色體: 11111 22222
? 33333 44444
交換后染色體: 11111 44444
? 33333 22222
君主交叉
君主交叉就是在種群內(nèi)選擇出最優(yōu)個(gè)體,用最優(yōu)個(gè)體作為君主染色體,并隨機(jī)生成交叉位點(diǎn),然后將君主染色體的特定位點(diǎn)上的基因遺傳給子代染色體。
例子:
(中間空格分隔的基因代表隨機(jī)生成的交叉位點(diǎn),該位點(diǎn)上的基因需要遺傳給子代染色體)
待交叉染色體: 101000 1 101
? 011001 0 011
交換后染色體: 101000 1 101
? 011001 1 011
多點(diǎn)奇偶交叉
先規(guī)定一個(gè)交叉率,然后循環(huán)奇數(shù)位
每次生成一個(gè)隨機(jī)數(shù),判斷是否小于交叉率
如果是,則進(jìn)行交叉
對(duì)二進(jìn)制位上每一位取隨機(jī)數(shù),如果等于1,則與偶數(shù)位同位置的數(shù)進(jìn)行交換
如果不是,則跳過(guò)交叉
變異
通過(guò)變異率計(jì)算第i個(gè)個(gè)體的j個(gè)基因二進(jìn)制位上會(huì)發(fā)生變異,即取反
域內(nèi)隨機(jī)值
描述:
對(duì)新種群內(nèi)的所有染色體每個(gè)基因進(jìn)行變異操作,先通過(guò)隨機(jī)值和變異率去判斷該基因是否會(huì)發(fā)生變異,再通過(guò)隨機(jī)值在基因的取值范圍內(nèi)進(jìn)行改變。
例子:
在所有染色體中隨機(jī)挑選 NP * Pm 個(gè)染色體進(jìn)行變異
假設(shè)挑選出染色體h1:11000011
隨機(jī)挑選 L(染色體長(zhǎng)度,基因個(gè)數(shù)) * Pm 個(gè)基因進(jìn)行變異
挑選下標(biāo):1,2,4
h2:00101011(下標(biāo)1,2,4處基因取反)
代碼
奇偶交叉GA1
%%%%%%%%%%%%%%%%%%%%標(biāo)準(zhǔn)遺傳算法求函數(shù)極值%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%初始化參數(shù)%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有變量
close all; %清圖
clc; %清屏
NP=50; %種群數(shù)量
L=20; %二進(jìn)制數(shù)串長(zhǎng)度
Pc=0.8; %交叉率
Pm=0.1; %變異率
G=100; %最大遺傳代數(shù)
Xs=10; %上限
Xx=0; %下限
f=randi([0,1],NP,L);
%%%%%%%%%%%%%%%%%%%%%%%%%遺傳算法循環(huán)%%%%%%%%%%%%%%%%%%%%%%%%
for k=1:G
%%%%%%%%%%%%將二進(jìn)制解碼為定義域范圍內(nèi)十進(jìn)制%%%%%%%%%%%%%%
for i=1:NP
U=f(i,:);
m=0;
for j=1:L
m=U(j)*2^(j-1)+m;
end
x(i)=Xx+m*(Xs-Xx)/(2^L-1);
Fit(i)= func1(x(i));
end
maxFit = max(Fit); %最大值
minFit = min(Fit); %最小值
rr = find(Fit==maxFit);
fBest = f(rr(1,1),:); %歷代最優(yōu)個(gè)體
xBest = x(rr(1,1));
Fit = (Fit-minFit)/(maxFit-minFit); %歸一化適應(yīng)度值
%%%%%%%%%%%%%%%%%%基于輪盤(pán)賭的復(fù)制操作%%%%%%%%%%%%%%%%%%%
sum_Fit=sum(Fit); %逐列求和
fitvalue=Fit./sum_Fit; %每個(gè)元素計(jì)算適應(yīng)度百分比
fitvalue=cumsum(fitvalue); %逐列累加適應(yīng)度百分比,求得累積概率
ms=sort(rand(NP,1)); %生成排序隨機(jī)隊(duì)列
fiti=1;
newi=1;
while newi<=NP %選擇完成新群體,
if (ms(newi))<fitvalue(fiti) %當(dāng)隨機(jī)隊(duì)列概率小于當(dāng)前累積概率,則復(fù)制該個(gè)體為新群體上的新個(gè)體,新群體個(gè)體序號(hào)+1
nf(newi,:)=f(fiti,:);
newi=newi+1;
else %當(dāng)隨機(jī)隊(duì)列概率大于等于當(dāng)前累積概率,則累積概率數(shù)組序號(hào)+1
fiti=fiti+1;
end
end
%%%%%%%%%%%%%%%%%%%%%%基于概率的交叉操作%%%%%%%%%%%%%%%%%%
for i=1:2:NP %1,3,5...奇數(shù)位遍歷
p=rand;
if p<Pc %如果小于交叉率
q=randi([0,1],1,L); %生成1到L的數(shù)組,每位上隨機(jī)取0或1
for j=1:L
if q(j)==1; %若該位上是1,則與i+1上相同位上數(shù)進(jìn)行swap
temp=nf(i+1,j);
nf(i+1,j)=nf(i,j);
nf(i,j)=temp;
end
end
end
end
%%%%%%%%%%%%%%%%%%%基于概率的變異操作%%%%%%%%%%%%%%%%%%%%%%%
i=1;
while i<=round(NP*Pm) %迭代數(shù)=變異率x總數(shù)=變異染色體數(shù)量
h=randi([1,NP],1,1); %隨機(jī)選取一個(gè)需要變異的染色體
for j=1:round(L*Pm) %在一個(gè)染色體上隨機(jī)變異一定數(shù)量的基因
g=randi([1,L],1,1); %計(jì)算隨機(jī)需要變異的基因在第幾位
nf(h,g)=~nf(h,g); %將其取反=即是發(fā)生變異
end
i=i+1;
end
f=nf;
f(1,:)=fBest; %保留最優(yōu)個(gè)體在新種群中
trace(k)=maxFit; %歷代最優(yōu)適應(yīng)度
end
xBest; %最優(yōu)個(gè)體
君主交叉GA2
%%%%%%%%%%%%%%%%%%%%實(shí)值遺傳算法求函數(shù)極值%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有變量
close all; %清圖
clc; %清屏
D=10; %基因數(shù)目
NP=100; %染色體數(shù)目
Xs=20; %上限
Xx=-20; %下限
G=100; %最大遺傳代數(shù)
f=zeros(D,NP); %初始種群賦空間
nf=zeros(D,NP); %子種群賦空間
Pc=0.8; %交叉概率
Pm=0.1; %變異概率
f=rand(D,NP)*(Xs-Xx)+Xx; %隨機(jī)獲得初始種群
%%%%%%%%%%%%%%%%%%%%%%按適應(yīng)度升序排列%%%%%%%%%%%%%%%%%%%%%%%
for np=1:NP
FIT(np)=func2(f(:,np));
end
[SortFIT,Index]=sort(FIT);
Sortf=f(:,Index);
%%%%%%%%%%%%%%%%%%%%%%%遺傳算法循環(huán)%%%%%%%%%%%%%%%%%%%%%%%%%%
for gen=1:G
%%%%%%%%%%%%%%采用君主方案進(jìn)行選擇交叉操作%%%%%%%%%%%%%%%%
Emper=Sortf(:,1); %君主染色體
NoPoint=round(D*Pc); %每次交叉基因的個(gè)數(shù)=round(基因數(shù)x交叉率)
PoPoint=randi([1 D],NoPoint,NP/2); %交叉基因的位置,NoPoint x NP/2的隨機(jī)矩陣
nf=Sortf;
for i=1:NP/2
nf(:,2*i-1)=Emper; %奇數(shù)位=君主
nf(:,2*i)=Sortf(:,2*i); %偶數(shù)位=原基因
for k=1:NoPoint
nf(PoPoint(k,i),2*i-1)=nf(PoPoint(k,i),2*i);
nf(PoPoint(k,i),2*i)=Emper(PoPoint(k,i));
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%變異操作%%%%%%%%%%%%%%%%%%%%%%%%%
for m=1:NP
for n=1:D
r=rand(1,1); %隨機(jī)生成1個(gè)數(shù)在(0,1]之間
if r<Pm %若隨機(jī)概率小于變異率則發(fā)生變異
nf(n,m)=rand(1,1)*(Xs-Xx)+Xx; %即用概率乘以區(qū)間差+下限重新生成新的值
end
end
end
%%%%%%%%%%%%%%%%%%%%%子種群按適應(yīng)度升序排列%%%%%%%%%%%%%%%%%%
for np=1:NP
NFIT(np)=func2(nf(:,np)); %計(jì)算子種群適應(yīng)度
end
[NSortFIT,Index]=sort(NFIT); %子種群排序
NSortf=nf(:,Index); %子種群
%%%%%%%%%%%%%%%%%%%%%%%%%產(chǎn)生新種群%%%%%%%%%%%%%%%%%%%%%%%%%%
f1=[Sortf,NSortf]; %子代和父代合并
FIT1=[SortFIT,NSortFIT]; %子代和父代的適應(yīng)度值合并
[SortFIT1,Index]=sort(FIT1); %適應(yīng)度按升序排列
Sortf1=f1(:,Index); %按適應(yīng)度排列個(gè)體
SortFIT=SortFIT1(1:NP); %取前NP個(gè)適應(yīng)度值
Sortf=Sortf1(:,1:NP); %取前NP個(gè)個(gè)體
trace(gen)=SortFIT(1); %歷代最優(yōu)適應(yīng)度值
end
Bestf=Sortf(:,1); %最優(yōu)個(gè)體
trace(end) %最優(yōu)值
GA算法求解旅行商問(wèn)題
%%%%%%%%%%%%%%%%%%%%%%%%%遺傳算法解決TSP問(wèn)題%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有變量
close all; %清圖
clc; %清屏
C=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;...
3238 1229;4196 1044;4312 790;4386 570;3007 1970;2562 1756;...
2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;...
3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;...
3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;...
2370 2975]; %31個(gè)省會(huì)城市坐標(biāo)
N=size(C,1); %TSP問(wèn)題的規(guī)模,即城市數(shù)目,也就是基因數(shù)
D=zeros(N); %任意兩個(gè)城市距離間隔矩陣
%%%%%%%%%%%%%%%%%%%%%求任意兩個(gè)城市距離間隔矩陣%%%%%%%%%%%%%%%%%%%%%
for i=1:N
for j=1:N
D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5;%計(jì)算距離
end
end
NP=200; %種群規(guī)模
G=1000; %最大遺傳代數(shù)
f=zeros(NP,N); %用于存儲(chǔ)種群
F=[]; %種群更新中間存儲(chǔ)
for i=1:NP
f(i,:)=randperm(N); %隨機(jī)生成初始種群
end
R=f(1,:); %存儲(chǔ)最優(yōu)種群
len=zeros(NP,1); %存儲(chǔ)路徑長(zhǎng)度
fitness=zeros(NP,1); %存儲(chǔ)歸一化適應(yīng)值
gen=0;
%%%%%%%%%%%%%%%%%%%%%%%%%遺傳算法循環(huán)%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
while gen<G
%%%%%%%%%%%%%%%%%%%%%計(jì)算路徑長(zhǎng)度%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:NP
len(i,1)=D(f(i,N),f(i,1)); %終點(diǎn)到起點(diǎn)的距離
for j=1:(N-1)
len(i,1)=len(i,1)+D(f(i,j),f(i,j+1)); %路徑長(zhǎng)度累加
end
end
maxlen=max(len); %最長(zhǎng)路徑
minlen=min(len); %最短路徑
%%%%%%%%%%%%%%%%%%%%%%%%%更新最短路徑%%%%%%%%%%%%%%%%%%%%%%%%%%
rr=find(len==minlen); %最短路徑位置數(shù)組
R=f(rr(1,1),:); %最短路徑
%%%%%%%%%%%%%%%%%%%%%計(jì)算歸一化適應(yīng)值%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:length(len)
fitness(i,1)=(1-((len(i,1)-minlen)/(maxlen-minlen+0.001)));
end
%%%%%%%%%%%%%%%%%%%%%%%%%%選擇操作%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
nn=0;
for i=1:NP
if fitness(i,1)>=rand %適應(yīng)度越高越有機(jī)會(huì)被選中
nn=nn+1; %被選中個(gè)體數(shù)加1
F(nn,:)=f(i,:); %用F記錄被選中的個(gè)體
end
end
[aa,bb]=size(F);
while aa<NP
nnper=randperm(nn); %對(duì)選擇的群體里隨機(jī)挑2個(gè)個(gè)體
A=F(nnper(1),:); %隨機(jī)序列第一位對(duì)應(yīng)的個(gè)體
B=F(nnper(2),:); %隨機(jī)序列第二位對(duì)應(yīng)的個(gè)體
%%%%%%%%%%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%%%%%%%%%%%%%%
W=ceil(N/10); %交叉點(diǎn)個(gè)數(shù)31/10 = 4個(gè)
p=unidrnd(N-W+1); %隨機(jī)選擇交叉范圍,從p到p+W
for i=1:W %4個(gè)交叉點(diǎn)
%先保存交叉點(diǎn)所在值在對(duì)方的位置,然后交換交叉點(diǎn)值,再交換失去的值在對(duì)方的位置,即保證31個(gè)城市不會(huì)因?yàn)榻徊鎸?dǎo)致沒(méi)走完
x=find(A==B(p+i-1)); %B中交叉點(diǎn)所在值在A的位置
y=find(B==A(p+i-1));
temp=A(p+i-1);
A(p+i-1)=B(p+i-1);
B(p+i-1)=temp;
temp=A(x);
A(x)=B(y);
B(y)=temp;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%變異操作%%%%%%%%%%%%%%%%%%%%%%%%%
p1=floor(1+N*rand());
p2=floor(1+N*rand());
while p1==p2 %生成兩個(gè)不同城市位置序號(hào)
p1=floor(1+N*rand());
p2=floor(1+N*rand());
end
tmp=A(p1); %在A與B中進(jìn)行該位置上城市的交換,即發(fā)生變異
A(p1)=A(p2);
A(p2)=tmp;
tmp=B(p1);
B(p1)=B(p2);
B(p2)=tmp;
F=[F;A;B]; %合并取出來(lái)并經(jīng)過(guò)交叉,變異的個(gè)體到原選擇數(shù)組上
[aa,bb]=size(F);
end
if aa>NP
F=F(1:NP,:); %保持種群規(guī)模為NP
end
f=F; %更新種群
f(1,:)=R; %保留每代最優(yōu)個(gè)體
clear F;
gen=gen+1
Rlength(gen)=minlen;
end
figure
for i=1:N-1
plot([C(R(i),1),C(R(i+1),1)],[C(R(i),2),C(R(i+1),2)],'bo-');
hold on;
end
plot([C(R(N),1),C(R(1),1)],[C(R(N),2),C(R(1),2)],'ro-');
title(['優(yōu)化最短距離:',num2str(minlen)]);
figure
plot(Rlength)
xlabel('迭代次數(shù)')
ylabel('目標(biāo)函數(shù)值')
title('適應(yīng)度進(jìn)化曲線')
差分進(jìn)化算法DE
差分演化算法是一種基于群體差異的啟發(fā)式隨機(jī)搜索算法,將問(wèn)題的求解表示成"染色體"的適者生存過(guò)程,通過(guò)"染色體"群的一代代不斷進(jìn)化,包括復(fù)制、交叉和變異等操作,最終收斂到"最適應(yīng)環(huán)境"的個(gè)體,從而求得問(wèn)題的最優(yōu)解或滿意解。
關(guān)鍵參數(shù)
? 種群數(shù)量Np:一般來(lái)說(shuō),種群數(shù)量越大,種群的多樣性也就越大,尋優(yōu)能力也就越強(qiáng),但也會(huì)增加計(jì)算的難度。為了算法具有足夠的不同的變異向量,Np >= 4。一般取5D~10D。(D為變量維數(shù))
? 變異算子F:變異算子 F∈[0, 2] 決定偏差向量的縮放比例。F過(guò)小,可能造成算法“早熟”,容易陷入局部最優(yōu);F過(guò)大,算法很難快速收斂到最優(yōu)值。F = 0.5通常是一個(gè)較好的初始選擇。如果種群過(guò)早收斂,那么 F 或 Np 應(yīng)該增大。
? 交叉算子CR:交叉算子 CR∈[0, 1]控制著一個(gè)試驗(yàn)向量參數(shù)來(lái)自隨機(jī)選擇的變異向量而不是原來(lái)的向量的概率。CR越大,發(fā)生交叉的概率越大。CR的一個(gè)較好選擇是 0.1,但較大的 CR通常會(huì)加速收斂。為了嘗試獲得一個(gè)快速解,可以先嘗試 CR = 0.9 或 CR = 0.1。
主要流程
變異操作
DE/rand/1/bin
描述:
對(duì)需要變異的染色體 m,通過(guò)隨機(jī)值選擇 3 條互不相同且與染色體 m 也不相同的其他染色體 r1, r2, r3
利用變異算子對(duì) r2, r3 的差異進(jìn)行縮小,
r2, r3與 r1 進(jìn)行合并后替換到原染色體 m 上,完成變異過(guò)程。
DE/rand/1/bin + 自適應(yīng)變異
描述:
在 DE/rand/1/bin 的基礎(chǔ)上,針對(duì)變異算子進(jìn)行自適應(yīng)計(jì)算。此自適應(yīng)計(jì)算的方法可以基于變異代數(shù),對(duì)于變異代數(shù)越高的變異操作,可以考慮減小變異算子,從而做到更好的收斂效果。
自適應(yīng)算子計(jì)算
將變異算子中隨機(jī)選擇的三個(gè)個(gè)體Xb,Xm,Xw進(jìn)行計(jì)算得變異種群數(shù)組
交叉
DE 交叉
描述:
同時(shí)采用隨機(jī)選擇和概率遺傳兩種方法,隨機(jī)選擇通過(guò)隨機(jī)選擇一位基因進(jìn)行變異替換,概率遺傳通過(guò)概率值決定是否采用變異后的基因進(jìn)行交叉。這樣可以確保子代至少有一個(gè)基因來(lái)自變異。
二項(xiàng)式交叉
選擇
貪婪準(zhǔn)則:對(duì)原種群和變異后種群每個(gè)個(gè)體一對(duì)一進(jìn)行判斷,取適應(yīng)度更高的作為下一代種群
代碼
DE/rand/1/bin + 自適應(yīng)變異
%%%%%%%%%%%%%%%%%差分進(jìn)化算法求函數(shù)極值%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有變量
close all; %清圖
clc; %清屏
NP=50; %個(gè)體數(shù)目
D=10; %變量的維數(shù)
G=200; %最大進(jìn)化代數(shù)
F0=0.4; %初始變異算子
CR=0.1; %交叉算子
Xs=20; %上限
Xx=-20; %下限
yz=10^-6; %閾值
MAXRUN = 10; %獨(dú)立測(cè)試次數(shù)
%%%%%%%%%%%%%%%%%%%%%%%%%賦初值%%%%%%%%%%%%%%%%%%%%%%%%
x=zeros(D,NP); %初始種群
v=zeros(D,NP); %變異種群
u=zeros(D,NP); %選擇種群
for run = 1:MAXRUN
%%%%%%%%%%%%%%%%一次獨(dú)立測(cè)試%%%%%%%%%%%%%%
x=rand(D,NP)*(Xs-Xx)+Xx; %賦初值
%%%%%%%%%%%%%%%%%%%%計(jì)算目標(biāo)函數(shù)%%%%%%%%%%%%%%%%%%%%
for m=1:NP
Ob(m)=func1(x(:,m)); %計(jì)算初始種群每位上的目標(biāo)函數(shù)值
end
trace(1)=min(Ob); %獲取最優(yōu)值
%%%%%%%%%%%%%%%%%%%%%%%差分進(jìn)化循環(huán)%%%%%%%%%%%%%%%%%%%%%
for gen=1:G
%%%%%%%%%%%%%%%%%%%%%%變異操作%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%自適應(yīng)變異算子%%%%%%%%%%%%%%%%%%%
lamda=exp(1-G/(G+1-gen));
F=F0*2^(lamda); %自適應(yīng)變異算子公式
%%%%%%%%%%%%%%%%%r1,r2,r3和m互不相同%%%%%%%%%%%%%%%%
for m=1:NP
r1=randi([1,NP],1,1);
while (r1==m) %防止r1==m
r1=randi([1,NP],1,1);
end
r2=randi([1,NP],1,1);
while (r2==m)|(r2==r1) %防止r2==r1,r2==m
r2=randi([1,NP],1,1);
end
r3=randi([1,NP],1,1);
while (r3==m)|(r3==r1)|(r3==r2) %防止r3==r1,r3==r2,r3==m
r3=randi([1,NP],1,1);
end
v(:,m)=x(:,r1)+F*(x(:,r2)-x(:,r3)); %變異向量公式3.3,通過(guò)對(duì)r1,r2,r3列操作后放入變異種群數(shù)組的第m列
end
%%%%%%%%%%%%%%%%%%%%%%交叉操作%%%%%%%%%%%%%%%%%%%%%%%
r=randi([1,D],1,1); %整個(gè)交叉操作的隨機(jī)值,確保交叉操作肯定會(huì)選擇變異種群其中一個(gè)作為新種群,隨機(jī)選擇法
for n=1:D
cr=rand(1); %每個(gè)變量上的隨機(jī)值,概率遺傳法
if (cr<=CR)|(n==r) %u為新選擇種群,v為變異種群,x為初始種群
%如果每個(gè)變量上的隨機(jī)值小于變異算子,或n==整個(gè)操作的隨機(jī)值,則進(jìn)行交叉,即用當(dāng)前序號(hào)變異種群作為選擇種群
u(n,:)=v(n,:);
else %否則,則不進(jìn)行交叉,即用當(dāng)前序號(hào)初始種群作為選擇種群
u(n,:)=x(n,:);
end
end
%%%%%%%%%%%%%%%%%%%邊界條件的處理%%%%%%%%%%%%%%%%%%%%%
for n=1:D
for m=1:NP
if (u(n,m)<Xx)|(u(n,m)>Xs) %超過(guò)邊界的重新生成值
u(n,m)=rand*(Xs-Xx)+Xx;
end
end
end
%%%%%%%%%%%%%%%%%%%%%%選擇操作%%%%%%%%%%%%%%%%%%%%%%%
for m=1:NP
Ob1(m)=func1(u(:,m)); %重新計(jì)算新選擇種群每位上的目標(biāo)函數(shù)值
end
for m=1:NP
if Ob1(m)<Ob(m) %若小于之前的初始種群的該位上的目標(biāo)函數(shù)值(更優(yōu)),初始種群上該位被選擇種群替換
x(:,m)=u(:,m); %即是適者生存
end
end
for m=1:NP
Ob(m)=func1(x(:,m)); %重新計(jì)算現(xiàn)在的初始種群每位上的目標(biāo)函數(shù)值
end
trace(gen+1)=min(Ob); %取最優(yōu)值放入軌跡
if min(Ob(m))<yz %如果最優(yōu)值小于閾值,則跳出
break
end
end
[SortOb,Index]=sort(Ob);
x=x(:,Index);
X=x(:,1); %最優(yōu)變量
Y=min(Ob) %最優(yōu)值
end
%%%%%%%%%%%%%%%%%%%%%%%%%畫(huà)圖%%%%%%%%%%%%%%%%%%%%%%%%%%
figure
plot(trace);
xlabel('迭代次數(shù)')
ylabel('目標(biāo)函數(shù)值')
title('適應(yīng)度進(jìn)化曲線')
免疫算法IA
免疫算法是模仿生物免疫機(jī)制,結(jié)合基因的進(jìn)化機(jī)理,人工構(gòu)造出的一種新型智能優(yōu)化算法。采用群體搜索策略,通過(guò)迭代計(jì)算,最終以較大的概率得到問(wèn)題的最優(yōu)解。相比于其他算法,免疫算法利用自身產(chǎn)生多樣性和維持機(jī)制的特點(diǎn),保證了群體多樣性,克服了‘早熟’問(wèn)題,可以得到全局最優(yōu)解。具有自適應(yīng)性,隨機(jī)性并行性,全局收斂性,種群多樣性等特點(diǎn)。
| 生物免疫系統(tǒng) | 免疫算法 |
|---|---|
| 抗原 | 優(yōu)化問(wèn)題 |
| 抗體(B細(xì)胞) | 優(yōu)化問(wèn)題的可行解 |
| 親和度 | 可行解的質(zhì)量 |
| 細(xì)胞活化 | 免疫選擇 |
| 細(xì)胞分化 | 個(gè)體克隆 |
| 親和度成熟 | 變異 |
| 克隆抑制 | 克隆抑制 |
| 動(dòng)態(tài)維持平衡 | 種群刷新 |
關(guān)鍵參數(shù)
抗體種群大小Np:保留了免疫細(xì)胞的多樣性,種群越大,算法全局搜索能力越好,但算法每代的計(jì)算量也就相應(yīng)增大。一般取10~100,且200以內(nèi)。
免疫選擇比例:免疫選擇的抗體數(shù)量越多,產(chǎn)生抗體越多,搜索能力越強(qiáng),但增加每代計(jì)算量。一般取0.1Np
0.5Np
抗體克隆擴(kuò)增的倍數(shù):決定了克隆擴(kuò)增的細(xì)胞的數(shù)量,從而決定算法的搜索能力。數(shù)值越大,局部搜索能力越強(qiáng),全局搜索能力也有一定提高,但是計(jì)算量增大。一般取5~10。
種群刷新比例:細(xì)胞的淘汰和更新是產(chǎn)生抗體多樣性的重要機(jī)制,從而對(duì)免疫算法的全局搜索能力產(chǎn)生重要影響。一般不超過(guò)0.5Np。
算子
親和度評(píng)價(jià)算子:相當(dāng)于遺傳算法中的適應(yīng)度,與具體問(wèn)題相關(guān)
抗體濃度評(píng)價(jià)算子:表征抗體種群的多樣性好壞,濃度過(guò)高意味非常類似個(gè)體大量存在;不利于全局優(yōu)化
激勵(lì)度算子:對(duì)抗體質(zhì)量的最終評(píng)價(jià)結(jié)果,通常親和度大,濃度低的抗體會(huì)得到較大激勵(lì)度
克隆抑制算子:用于對(duì)經(jīng)過(guò)變異后的克隆體進(jìn)行再選擇,抑制親和度低的抗體(重新生成隨機(jī)新生種群-種群刷新),保留親和度高的抗體作為免疫種群,最后免疫種群與新生種群進(jìn)行進(jìn)行合并
主要流程
免疫選擇
前 NP / 2 個(gè)激勵(lì)度高的個(gè)體指針對(duì) NP/2 個(gè)激勵(lì)度高的個(gè)體進(jìn)行交叉和變異,目的是試圖產(chǎn)生激勵(lì)度更高的個(gè)體。隨機(jī)生成指針對(duì)另一半的個(gè)體產(chǎn)生采用隨機(jī)生成的方式,保證了種群中不斷有新個(gè)體的加入。
抗體間親和度計(jì)算
對(duì)于實(shí)數(shù)編碼,親和度通常可以使用抗體向量間的歐氏距離來(lái)計(jì)算
抗體濃度計(jì)算
抗體濃度公式
其中N為種群規(guī)模,S(abi, abj)表示抗體間的相似度,具體表示如下
相似度檢查
若小于相似度閾值,則設(shè)為1
激勵(lì)度計(jì)算
激勵(lì)度算子就是抗體的綜合評(píng)價(jià),計(jì)算方式如下,二者取其一,其本質(zhì)目的是為了共同考慮親和度和濃度,從而篩選下一代的抗體
變異操作
變異源鄰域
描述:
在需要變異的個(gè)體染色體中,通過(guò)添加一個(gè)擾動(dòng),從而使其偏離原來(lái)的位置落入原個(gè)體相鄰的另外一個(gè)位置中,從而實(shí)現(xiàn)變異源領(lǐng)域的搜索。
實(shí)數(shù)編碼算法變異計(jì)算
交叉操作
克隆抑制
描述:
對(duì)于克隆產(chǎn)生的所有個(gè)體進(jìn)行親和度的計(jì)算,然后保留親和度最高的個(gè)體,從而實(shí)現(xiàn)交叉操作。
例子:
原個(gè)體親和度為 10
克隆后新個(gè)體親和度分別為 [12,6,34,43,2,15,3,8,19,22]
將10個(gè)新個(gè)體和原個(gè)體合并后取親和度最高的個(gè)體,即親和度為 43 的個(gè)體
代碼
%%%%%%%%%%%%%%%%%免疫算法求函數(shù)極值%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有變量
close all; %清圖
clc; %清屏
D=10; %免疫個(gè)體維數(shù)
NP=100; %免疫個(gè)體數(shù)目
Xs=20; %取值上限
Xx=-20; %取值下限
G=500; %最大免疫代數(shù)
pm=0.7; %變異概率
alfa=1; %激勵(lì)度系數(shù)
belta=1; %激勵(lì)度系數(shù)
detas=0.2; %相似度閾值
gen=0; %免疫代數(shù)
Ncl=10; %克隆個(gè)數(shù)
deta0=1*Xs; %鄰域范圍初值
%%%%%%%%%%%%%%%%%%%%%%%初始種群%%%%%%%%%%%%%%%%%%%%%%%%
f=rand(D,NP)*(Xs-Xx)+Xx; %隨機(jī)生成初始值數(shù)組10行100列
for np=1:NP
FIT(np)=func1(f(:,np));
end
%%%%%%%%%%%%%%%%%計(jì)算個(gè)體濃度和激勵(lì)度%%%%%%%%%%%%%%%%%%%
for np=1:NP
for j=1:NP
nd(j)=sqrt(sum((f(:,np)-f(:,j)).^2));%基于歐式距離的抗體間親和度計(jì)算
%nd一開(kāi)始存儲(chǔ)抗體間親和度,后來(lái)計(jì)算出抗體間相似度,從而取平均值獲得抗體濃度,最后通過(guò)
if nd(j)<detas %如果小于相似度閾值,則說(shuō)明相似,設(shè)為1
nd(j)=1;
else
nd(j)=0; %如果大于等于相似度閾值,則說(shuō)明不相似,設(shè)為0
end
end
ND(np)=sum(nd)/NP; %取平均值得抗體濃度
end
FIT = alfa*FIT- belta*ND; %4.6 抗體abi激勵(lì)度=激勵(lì)度系數(shù)ax初始激勵(lì)度-激勵(lì)度系數(shù)bx抗體濃度
%%%%%%%%%%%%%%%%%%%激勵(lì)度按升序排列%%%%%%%%%%%%%%%%%%%%%%
[SortFIT,Index]=sort(FIT);
Sortf=f(:,Index);
%%%%%%%%%%%%%%%%%%%%%%%%免疫循環(huán)%%%%%%%%%%%%%%%%%%%%%%%%
while gen<G
for i=1:NP/2
%%%%%%%%選激勵(lì)度前NP/2個(gè)體進(jìn)行免疫操作%%%%%%%%%%%
a=Sortf(:,i); %取第i列
Na=repmat(a,1,Ncl); %生成重復(fù)第i列的1xNcl的矩陣
deta=deta0/gen; %鄰域范圍初值/當(dāng)前循環(huán)代數(shù)=擾動(dòng)因子,代數(shù)越大,擾動(dòng)越低,減小誤差
for j=1:Ncl %迭代克隆個(gè)體數(shù)
for ii=1:D
%%%%%%%%%%%%%%%%%變異%%%%%%%%%%%%%%%%%%%
if rand<pm %如果小于變異率,則發(fā)生變異
Na(ii,j)=Na(ii,j)+(rand-0.5)*deta; %變異算子
end
%%%%%%%%%%%%%%邊界條件處理%%%%%%%%%%%%%%%
if (Na(ii,j)>Xs) | (Na(ii,j)<Xx)
Na(ii,j)=rand * (Xs-Xx)+Xx; %如果超出邊界則重新生成
end
end
end
Na(:,1)=Sortf(:,i); %保留克隆源個(gè)體
%%%%%%%%%%克隆抑制,保留親和度最高的個(gè)體%%%%%%%%%%
for j=1:Ncl
NaFIT(j)=func1(Na(:,j)); %親和度計(jì)算,得數(shù)組
end
[NaSortFIT,Index]=sort(NaFIT); %親和度排序
aFIT(i)=NaSortFIT(1); %取函數(shù)最小值,即親和度最高值
NaSortf=Na(:,Index);
af(:,i)=NaSortf(:,1); %親和度最高的個(gè)體
end
%%%%%%%%%%%%%%%%%%%%免疫種群激勵(lì)度%%%%%%%%%%%%%%%%%%%
for np=1:NP/2
for j=1:NP/2
nda(j)=sqrt(sum((af(:,np)-af(:,j)).^2));
if nda(j)<detas
nda(j)=1;
else
nda(j)=0;
end
end
aND(np)=sum(nda)/NP/2;
end
aFIT = alfa*aFIT- belta*aND;
%%%%%%%%%%%%%%%%%%%%%%%種群刷新%%%%%%%%%%%%%%%%%%%%%%%
bf=rand(D,NP/2)*(Xs-Xx)+Xx; %生成D行NP/2列在取值范圍內(nèi)的新種群
for np=1:NP/2
bFIT(np)=func1(bf(:,np)); %計(jì)算新種群函數(shù)評(píng)價(jià)
end
%%%%%%%%%%%%%%%%%%%新生成種群激勵(lì)度%%%%%%%%%%%%%%%%%%%%
for np=1:NP/2
for j=1:NP/2
ndc(j)=sqrt(sum((bf(:,np)-bf(:,j)).^2));
if ndc(j)<detas
ndc(j)=1;
else
ndc(j)=0;
end
end
bND(np)=sum(ndc)/NP/2;
end
bFIT = alfa*bFIT- belta*bND;
%%%%%%%%%%%%%%免疫種群與新生種群合并%%%%%%%%%%%%%%%%%%%
f1=[af,bf]; %新舊種群合并
FIT1=[aFIT,bFIT]; %新舊種群激勵(lì)度數(shù)組合并
[SortFIT,Index]=sort(FIT1); %新舊種群激勵(lì)度合并數(shù)組排序
Sortf=f1(:,Index); %取激勵(lì)度最高的一列,即這一代最優(yōu)解
gen=gen+1; %免疫代數(shù)+1
trace(gen)=func1(Sortf(:,1)); %加入最優(yōu)解軌跡數(shù)組
end
%%%%%%%%%%%%%%%%%%%%%%%輸出優(yōu)化結(jié)果%%%%%%%%%%%%%%%%%%%%%%%%
Bestf=Sortf(:,1); %最優(yōu)變量
trace(end); %最優(yōu)值
figure,plot(trace)
xlabel('迭代次數(shù)')
ylabel('目標(biāo)函數(shù)值')
title('親和度進(jìn)化曲線')
蟻群算法ACO
蟻群算法是一種仿生學(xué)算法,是由自然界中螞蟻覓食的行為而啟發(fā)的。
在自然界中,螞蟻覓食過(guò)程中,蟻群總能夠按照尋找到一條從蟻巢和食物源的最優(yōu)路徑。螞蟻在尋找食物的過(guò)程中往往是隨機(jī)選擇路徑的,但它們能感知當(dāng)前地面上的信息素濃度, 并傾向于往信息素濃度高的方向行進(jìn)。信息素由螞蟻?zhàn)陨磲尫牛菍?shí)現(xiàn)蟻群內(nèi)間接通信的物質(zhì)。
由于較短路徑上螞蟻的往返時(shí)間比較短,單位時(shí)間內(nèi)經(jīng)過(guò)該路徑的螞蟻多,所以信息素的積累速度比較長(zhǎng)路徑快。因此,當(dāng)后續(xù)螞蟻在路口時(shí),就能感知先前螞蟻留下的信息,并 傾向于選擇一條較短的路徑前行。
這種正反饋機(jī)制使得越來(lái)越多的螞蟻在巢穴與食物之間的 最短路徑上行進(jìn)。由于其他路徑上的信息素會(huì)隨著時(shí)間蒸發(fā),最終所有的螞蟻都在最優(yōu)路徑上行進(jìn)。
構(gòu)建解
狀態(tài)轉(zhuǎn)移概率
啟發(fā)式信息
啟發(fā)因子:城市間距離的倒數(shù)
信息素
信息素
蒸發(fā)
增量
最優(yōu)解
走過(guò)部分解
關(guān)鍵參數(shù)
信息素啟發(fā)式因子α:代表信息量對(duì)是否選擇當(dāng)前路徑的影響程度,反應(yīng)螞蟻在運(yùn)動(dòng)過(guò)程中所積累的信息素在知道蟻群搜索中的相對(duì)重要程度。一般取α ∈[1, 4]。
期望啟發(fā)因子β:表示在搜索時(shí)路徑上的信息素在指導(dǎo)螞蟻選擇路徑時(shí)的向?qū)裕从诚伻涸谒阉髯顑?yōu)路徑的過(guò)程中的先驗(yàn)性和確定性因素的作用強(qiáng)度。一般取β ∈[3, 5]。β越大,螞蟻在某個(gè)局部點(diǎn)上選擇局部最短路徑可能性越大,算法收斂速度越快,但隨機(jī)性越弱,容易陷入局部最優(yōu)解
信息蒸發(fā)系數(shù)p:p ∈[0,1],表示信息素的蒸發(fā)程度,反映了螞蟻群體中個(gè)體之間相互影響的強(qiáng)弱。p過(guò)小時(shí),影響算法的隨機(jī)性能和全局搜索能力;p過(guò)大是,降低算法的收斂速度。
信息素強(qiáng)度Q:代表計(jì)算信息素增量的一個(gè)取值
螞蟻數(shù)目m:螞蟻數(shù)量增多,提高算法的全局搜索能力和穩(wěn)定性,但正反饋?zhàn)饔貌幻黠@,收斂速度減慢;螞蟻數(shù)量減少,收斂速度加快,但算法全局性能降低,穩(wěn)定性差,容易出現(xiàn)過(guò)早停滯現(xiàn)象。一般取10~50。
主要流程
選擇
采用的是輪盤(pán)賭的方式,其概率的計(jì)算是基于信息素和距離權(quán)重的,公式如下( 為信息素, 為距離權(quán)重)
信息素更新
信息素增量計(jì)算公式,其中 Q 信息素強(qiáng)度系數(shù), 為第 k 只螞蟻在本輪周游中所走過(guò)的路徑的長(zhǎng)度
信息素蒸發(fā)量計(jì)算公式,其中  表示路徑上信息素的蒸發(fā)系數(shù),表示信息素的持久性系數(shù)
代碼
蟻群算法解決旅行商問(wèn)題
%%%%%%%%%%%%%%%%%%%%蟻群算法解決TSP問(wèn)題%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有變量
close all; %清圖
clc; %清屏
m=50; %螞蟻個(gè)數(shù)
Alpha=1; %信息素重要程度參數(shù)
Beta=5; %啟發(fā)式因子重要程度參數(shù)
Rho=0.1; %信息素蒸發(fā)系數(shù)
G_max=200; %最大迭代次數(shù)
Q=100; %信息素增加強(qiáng)度系數(shù)
C=[1304 2312;3639 1315;4177 2244;3712 1399;3488 1535;3326 1556;...
3238 1229;4196 1044;4312 790;4386 570;3007 1970;2562 1756;...
2788 1491;2381 1676;1332 695;3715 1678;3918 2179;4061 2370;...
3780 2212;3676 2578;4029 2838;4263 2931;3429 1908;3507 2376;...
3394 2643;3439 3201;2935 3240;3140 3550;2545 2357;2778 2826;...
2370 2975]; %31個(gè)省會(huì)城市坐標(biāo)
%%%%%%%%%%%%%%%%%%%%%%%%第一步:變量初始化%%%%%%%%%%%%%%%%%%%%%%%%
n=size(C,1); %n表示問(wèn)題的規(guī)模(城市個(gè)數(shù))
D=zeros(n,n); %D表示兩個(gè)城市距離間隔矩陣
for i=1:n
for j=1:n
if i~=j %如果不是同一個(gè)城市
D(i,j)=((C(i,1)-C(j,1))^2+(C(i,2)-C(j,2))^2)^0.5; %計(jì)算兩個(gè)城市距離
else
D(i,j)=eps; %設(shè)為一個(gè)數(shù)可以分辨的最小精度
end
D(j,i)=D(i,j); %更新兩個(gè)城市距離
end
end
Eta=1./D; %Eta為啟發(fā)因子,這里設(shè)為距離的倒數(shù)
Tau=ones(n,n); %Tau為信息素矩陣
Tabu=zeros(m,n); %存儲(chǔ)并記錄路徑的生成
NC=1; %迭代計(jì)數(shù)器
R_best=zeros(G_max,n); %各代最佳路線
L_best=inf.*ones(G_max,1); %各代最佳路線的長(zhǎng)度
figure(1);%優(yōu)化解
while NC<=G_max
%%%%%%%%%%%%%%%%%%第二步:將m只螞蟻放到n個(gè)城市上%%%%%%%%%%%%%%%%
Randpos=[];
for i=1:(ceil(m/n)) %求得每個(gè)城市放m/n只螞蟻,總共需要幾次迭代
Randpos=[Randpos,randperm(n)]; %每次迭代取n只螞蟻隨機(jī)去往n個(gè)城市
end
Tabu(:,1)=(Randpos(1,1:m))'; %最后取存儲(chǔ)m只螞蟻去往的城市序號(hào)的數(shù)組
%%%%%第三步:m只螞蟻按概率函數(shù)選擇下一座城市,完成各自的周游%%%%%%
for j=2:n
for i=1:m
visited=Tabu(i,1:(j-1)); %已訪問(wèn)的城市數(shù)組
J=zeros(1,(n-j+1)); %待訪問(wèn)的城市數(shù)組,未初始化,全為0
P=J; %待訪問(wèn)城市的選擇概率分布
Jc=1; %待訪問(wèn)的城市數(shù)組的遍歷變量
for k=1:n
if length(find(visited==k))==0 %find查找已訪問(wèn)城市為k的,生成序號(hào)數(shù)組,并計(jì)算有幾個(gè)(length)
J(Jc)=k; %若為0,則待訪問(wèn),將城市序號(hào)用來(lái)初始化待訪問(wèn)的城市數(shù)組
Jc=Jc+1; %遍歷變量++
end
end
%%%%%%%%%%%%%%%%%%計(jì)算待選城市的概率分布%%%%%%%%%%%%%%%%
for k=1:length(J)
P(k)=(Tau(visited(end),J(k))^Alpha)...
*(Eta(visited(end),J(k))^Beta);
end
P=P/(sum(P)); %狀態(tài)轉(zhuǎn)移概率公式計(jì)算5.1
%%%%%%%%%%%%%%%%按概率原則選取下一個(gè)城市%%%%%%%%%%%%%%%%
Pcum=cumsum(P); %輪盤(pán)賭概率累加
Select=find(Pcum>=rand); %隨機(jī)生成一個(gè)概率,查找概率累加數(shù)組里大于等于該隨機(jī)概率的數(shù),生成數(shù)組Select
to_visit=J(Select(1)); %取Select數(shù)組第一個(gè)數(shù)作為下一個(gè)城市
Tabu(i,j)=to_visit;
end
end
if NC>=2
Tabu(1,:)=R_best(NC-1,:);
end
%%%%%%%%%%%%%%%%%%%第四步:記錄本次迭代最佳路線%%%%%%%%%%%%%%%%%%
L=zeros(m,1);
for i=1:m
R=Tabu(i,:); %第i行路線放入R
for j=1:(n-1)
L(i)=L(i)+D(R(j),R(j+1)); %遍歷n個(gè)城市計(jì)算第i行路線長(zhǎng)度
end
L(i)=L(i)+D(R(1),R(n)); %最后補(bǔ)上終點(diǎn)到起點(diǎn)的距離
end
L_best(NC)=min(L); %這一代最佳路徑的長(zhǎng)度記錄
pos=find(L==L_best(NC)); %查找哪一行(路線)長(zhǎng)度==最佳路徑長(zhǎng)度
R_best(NC,:)=Tabu(pos(1),:); %這一代最佳路徑的記錄
%%%%%%%%%%%%%%%%%%%%%%%%%第五步:更新信息素%%%%%%%%%%%%%%%%%%%%%%
Delta_Tau=zeros(n,n);
for i=1:m
for j=1:(n-1)
Delta_Tau(Tabu(i,j),Tabu(i,j+1))=... %ant-cycle模型
Delta_Tau(Tabu(i,j),Tabu(i,j+1))+Q/L(i);%Q/L(i)=信息素增加強(qiáng)度系數(shù)/本次周游所走路徑長(zhǎng)度=迭代新增信息素
end
Delta_Tau(Tabu(i,n),Tabu(i,1))=...
Delta_Tau(Tabu(i,n),Tabu(i,1))+Q/L(i);
end
Tau=(1-Rho).*Tau+Delta_Tau; %5.2信息素公式=保留下來(lái)的信息素+迭代新增信息素,Rho代表蒸發(fā)系數(shù),1-Rho代表持久系數(shù)
%%%%%%%%%%%%%%%%%%%%%%%第六步:禁忌表清零%%%%%%%%%%%%%%%%%%%%%%
Tabu=zeros(m,n);
%%%%%%%%%%%%%%%%%%%%%%%%%歷代最優(yōu)路線%%%%%%%%%%%%%%%%%%%%%%%%%%
for i=1:n-1
plot([ C(R_best(NC,i),1), C(R_best(NC,i+1),1)],...
[C(R_best(NC,i),2), C(R_best(NC,i+1),2)],'bo-'); %畫(huà)路線
hold on;
end
plot([C(R_best(NC,n),1), C(R_best(NC,1),1)],...
[C(R_best(NC,n),2), C(R_best(NC,1),2)],'ro-');
title(['優(yōu)化最短距離:',num2str(L_best(NC))]);
hold off;
pause(0.005);
NC=NC+1;
end
%%%%%%%%%%%%%%%%%%%%%%%%%%第七步:輸出結(jié)果%%%%%%%%%%%%%%%%%%%%%%%%%%
Pos=find(L_best==min(L_best));
Shortest_Route=R_best(Pos(1),:); %最佳路線
Shortest_Length=L_best(Pos(1)); %最佳路線長(zhǎng)度
figure(2),
plot(L_best)
xlabel('迭代次數(shù)')
ylabel('目標(biāo)函數(shù)值')
title('適應(yīng)度進(jìn)化曲線')
粒子群算法PSO
粒子群算法模擬鳥(niǎo)群的捕食行為,每個(gè)優(yōu)化問(wèn)題的解都是搜索空間中的一只鳥(niǎo)。我們稱之為“粒子”。所有的粒子都有一個(gè)由被優(yōu)化的函數(shù)決定的適應(yīng)值(fitnessvalue),每個(gè)粒子還有一個(gè)速度決定他們飛翔的方向和距離。然后粒子們就追隨當(dāng)前的最優(yōu)粒子在解空間中搜索。
關(guān)鍵參數(shù)
粒子種群規(guī)模N:粒子數(shù)目越大,算法搜索的空間范圍就越大,也就更容易發(fā)現(xiàn)全局最優(yōu)解,但算法運(yùn)行時(shí)間也就越長(zhǎng)。一般10個(gè)粒子已經(jīng)可以取得比較好的結(jié)構(gòu)。對(duì)于比較難的問(wèn)題或特定的問(wèn)題,粒子的數(shù)量可以取到100或200。
慣性權(quán)重w:代表對(duì)粒子當(dāng)前速度繼承的多少,用來(lái)控制算法的開(kāi)發(fā)和探索能力。權(quán)重較大時(shí),全局尋優(yōu)能力較強(qiáng),局部尋優(yōu)能力較弱;權(quán)重較小時(shí),全局尋優(yōu)能力較弱,局部尋優(yōu)能力較強(qiáng)。一般取0.8~1.2。
加速常數(shù)c1和c2:分別調(diào)節(jié)向 pbest 和 gbest方向飛行的最大步長(zhǎng),他們分別決定粒子個(gè)體經(jīng)驗(yàn)和群體經(jīng)驗(yàn)對(duì)粒子運(yùn)行軌跡的影響。通常可以取c1 = c2 = 1.5。
主要流程
PSO初始化為一群隨機(jī)粒子(隨機(jī)解),然后通過(guò)迭代找到最優(yōu)解,在每一次迭代中,粒子通過(guò)跟蹤兩個(gè)“極值”來(lái)更新自己。
第一個(gè)就是粒子本身所找到的最優(yōu)解,這個(gè)解叫做個(gè)體極值pBest,
另一個(gè)極值是整個(gè)種群找到的最優(yōu)解,這個(gè)極值是全局極值gBest。另外也可以不用整個(gè)種群而只是用其中一部分最優(yōu)粒子的鄰居,那么在所有鄰居中的極值就是局部極值。
粒子的速度及位置更新的方式如下:
其中
粒子的速度更新公式由三部分組成:粒子先前速度+個(gè)體最優(yōu)+全局最優(yōu)
是一個(gè)非負(fù)數(shù),稱為慣性因子,對(duì)算法的收斂起到很大的作用,其值越大,粒子飛躍的范圍就越廣,更容易找到全局最優(yōu),但是也會(huì)錯(cuò)失局部搜尋的能力。
分別為局部和全局最優(yōu)位置。
加速常數(shù) 也是非負(fù)常數(shù),是調(diào)整局部最優(yōu)值和全局最優(yōu)值權(quán)重的參數(shù),如果前者為0說(shuō)明搜尋過(guò)程中沒(méi)有自身經(jīng)驗(yàn)只有社會(huì)經(jīng)驗(yàn),容易陷入局部最優(yōu)解;若后者為0,即只有社會(huì)經(jīng)驗(yàn),沒(méi)有自身經(jīng)驗(yàn),常常會(huì)陷入局部最優(yōu)解中,不能飛越該局部最優(yōu)區(qū)域。
是[0,1]范圍之內(nèi)的隨機(jī)數(shù), 是約束因子,目的是控制速度的權(quán)重。
代碼
%%%%%%%%%%%%%%%%%粒子群算法求函數(shù)極值%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%初始化%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clear all; %清除所有變量
close all; %清圖
clc; %清屏
global fes; %fes統(tǒng)計(jì)函數(shù)計(jì)算次數(shù)
N = 100; %群體粒子個(gè)數(shù)
D = 10; %粒子維數(shù)
c1 = 1.5; %加速常數(shù)1
c2 = 1.5; %加速常數(shù)2
w = 0.8; %慣性權(quán)重
a = 1.0; %約束因子
Xmax = 20; %位置最大值
Xmin = -20; %位置最小值
Vmax = 10; %速度最大值
Vmin = -10; %速度最小值
MAXRUN = 20; %獨(dú)立測(cè)試次數(shù)
MAXFES = 10^5; %最大函數(shù)迭代次數(shù)
error = 10^-6; %誤差閾值
success = 0;
for run = 1:MAXRUN
fes = 0;
%%%%%%%%%%%%%%%%初始化種群個(gè)體(限定位置和速度)%%%%%%%%%%%%%%%%
x = rand(N, D) * (Xmax - Xmin) + Xmin;
v = rand(N, D) * (Vmax - Vmin) + Vmin;
%%%%%%%%%%%%%%%%%%初始化個(gè)體最優(yōu)位置和最優(yōu)值%%%%%%%%%%%%%%%%%%%
p = x;
pbest = ones(N,1);
for i = 1:N
pbest(i) = func(x(i, :));
end
%%%%%%%%%%%%%%%%%%%初始化全局最優(yōu)位置和最優(yōu)值%%%%%%%%%%%%%%%%%%
g = ones(1, D);
gbest = inf; %初始設(shè)為正無(wú)窮
for i = 1:N
if(pbest(i) < gbest) %如果個(gè)體最優(yōu)小于全局最優(yōu)
g = p(i, :); %更新全局最優(yōu)數(shù)組
gbest = pbest(i); %更新全局最優(yōu)值
end
end
gen = 1;
%%%%%%%%%%%按照公式依次迭代直到滿足精度或者迭代次數(shù)%%%%%%%%%%%%%
while fes <= MAXFES
for j = 1:N
%%%%%%%%%%%%%%更新個(gè)體最優(yōu)位置和最優(yōu)值%%%%%%%%%%%%%%%%%
temp = func(x(j, :));
if (temp < pbest(j))
p(j, :) = x(j, :);
pbest(j) = temp;
end
%%%%%%%%%%%%%%%%更新全局最優(yōu)位置和最優(yōu)值%%%%%%%%%%%%%%%
if(pbest(j) < gbest)
g = p(j, :);
gbest = pbest(j);
end
%%%%%%%%%%%%%%%%%更新位置和速度值%%%%%%%%%%%%%%%%%%%%%
v(j, :) = w * v(j, :) + c1 * rand * (p(j, :) - x(j, :))... %粒子的速度更新公式
+ c2 * rand * (g - x(j, :));
x(j, :) = x(j, :) + a*v(j, :); %粒子的位置更新公式
%%%%%%%%%%%%%%%%%%%%邊界條件處理%%%%%%%%%%%%%%%%%%%%%%
for ii = 1:D
if (v(j, ii) > Vmax) | (v(j, ii) < Vmin) %對(duì)粒子的速度,位置進(jìn)行邊界處理
v(j, ii) = rand * (Vmax - Vmin) + Vmin;
end
if (x(j, ii) > Xmax) | (x(j,ii) < Xmin)
x(j, ii) = rand * (Xmax - Xmin) + Xmin;
end
end
end
%%%%%%%%%%%%%%%%%%%%記錄歷代全局最優(yōu)值%%%%%%%%%%%%%%%%%%%%%
trace(gen) = gbest;
gen = gen + 1;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%畫(huà)圖%%%%%%%%%%%%%%%%%%%%%%%%%%
figure
plot(trace)
xlabel('迭代次數(shù)');
ylabel('適應(yīng)度值');
title('適應(yīng)度進(jìn)化曲線')
模擬退火算法
模擬退火算法來(lái)源于固體退火原理,將固體加溫至充分高,再讓其徐徐冷卻,加溫時(shí),固體內(nèi)部粒子隨溫升變?yōu)闊o(wú)序狀,內(nèi)能增大,而徐徐冷卻時(shí)粒子漸趨有序,在每個(gè)溫度都達(dá)到平衡態(tài),最后在常溫時(shí)達(dá)到基態(tài),內(nèi)能減為最小,即所求值
能量即目標(biāo)函數(shù),能量最低態(tài)即最優(yōu)解,
溫度是Metropolis算法的一個(gè)重要控制參數(shù),開(kāi)始時(shí)T大,可以接受較差惡化解;隨著T減小,只能接受較好的惡化解了
根據(jù)Metropolis準(zhǔn)則,粒子在溫度T時(shí)趨于平衡的概率為 exp(-ΔE/(kT)) ,其中 E 為溫度 T 時(shí)的內(nèi)能,ΔE為其改變數(shù), k 為 Boltzmann 常數(shù)。 Metropolis 準(zhǔn)則常表示為
主要流程
系統(tǒng)從一個(gè)能量狀態(tài)變化到另一個(gè)能量狀態(tài)時(shí)(根據(jù)當(dāng)前溫度產(chǎn)生新解:鄰域隨機(jī)選取+邊界處理),相應(yīng)的能量從Eold變化到Enew
若新?tīng)顟B(tài)是全局最優(yōu),則更新全局最優(yōu)解,保留上一個(gè)最優(yōu)解
Metropolis過(guò)程
若狀態(tài)向下(局部最優(yōu)),則接受新解
若狀態(tài)向上(全局搜索),則以一定概率接受(exp(-ΔE/(kT))>rand)
在系統(tǒng)每次變化時(shí),T也在冷卻,T(n+1)=KxT(n)。當(dāng)T趨向于0(設(shè)置一個(gè)小值,如0.001)時(shí),求得問(wèn)題整體最優(yōu)解
禁忌搜索算法
基本思想:
采用鄰域選優(yōu)的搜索方法,為了逃離局部最優(yōu)解,算法必須能夠接受劣解,也就是每一次得到的解不一定優(yōu)于原來(lái)的解。
但是,一旦接受了劣解,算法迭代即可能陷入循環(huán)。為了避免循環(huán),算法將最近接受的一些移動(dòng)放在禁忌表中,在以后的迭代中加以禁止。即只有不再禁忌表中的較好解(可能比當(dāng)前解差)才能接受作為下一代迭代的初始解。
隨著迭代的進(jìn)行,禁忌表不斷更新,經(jīng)過(guò)一定的迭代次數(shù)后,最早進(jìn)入禁忌表的移動(dòng)就從禁忌表中解禁退出。
主要流程
算法記憶匯總
遺傳算法
最早是由美國(guó)的 John Holland于20世紀(jì)70年代提出
能有效求解NP問(wèn)題(所有的非確定性多項(xiàng)式時(shí)間可解的判定問(wèn)題構(gòu)成NP類問(wèn)題),以及非線性,多峰函數(shù)優(yōu)化和多目標(biāo)優(yōu)化問(wèn)題
差分進(jìn)化算法
由Storn和Price于1995年首次提出
免疫算法
1958年澳大利亞學(xué)者Burnet率先提出克隆選擇原理
1973年Jerne提出免疫系統(tǒng)的數(shù)學(xué)框架
蟻群算法
由Marco Dorigo于1992年在他的博士論文中提出
蟻群算法是一種用來(lái)尋找優(yōu)化路徑的概率型算法,靈感來(lái)源于螞蟻在尋找食物過(guò)程中發(fā)現(xiàn)路徑的行為
粒子群算法
由Eberhart博士和kennedy博士發(fā)明
模擬退火算法
最早的思想是由Metropolis等人于1953年提出。1983 年,Kirkpatrick 等成功地將退火思想引入到組合優(yōu)化領(lǐng)域。
模擬退火算法從某一較高初溫出發(fā),伴隨溫度參數(shù)的不斷下降,結(jié)合概率突跳特性在解空間中隨機(jī)尋找目標(biāo)函數(shù)目標(biāo)函數(shù))的全局最優(yōu)解,即在局部最優(yōu)解能概率性地跳出并最終趨于全局最優(yōu)。
禁忌搜索算法
由Glover教授于1986年在一篇論文中首次提出
從一個(gè)初始可行解出發(fā),選擇一系列的特定搜索方向(移動(dòng))作為試探,選擇實(shí)現(xiàn)讓特定的目標(biāo)函數(shù)值變化最多的移動(dòng)。為了避免陷入局部最優(yōu)解,TS搜索中采用了一種靈活的“記憶”技術(shù),對(duì)已經(jīng)進(jìn)行的優(yōu)化過(guò)程進(jìn)行記錄和選擇,指導(dǎo)下一步的搜索方向,這就是Tabu表的建立。
神經(jīng)網(wǎng)絡(luò)算法
最早由McCulloch與Pitts提出形式神經(jīng)元數(shù)學(xué)模型
由Hopfield提出具有聯(lián)想記憶功能的Hopfield神經(jīng)網(wǎng)絡(luò),標(biāo)志神經(jīng)網(wǎng)絡(luò)取得重大進(jìn)展
用大量的簡(jiǎn)單計(jì)算單元(神經(jīng)元)構(gòu)成非線性系統(tǒng),在一定程度上模擬了大腦的信息處理、存儲(chǔ)和檢索等功能。
常見(jiàn)網(wǎng)絡(luò)結(jié)構(gòu)
前饋神經(jīng)網(wǎng)絡(luò)
反饋神經(jīng)網(wǎng)絡(luò)
BP網(wǎng)絡(luò)的誤差反向后傳學(xué)習(xí)算法,是最常用的神經(jīng)網(wǎng)絡(luò)算法。它利用輸出后的誤差來(lái)估計(jì)輸出層的直接前導(dǎo)層誤差,再利用這個(gè)誤差更新前一層的誤差,如此反傳下去獲得所有其他各層的誤差估計(jì)。
自組織網(wǎng)絡(luò)
測(cè)試輸出匯總
tall:運(yùn)行計(jì)時(shí)
mean:平均
gen:代數(shù)
fes:函數(shù)評(píng)價(jià)次數(shù)
trace:最優(yōu)值
注意輸出信息最終應(yīng)該包括:
測(cè)試的函數(shù)名Fname算法參數(shù)取值,如D, Pc, Pm, NP,MAXG, MAXRUN等
表3最優(yōu)函數(shù)值bestfun, 最差函數(shù)值worstfun,平均值meanfun,標(biāo)準(zhǔn)差stdfun,算法總體平均用時(shí)meantotaltimes(s)
表4首次獲得至今最優(yōu)解值對(duì)應(yīng)的平均代數(shù)meanbestGen,對(duì)應(yīng)的函數(shù)評(píng)價(jià)次數(shù)meanbestFEs,對(duì)應(yīng)的用時(shí)meanbesttime(s),統(tǒng)計(jì)得到的成功次數(shù)success%
//單次測(cè)試F1run
//每次運(yùn)行記錄F1totoal
//匯總測(cè)試total求最優(yōu)值,平均值,平均用時(shí)
global fes %fes統(tǒng)計(jì)函數(shù)計(jì)算次數(shù)
MAXRUN = 10; %獨(dú)立測(cè)試次數(shù)
funfile = fopen(‘F1total.txt’,‘a(chǎn)’); %w 改為a表示添加(w表示覆蓋原有內(nèi)容)
tallrecord = []; %用于記錄每次獨(dú)立測(cè)試的運(yùn)行用時(shí)
bestfrecord = []; %用于記錄每次獨(dú)立測(cè)試得到的最優(yōu)函數(shù)值
allfile = fopen(‘total.txt’,‘a(chǎn)’); %w 改為a表示添加(w表示覆蓋原有內(nèi)容)
for run = 1:MAXRUN
%....忽略一段代碼…..
fprintf('第%d次運(yùn)行 第%d代 %f
',run,0,trace(1));
onerunfile = fopen([‘F1_run’ num2str(run) ‘.txt’],‘w’); %建立第run次運(yùn)行的記錄文檔
fprintf(onerunfile,‘%d %d %g
’,0,fes,trace(1)); %寫(xiě)入第0代種群結(jié)
t0 = clock; %記錄當(dāng)前時(shí)刻
tall = 0; %統(tǒng)計(jì)計(jì)算總用時(shí)(排除寫(xiě)文件用時(shí))
for gen=1:G %差分進(jìn)化循環(huán)
%....忽略好多段代碼…..
tall = tall + etime(clock,t0); %累加計(jì)算用時(shí)(單位秒,排除寫(xiě)文件用時(shí))
fprintf(onerunfile,'%d %d %g
',gen,fes,trace(gen+1)); %寫(xiě)入第gen代結(jié)果
t0 = clock; %記錄當(dāng)前時(shí)刻
end
fclose(onerunfile);
tallrecord = [tallrecord,tall]; %添加第run次獨(dú)立測(cè)試的運(yùn)行用時(shí)
bestfrecord = [bestfrecord, trace(gen+1)]; %添加第run次獨(dú)立測(cè)試得到的最優(yōu)函數(shù)值
fprintf(funfile,‘%d %g %g
’,run,trace(gen+1),tall); %輸出第幾次運(yùn)行最優(yōu)值和用時(shí)
End
fclose(funfile);
fprintf(allfile,'%s %g %g %g
','F1',min(bestfrecord),mean(bestfrecord),mean(tallrecord));
%輸出匯總信息:【函數(shù)名,多次運(yùn)行最優(yōu)值,平均值,平均用時(shí)】
總結(jié)
- 上一篇: GDUFE ACM-1020
- 下一篇: 材质纹理的初级示例