日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

智能优化算法

發(fā)布時(shí)間:2023/12/13 综合教程 22 生活家
生活随笔 收集整理的這篇文章主要介紹了 智能优化算法 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)重的,公式如下(![img](file:///C:Users79304AppDataLocalTempksohtml1764wps2.png) 為信息素,![img](file:///C:Users79304AppDataLocalTempksohtml1764wps3.png) 為距離權(quán)重)

信息素更新

信息素增量計(jì)算公式,其中 Q 信息素強(qiáng)度系數(shù),![img](file:///C:Users79304AppDataLocalTempksohtml1764wps4.png) 為第 k 只螞蟻在本輪周游中所走過(guò)的路徑的長(zhǎng)度

信息素蒸發(fā)量計(jì)算公式,其中 ![img](file:///C:Users79304AppDataLocalTempksohtml1764wps5.png) 表示路徑上信息素的蒸發(fā)系數(shù),![img](file:///C:Users79304AppDataLocalTempksohtml1764wps6.png)表示信息素的持久性系數(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ù), kBoltzmann 常數(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ò)算法

最早由McCullochPitts提出形式神經(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é)

以上是生活随笔為你收集整理的智能优化算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。