?? main.m
字號:
%標(biāo)準(zhǔn)遺傳算法
%優(yōu)化函數(shù)為f=-(x-1)^2+4,其中,0<=x<=3
%編碼長度為10位,編碼精度為0.0029
%種群規(guī)模設(shè)為40,遺傳算子分別為比例選擇,單點(diǎn)交叉和單點(diǎn)變異。交叉概率0.7,變異概率0.1
%最大進(jìn)化代數(shù)為300代,保優(yōu)操作。
%郟宣耀 于2005年11月27日開發(fā)
%初始化函數(shù),隨機(jī)形成規(guī)模為40初始種群
pop(40,10)=0; %初始種群, pop(40,10)=0表示除了最后一個值是0,其他所有值都默認(rèn)是0,如果是pop(40,10)=3,則表示最后一個值是3,其他所有值都默認(rèn)是零
best_individual(10)=0; %最優(yōu)個體
adapt_ave(200)=0; %種群平均適應(yīng)值
for i=1:40
for j=1:10
if rand>0.5 %rand是隨機(jī)產(chǎn)生數(shù)[0 1],rand(3)隨機(jī)產(chǎn)生3維向量,rand(2,3)隨機(jī)產(chǎn)生2行3列的矩陣
pop(i,j)=1;
else
pop(i,j)=0;
end
end
end
% pop
clear i; %clear后面不跟操作數(shù)時,表示清除工作空間所有變量及其的賦值,有操作數(shù)表示直接清除操作數(shù)
clear j;
global G; %定義全局變量
%交叉操作,概率為0.7,單點(diǎn)交叉
for G=1:200 %進(jìn)化最大代數(shù)
for i=1:2:39
cross_P=rand; %隨機(jī)產(chǎn)生[0 1]一個數(shù),以比較交叉概率
if cross_P<0.9 %交叉概率為0.7
cross_pos=round(10*rand); %交叉位置為0~9,若位置為0或1,則不進(jìn)行交叉操作 round取整
if or(cross_pos==0,cross_pos==1)
continue;
end
for j=cross_pos:10 %交換
temp=pop(i,j);
pop(i,j)=pop(i+1,j);
pop(i+1,j)=temp;
end
end
end
clear i;
clear j;
clear temp;
clear cross_P;
clear cross_pos;
%變異操作,單點(diǎn)變異,變異概率為0.1
for i=1:40
if rand<0.1 %通過變異概率
M_pos=round(10*rand);
if M_pos~=0 %~=表示不等于的意思,若變異位為0則無意義,
pop(i,M_pos)=1-pop(i,M_pos);
end
end
end
clear M_pos;
clear i;
%計算適應(yīng)值
for i=1:40
adapt(i)=0;
end
for i=1:40
for j=1:10
if pop(i,j)==1
adapt(i)=adapt(i)+2^(10-j);
end
end
adapt(i)=adapt(i)*0.0029;
adapt(i)=-(adapt(i)-1).^2+4; %由優(yōu)化函數(shù)為f=-(x-1)^2+4決定
end
global adapt_best;
global best_pos;
adapt_best=0; %最佳個體
best_pos=0; %最佳個體在種群中的位置
% adapt_ave=0;
for i=1:40
adapt_ave(G)=adapt_ave(G)+adapt(i);
if adapt_best<adapt(i)
adapt_best=adapt(i);
best_pos=i;
end
end
adapt_ave(G)=adapt_ave(G)/40;
clear i;
clear j;
%保優(yōu)操作
for i=1:10
best_individual(i)=pop(best_pos,i);
end
% The select operator function
ada_sum=0;
ada_temp=0;
r=0;
i=0;j=0;
for i=1:40
ada_sum=ada_sum+adapt(i);
end
for i=1:39 %選擇39次,最后一個個體留給歷代最優(yōu)解
r=rand*ada_sum; %隨機(jī)產(chǎn)生一個數(shù)
ada_temp=0; %初始化累加值為0
j=0;
while(ada_temp<r)
j=j+1;
ada_temp=ada_temp+adapt(j);
end
%退出循環(huán)時的j值即為被選擇的個體序號
% if j>40
% j=40;
% end
for k=1:10
new_pop(i,k)=pop(j,k);
end
end
% 最優(yōu)解復(fù)制
for i=1:10
new_pop(40,i)=best_individual(i);
end
%將選擇產(chǎn)生的新群體復(fù)制給pop種群
for i=1:40
for j=1:10
pop(i,j)=new_pop(i,j);
end
end
clear i;
clear j;
clear k;
clear r;
clear ada_temp;
end
%結(jié)果統(tǒng)計函數(shù)
plot(adapt_ave);
best=0;
for j=1:10
if best_individual(j)==1
best=best+2^(10-j);
end
end
best=best*0.0029;
'最優(yōu)個體為'
best
'最優(yōu)解為'
best=-(best-1).^2+4;
best
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -