㈠ 多目標優化演算法
多目標優化演算法如下:
一、多目標進化演算法(MOEA)
1、MOEA通過對種群X(t)執行選擇、交叉和變異等操作產生下一代種群X(t+1)。
2、在每一代進化過程中 ,首先將種群X(t)中的所有非劣解個體都復制到外部集A(t)中。
2、智能優化演算法:包括進化演算法(簡稱EA)、粒子群演算法(簡稱PSO)等。
兩者的區別:傳統優化技術一般每次能得到Pareo解集中的一個,而用智能演算法來求解,可以得到更多的Pareto解,這些解構成了一個最優解集,稱為Pareto最優解(任一個目標函數值的提高都必須以犧牲其他目標函數值為代價的解集)。
㈡ 如何用matlab做粒子群的兩個目標優化啊
多目標優化是沒有精確解的,要用加權系數或者非劣解來表示你的解。
㈢ 怎麼用matlab中的粒子群演算法求解多目標優化問題
不知道你所說的多目標是指什麼,據我的理解,既然有個目標函數,那麼多目標可以在目標函數那裡表示,我最近也在做這個粒子群演算法, 下面是我的vc++6.0代碼,改造了一下基本粒子群,求路徑的.. #include #include #include using namespace std; d
㈣ 求大神給出基於粒子群演算法的多目標搜索演算法的完整程序。。。從目標函數到最後。。
%% 該函數演示多目標perota優化問題
%清空環境
clc
clear
load data
%% 初始參數
objnum=size(P,1); %類中物品個數
weight=92; %總重量限制
%初始化程序
Dim=5; %粒子維數
xSize=50; %種群個數
MaxIt=200; %迭代次數
c1=0.8; %演算法參數
c2=0.8; %演算法參數
wmax=1.2; %慣性因子
wmin=0.1; %慣性因子
x=unidrnd(4,xSize,Dim); %粒子初始化
v=zeros(xSize,Dim); %速度初始化
xbest=x; %個體最佳值
gbest=x(1,:); %粒子群最佳位置
% 粒子適應度值
px=zeros(1,xSize); %粒子價值目標
rx=zeros(1,xSize); %粒子體積目標
cx=zeros(1,xSize); %重量約束
% 最優值初始化
pxbest=zeros(1,xSize); %粒子最優價值目標
rxbest=zeros(1,xSize); %粒子最優體積目標
cxbest=zeros(1,xSize); %記錄重量,以求約束
% 上一次的值
pxPrior=zeros(1,xSize);%粒子價值目標
rxPrior=zeros(1,xSize);%粒子體積目標
cxPrior=zeros(1,xSize);%記錄重量,以求約束
%計算初始目標向量
for i=1:xSize
for j=1:Dim %控制類別
px(i) = px(i)+P(x(i,j),j); %粒子價值
rx(i) = rx(i)+R(x(i,j),j); %粒子體積
cx(i) = cx(i)+C(x(i,j),j); %粒子重量
end
end
% 粒子最優位置
pxbest=px;rxbest=rx;cxbest=cx;
%% 初始篩選非劣解
flj=[];
fljx=[];
fljNum=0;
%兩個實數相等精度
tol=1e-7;
for i=1:xSize
flag=0; %支配標志
for j=1:xSize
if j~=i
if ((px(i)<px(j)) && (rx(i)>rx(j))) ||((abs(px(i)-px(j))<tol)...
&& (rx(i)>rx(j)))||((px(i)<px(j)) && (abs(rx(i)-rx(j))<tol)) || (cx(i)>weight)
flag=1;
break;
end
end
end
%判斷有無被支配
if flag==0
fljNum=fljNum+1;
% 記錄非劣解
flj(fljNum,1)=px(i);flj(fljNum,2)=rx(i);flj(fljNum,3)=cx(i);
% 非劣解位置
fljx(fljNum,:)=x(i,:);
end
end
%% 循環迭代
for iter=1:MaxIt
% 權值更新
w=wmax-(wmax-wmin)*iter/MaxIt;
%從非劣解中選擇粒子作為全局最優解
s=size(fljx,1);
index=randi(s,1,1);
gbest=fljx(index,:);
%% 群體更新
for i=1:xSize
%速度更新
v(i,:)=w*v(i,:)+c1*rand(1,1)*(xbest(i,:)-x(i,:))+c2*rand(1,1)*(gbest-x(i,:));
%位置更新
x(i,:)=x(i,:)+v(i,:);
x(i,:) = rem(x(i,:),objnum)/double(objnum);
index1=find(x(i,:)<=0);
if ~isempty(index1)
x(i,index1)=rand(size(index1));
end
x(i,:)=ceil(4*x(i,:));
end
%% 計算個體適應度
pxPrior(:)=0;
rxPrior(:)=0;
cxPrior(:)=0;
for i=1:xSize
for j=1:Dim %控制類別
pxPrior(i) = pxPrior(i)+P(x(i,j),j); %計算粒子i 價值
rxPrior(i) = rxPrior(i)+R(x(i,j),j); %計算粒子i 體積
cxPrior(i) = cxPrior(i)+C(x(i,j),j); %計算粒子i 重量
end
end
%% 更新粒子歷史最佳
for i=1:xSize
%現在的支配原有的,替代原有的
if ((px(i)<pxPrior(i)) && (rx(i)>rxPrior(i))) ||((abs(px(i)-pxPrior(i))<tol)...
&& (rx(i)>rxPrior(i)))||((px(i)<pxPrior(i)) && (abs(rx(i)-rxPrior(i))<tol)) || (cx(i)>weight)
xbest(i,:)=x(i,:);%沒有記錄目標值
pxbest(i)=pxPrior(i);rxbest(i)=rxPrior(i);cxbest(i)=cxPrior(i);
end
%彼此不受支配,隨機決定
if ~( ((px(i)<pxPrior(i)) && (rx(i)>rxPrior(i))) ||((abs(px(i)-pxPrior(i))<tol)...
&& (rx(i)>rxPrior(i)))||((px(i)<pxPrior(i)) && (abs(rx(i)-rxPrior(i))<tol)) || (cx(i)>weight) )...
&& ~( ((pxPrior(i)<px(i)) && (rxPrior(i)>rx(i))) ||((abs(pxPrior(i)-px(i))<tol) && (rxPrior(i)>rx(i)))...
||((pxPrior(i)<px(i)) && (abs(rxPrior(i)-rx(i))<tol)) || (cxPrior(i)>weight) )
if rand(1,1)<0.5
xbest(i,:)=x(i,:);
pxbest(i)=pxPrior(i);rxbest(i)=rxPrior(i);cxbest(i)=cxPrior(i);
end
end
end
%% 更新非劣解集合
px=pxPrior;
rx=rxPrior;
cx=cxPrior;
%更新升級非劣解集合
s=size(flj,1);%目前非劣解集合中元素個數
%先將非劣解集合和xbest合並
pppx=zeros(1,s+xSize);
rrrx=zeros(1,s+xSize);
cccx=zeros(1,s+xSize);
pppx(1:xSize)=pxbest;pppx(xSize+1:end)=flj(:,1)';
rrrx(1:xSize)=rxbest;rrrx(xSize+1:end)=flj(:,2)';
cccx(1:xSize)=cxbest;cccx(xSize+1:end)=flj(:,3)';
xxbest=zeros(s+xSize,Dim);
xxbest(1:xSize,:)=xbest;
xxbest(xSize+1:end,:)=fljx;
%篩選非劣解
flj=[];
fljx=[];
k=0;
tol=1e-7;
for i=1:xSize+s
flag=0;%沒有被支配
%判斷該點是否非劣
for j=1:xSize+s
if j~=i
if ((pppx(i)<pppx(j)) && (rrrx(i)>rrrx(j))) ||((abs(pppx(i)-pppx(j))<tol) ...
&& (rrrx(i)>rrrx(j)))||((pppx(i)<pppx(j)) && (abs(rrrx(i)-rrrx(j))<tol)) ...
|| (cccx(i)>weight) %有一次被支配
flag=1;
break;
end
end
end
%判斷有無被支配
if flag==0
k=k+1;
flj(k,1)=pppx(i);flj(k,2)=rrrx(i);flj(k,3)=cccx(i);%記錄非劣解
fljx(k,:)=xxbest(i,:);%非劣解位置
end
end
%去掉重復粒子
repflag=0; %重復標志
k=1; %不同非劣解粒子數
flj2=[]; %存儲不同非劣解
fljx2=[]; %存儲不同非劣解粒子位置
flj2(k,:)=flj(1,:);
fljx2(k,:)=fljx(1,:);
for j=2:size(flj,1)
repflag=0; %重復標志
for i=1:size(flj2,1)
result=(fljx(j,:)==fljx2(i,:));
if length(find(result==1))==Dim
repflag=1;%有重復
end
end
%粒子不同,存儲
if repflag==0
k=k+1;
flj2(k,:)=flj(j,:);
fljx2(k,:)=fljx(j,:);
end
end
%非劣解更新
flj=flj2;
fljx=fljx2;
end
%繪制非劣解分布
plot(flj(:,1),flj(:,2),'o')
xlabel('P')
ylabel('R')
title('最終非劣解在目標空間分布')
disp('非劣解flj中三列依次為P,R,C')
㈤ 多目標優化演算法
姓名:袁卓成;學號:20021210612; 學院:電子工程學院
轉自 https://blog.csdn.net/weixin_43202635/article/details/82700342
【嵌牛導讀】 本文介紹了各類多目標優化演算法
【嵌牛鼻子】 多目標優化, pareto
【嵌牛提問】 多目標優化演算法有哪些?
【嵌牛正文】
1)無約束和有約束條件;
2)確定性和隨機性最優問題(變數是否確定);
3)線性優化與非線性優化(目標函數和約束條件是否線性);
4)靜態規劃和動態規劃(解是否隨時間變化)。
使多個目標在給定區域同時盡可能最佳,多目標優化的解通常是一組均衡解(即一組由眾多 Pareto最優解組成的最優解集合 ,集合中的各個元素稱為 Pareto最優解或非劣最優解)。
①非劣解——多目標優化問題並不存在一個最優解,所有可能的解都稱為非劣解,也稱為Pareto解。
②Pareto最優解——無法在改進任何目標函數的同時不削弱至少一個其他目標函數。這種解稱作非支配解或Pareto最優解。
多目標優化問題不存在唯一的全局最優解 ,過多的非劣解是無法直接應用的 ,所以在求解時就是要尋找一個最終解。
(1)求最終解主要有三類方法:
一是求非劣解的生成法,即先求出大量的非劣解,構成非劣解的一個子集,然後按照決策者的意圖找出最終解;(生成法主要有加權法﹑約束法﹑加權法和約束法結合的混合法以及多目標遺傳演算法)
二為交互法,不先求出很多的非劣解,而是通過分析者與決策者對話的方式,逐步求出最終解;
三是事先要求決策者提供目標之間的相對重要程度,演算法以此為依據,將多目標問題轉化為單目標問題進行求解。
(2)多目標優化演算法歸結起來有傳統優化演算法和智能優化演算法兩大類。
傳統優化演算法包括加權法、約束法和線性規劃法等,實質上就是將多目標函數轉化為單目標函數,通過採用單目標優化的方法達到對多目標函數的求解。
智能優化演算法包括進化演算法(Evolutionary Algorithm, 簡稱EA)、粒子群演算法(Particle Swarm Optimization, PSO)等。
兩者的區別——傳統優化技術一般每次能得到Pareo解集中的一個,而用智能演算法來求解,可以得到更多的Pareto解,這些解構成了一個最優解集,稱為Pareto最優解(任一個目標函數值的提高都必須以犧牲其他目標函數值為代價的解集)。
①MOEA通過對種群 X ( t)執行選擇、交叉和變異等操作產生下一代種群 X ( t + 1) ;
②在每一代進化過程中 ,首先將種群 X ( t)中的所有非劣解個體都復制到外部集 A ( t)中;
③然後運用小生境截斷運算元剔除A ( t)中的劣解和一些距離較近的非劣解個體 ,以得到個體分布更為均勻的下一代外部集 A ( t + 1) ;
④並且按照概率 pe從 A ( t + 1)中選擇一定數量的優秀個體進入下代種群;
⑤在進化結束時 ,將外部集中的非劣解個體作為最優解輸出。
NSGA一II演算法的基本思想:
(1)首先,隨機產生規模為N的初始種群,非支配排序後通過遺傳演算法的選擇、交叉、變異三個基本操作得到第一代子代種群;
(2)其次,從第二代開始,將父代種群與子代種群合並,進行快速非支配排序,同時對每個非支配層中的個體進行擁擠度計算,根據非支配關系以及個體的擁擠度選取合適的個體組成新的父代種群;
(3)最後,通過遺傳演算法的基本操作產生新的子代種群:依此類推,直到滿足程序結束的條件。
非支配排序演算法:
考慮一個目標函數個數為K(K>1)、規模大小為N的種群,通過非支配排序演算法可以對該種群進行分層,具體的步驟如下:
通過上述步驟得到的非支配個體集是種群的第一級非支配層;
然後,忽略這些標記的非支配個體,再遵循步驟(1)一(4),就會得到第二級非支配層;
依此類推,直到整個種群被分類。
擁擠度 ——指種群中給定個體的周圍個體的密度,直觀上可表示為個體。
擁擠度比較運算元:
設想這么一個場景:一群鳥進行覓食,而遠處有一片玉米地,所有的鳥都不知道玉米地到底在哪裡,但是它們知道自己當前的位置距離玉米地有多遠。那麼找到玉米地的最佳策略,也是最簡單有效的策略就是是搜尋目前距離玉米地最近的鳥群的周圍區域。
基本粒子群演算法:
粒子群由 n個粒子組成 ,每個粒子的位置 xi 代表優化問題在 D維搜索空間中潛在的解;
粒子在搜索空間中以一定的速度飛行 , 這個速度根據它本身的飛行經驗和同伴的飛行經驗來動態調整下一步飛行方向和距離;
所有的粒子都有一個被目標函數決定的適應值(可以將其理解為距離「玉米地」的距離) , 並且知道自己到目前為止發現的最好位置 (個體極值 pi )和當前的位置 ( xi ) 。
粒子群演算法的數學描述 :
每個粒子 i包含為一個 D維的位置向量 xi = ( xi1, xi2, …, xiD )和速度向量 vi = ( vi1, vi2,…, viD ) ,粒子 i搜索解空間時 ,保存其搜索到的最優經歷位置pi = ( pi1, pi2, …, piD ) 。在每次迭代開始時 ,粒子根據自身慣性和經驗及群體最優經歷位置 pg = ( pg1, pg2, …, pgD )來調整自己的速度向量以調整自身位置。
粒子群演算法基本思想:
(1)初始化種群後 ,種群的大小記為 N。基於適應度支配的思想 ,將種群劃分成兩個子群 ,一個稱為非支配子集 A,另一個稱為支配子集 B ,兩個子集的基數分別為 n1、n2 。
(2)外部精英集用來存放每代產生的非劣解子集 A,每次迭代過程只對 B 中的粒子進行速度和位置的更新 ;
(3)並對更新後的 B 中的粒子基於適應度支配思想與 A中的粒子進行比較 ,若 xi ∈B , ϖ xj ∈A,使得 xi 支配 xj,則刪除 xj,使 xi 加入 A 更新外部精英集 ;且精英集的規模要利用一些技術維持在一個上限范圍內 ,如密度評估技術、分散度技術等。
(4)最後 ,演算法終止的准則可以是最大迭代次數 Tmax、計算精度ε或最優解的最大凝滯步數 Δt等。
㈥ 粒子群演算法解決兩個函數的多目標優化的matlab代碼。
http://www.doc88.com/p-60698612387.html
http://wenku..com/view/1c27aa8702d276a200292e1e.html
㈦ 如何用粒子群優化(PSO)演算法實現多目標優化
粒子群演算法,也稱粒子群優化演算法(ParticleSwarmOptimization),縮寫為PSO,是近年來發展起來的一種新的進化演算法(EvolutionaryAlgorithm-EA)。PSO演算法屬於進化演算法的一種,和模擬退火演算法相似,它也是從隨機解出發,通過迭代尋找最優解,它也是通過適應度來評價解的品質,但它比遺傳演算法規則更為簡單,它沒有遺傳演算法的「交叉」(Crossover)和「變異」(Mutation)操作,它通過追隨當前搜索到的最優值來尋找全局最優。這種演算法以其實現容易、精度高、收斂快等優點引起了學術界的重視,並且在解決實際問題中展示了其優越性。粒子群演算法是一種並行演算法。
㈧ 多目標粒子群優化演算法 有哪些參數
那要看你用什麼軟體,測試什麼函數了。基本思想就是測試的目標函數值為y值,迭代次數為x值,統計數據,繪制圖像~得到的就是迭代收斂曲線圖~
㈨ 粒子群優化演算法
姓名:楊晶晶 學號:21011210420 學院:通信工程學院
【嵌牛導讀】
傳統的多目標優化方法是將多目標問題通過加權求和轉化為單目標問題來處理的,而粒子演算法主要是解決一些多目標優化問題的(例如機械零件的多目標設計優化),其優點是容易實現,精度高,收斂速度快。
【嵌牛鼻子】粒子群演算法的概念、公式、調參以及與遺傳演算法的比較。
【嵌牛提問】什麼是粒子群演算法?它的計算流程是什麼?與遺傳演算法相比呢?
【嵌牛正文】
1. 概念
粒子群優化演算法(PSO:Particle swarm optimization) 是一種進化計算技術(evolutionary computation),源於對鳥群捕食的行為研究。
粒子群優化演算法的基本思想:是通過群體中個體之間的協作和信息共享來尋找最優解。
PSO的優勢:在於簡單容易實現並且沒有許多參數的調節。目前已被廣泛應用於函數優化、神經網路訓練、模糊系統控制以及其他遺傳演算法的應用領域。
2. 演算法
2.1 問題抽象
鳥被抽象為沒有質量和體積的微粒(點),並延伸到N維空間,粒子i在N維空間的位置表示為矢量Xi=(x1,x2,…,xN),飛行速度表示為矢量Vi=(v1,v2,…,vN)。每個粒子都有一個由目標函數決定的適應值(fitness value),並且知道自己到目前為止發現的最好位置(pbest)和現在的位置Xi。這個可以看作是粒子自己的飛行經驗。除此之外,每個粒子還知道到目前為止整個群體中所有粒子發現的最好位置(gbest)(gbest是pbest中的最好值),這個可以看作是粒子同伴的經驗。粒子就是通過自己的經驗和同伴中最好的經驗來決定下一步的運動。
2.2 更新規則
PSO初始化為一群隨機粒子(隨機解)。然後通過迭代找到最優解。在每一次的迭代中,粒子通過跟蹤兩個「極值」(pbest,gbest)來更新自己。在找到這兩個最優值後,粒子通過下面的公式來更新自己的速度和位置。
公式(1)的第一部分稱為【記憶項】,表示上次速度大小和方向的影響;公式(1)的第二部分稱為【自身認知項】,是從當前點指向粒子自身最好點的一個矢量,表示粒子的動作來源於自己經驗的部分;公式(1)的第三部分稱為【群體認知項】,是一個從當前點指向種群最好點的矢量,反映了粒子間的協同合作和知識共享。粒子就是通過自己的經驗和同伴中最好的經驗來決定下一步的運動。
以上面兩個公式為基礎,形成了PSO的標准形式。
公式(2)和 公式(3)被視為標准PSO演算法。
2.3 標准PSO演算法流程
標准PSO演算法的流程:
1)初始化一群微粒(群體規模為N),包括隨機位置和速度;
2)評價每個微粒的適應度;
3)對每個微粒,將其適應值與其經過的最好位置pbest作比較,如果較好,則將其作為當前的最好位置pbest;
4)對每個微粒,將其適應值與其經過的最好位置gbest作比較,如果較好,則將其作為當前的最好位置gbest;
5)根據公式(2)、(3)調整微粒速度和位置;
6)未達到結束條件則轉第2)步。
迭代終止條件根據具體問題一般選為最大迭代次數Gk或(和)微粒群迄今為止搜索到的最優位置滿足預定最小適應閾值。
公式(2)和(3)中pbest和gbest分別表示微粒群的局部和全局最優位置。
當C1=0時,則粒子沒有了認知能力,變為只有社會的模型(social-only):
被稱為全局PSO演算法。粒子有擴展搜索空間的能力,具有較快的收斂速度,但由於缺少局部搜索,對於復雜問題
比標准PSO 更易陷入局部最優。
當C2=0時,則粒子之間沒有社會信息,模型變為只有認知(cognition-only)模型:
被稱為局部PSO演算法。由於個體之間沒有信息的交流,整個群體相當於多個粒子進行盲目的隨機搜索,收斂速度慢,因而得到最優解的可能性小。
2.4 參數分析
參數:群體規模N,慣性因子 ,學習因子c1和c2,最大速度Vmax,最大迭代次數Gk。
群體規模N:一般取20~40,對較難或特定類別的問題可以取到100~200。
最大速度Vmax:決定當前位置與最好位置之間的區域的解析度(或精度)。如果太快,則粒子有可能越過極小點;如果太慢,則粒子不能在局部極小點之外進行足夠的探索,會陷入到局部極值區域內。這種限制可以達到防止計算溢出、決定問題空間搜索的粒度的目的。
權重因子:包括慣性因子和學習因子c1和c2。使粒子保持著運動慣性,使其具有擴展搜索空間的趨勢,有能力探索新的區域。c1和c2代表將每個粒子推向pbest和gbest位置的統計加速項的權值。較低的值允許粒子在被拉回之前可以在目標區域外徘徊,較高的值導致粒子突然地沖向或越過目標區域。
參數設置:
1)如果令c1=c2=0,粒子將一直以當前速度的飛行,直到邊界。很難找到最優解。
2)如果=0,則速度只取決於當前位置和歷史最好位置,速度本身沒有記憶性。假設一個粒子處在全局最好位置,它將保持靜止,其他粒子則飛向它的最好位置和全局最好位置的加權中心。粒子將收縮到當前全局最好位置。在加上第一部分後,粒子有擴展搜索空間的趨勢,這也使得的作用表現為針對不同的搜索問題,調整演算法的全局和局部搜索能力的平衡。較大時,具有較強的全局搜索能力;較小時,具有較強的局部搜索能力。
3)通常設c1=c2=2。Suganthan的實驗表明:c1和c2為常數時可以得到較好的解,但不一定必須等於2。Clerc引入收斂因子(constriction factor) K來保證收斂性。
通常取為4.1,則K=0.729.實驗表明,與使用慣性權重的PSO演算法相比,使用收斂因子的PSO有更快的收斂速度。其實只要恰當的選取和c1、c2,兩種演算法是一樣的。因此使用收斂因子的PSO可以看作使用慣性權重PSO的特例。
恰當的選取演算法的參數值可以改善演算法的性能。
3. PSO與其它演算法的比較
3.1 遺傳演算法和PSO的比較
1)共性:
(1)都屬於仿生演算法。
(2)都屬於全局優化方法。
(3)都屬於隨機搜索演算法。
(4)都隱含並行性。
(5)根據個體的適配信息進行搜索,因此不受函數約束條件的限制,如連續性、可導性等。
(6)對高維復雜問題,往往會遇到早熟收斂和收斂 性能差的缺點,都無法保證收斂到最優點。
2)差異:
(1)PSO有記憶,好的解的知識所有粒子都保 存,而GA(Genetic Algorithm),以前的知識隨著種群的改變被改變。
(2)PSO中的粒子僅僅通過當前搜索到最優點進行共享信息,所以很大程度上這是一種單共享項信息機制。而GA中,染色體之間相互共享信息,使得整個種群都向最優區域移動。
(3)GA的編碼技術和遺傳操作比較簡單,而PSO相對於GA,沒有交叉和變異操作,粒子只是通過內部速度進行更新,因此原理更簡單、參數更少、實現更容易。
(4)應用於人工神經網路(ANN)
GA可以用來研究NN的三個方面:網路連接權重、網路結構、學習演算法。優勢在於可處理傳統方法不能處理的問題,例如不可導的節點傳遞函數或沒有梯度信息。
GA缺點:在某些問題上性能不是特別好;網路權重的編碼和遺傳運算元的選擇有時較麻煩。
已有利用PSO來進行神經網路訓練。研究表明PSO是一種很有潛力的神經網路演算法。速度較快且有較好的結果。且沒有遺傳演算法碰到的問題。
㈩ 跪求一份多目標優化遺傳演算法 matlab源代碼,不甚感激。郵 箱991882239
我給你一個標准遺傳演算法程序供你參考:
該程序是遺傳演算法優化BP神經網路函數極值尋優:
%% 該代碼為基於神經網路遺傳演算法的系統極值尋優
%% 清空環境變數
clc
clear
%% 初始化遺傳演算法參數
%初始化參數
maxgen=100; %進化代數,即迭代次數
sizepop=20; %種群規模
pcross=[0.4]; %交叉概率選擇,0和1之間
pmutation=[0.2]; %變異概率選擇,0和1之間
lenchrom=[1 1]; %每個變數的字串長度,如果是浮點變數,則長度都為1
bound=[-5 5;-5 5]; %數據范圍
indivials=struct('fitness',zeros(1,sizepop), 'chrom',[]); %將種群信息定義為一個結構體
avgfitness=[]; %每一代種群的平均適應度
bestfitness=[]; %每一代種群的最佳適應度
bestchrom=[]; %適應度最好的染色體
%% 初始化種群計算適應度值
% 初始化種群
for i=1:sizepop
%隨機產生一個種群
indivials.chrom(i,:)=Code(lenchrom,bound);
x=indivials.chrom(i,:);
%計算適應度
indivials.fitness(i)=fun(x); %染色體的適應度
end
%找最好的染色體
[bestfitness bestindex]=min(indivials.fitness);
bestchrom=indivials.chrom(bestindex,:); %最好的染色體
avgfitness=sum(indivials.fitness)/sizepop; %染色體的平均適應度
% 記錄每一代進化中最好的適應度和平均適應度
trace=[avgfitness bestfitness];
%% 迭代尋優
% 進化開始
for i=1:maxgen
i
% 選擇
indivials=Select(indivials,sizepop);
avgfitness=sum(indivials.fitness)/sizepop;
%交叉
indivials.chrom=Cross(pcross,lenchrom,indivials.chrom,sizepop,bound);
% 變異
indivials.chrom=Mutation(pmutation,lenchrom,indivials.chrom,sizepop,[i maxgen],bound);
% 計算適應度
for j=1:sizepop
x=indivials.chrom(j,:); %解碼
indivials.fitness(j)=fun(x);
end
%找到最小和最大適應度的染色體及它們在種群中的位置
[newbestfitness,newbestindex]=min(indivials.fitness);
[worestfitness,worestindex]=max(indivials.fitness);
% 代替上一次進化中最好的染色體
if bestfitness>newbestfitness
bestfitness=newbestfitness;
bestchrom=indivials.chrom(newbestindex,:);
end
indivials.chrom(worestindex,:)=bestchrom;
indivials.fitness(worestindex)=bestfitness;
avgfitness=sum(indivials.fitness)/sizepop;
trace=[trace;avgfitness bestfitness]; %記錄每一代進化中最好的適應度和平均適應度
end
%進化結束
%% 結果分析
[r c]=size(trace);
plot([1:r]',trace(:,2),'r-');
title('適應度曲線','fontsize',12);
xlabel('進化代數','fontsize',12);ylabel('適應度','fontsize',12);
axis([0,100,0,1])
disp('適應度 變數');
x=bestchrom;
% 窗口顯示
disp([bestfitness x]);