當前位置:首頁 » 操作系統 » matlab遺傳演算法程序

matlab遺傳演算法程序

發布時間: 2022-12-06 18:38:38

㈠ 求遺傳演算法的matlab程序

function
my_ga()
options=gaoptimset;
%設置變數范圍
options=gaoptimset(options,'PopInitRange',[0;9]);
%設置種群大小
options=gaoptimset(options,'PopulationSize',100);
%設置迭代次數
options=gaoptimset(options,'Generations',100);
%選擇選擇函數
options=gaoptimset(options,'SelectionFcn',@selectionroulette);
%選擇交叉函數
options=gaoptimset(options,'CrossoverFcn',@crossoverarithmetic);
%選擇變異函數
options=gaoptimset(options,'MutationFcn',@mutationuniform);
%設置繪圖:解的變化、種群平均值的變化
options=gaoptimset(options,'PlotFcns',{@gaplotbestf});
%執行遺傳演算法,fitness.m是函數文件
[x,fval]=ga(@fitness,1,options)

㈡ MATLAB遺傳演算法

function ret=Code(lenchrom,bound)
%本函數將變數編碼成染色體,用於隨機初始化一個種群
% lenchrom input : 染色體長度
% bound input : 變數的取值范圍
% ret output: 染色體的編碼值

flag=0;
while flag==0
pick=rand(1,length(lenchrom));
ret=bound(:,1)'+(bound(:,2)-bound(:,1))'.*pick; %線性插值
flag=test(lenchrom,bound,ret); %檢驗染色體的可行性
end
function ret=Cross(pcross,lenchrom,chrom,sizepop,bound)
%本函數完成交叉操作
% pcorss input : 交叉概率
% lenchrom input : 染色體的長度
% chrom input : 染色體群
% sizepop input : 種群規模
% ret output : 交叉後的染色體

for i=1:sizepop

% 隨機選擇兩個染色體進行交叉
pick=rand(1,2);
while prod(pick)==0
pick=rand(1,2);
end
index=ceil(pick.*sizepop);
% 交叉概率決定是否進行交叉
pick=rand;
while pick==0
pick=rand;
end
if pick>pcross
continue;
end
flag=0;
while flag==0
% 隨機選擇交叉位置
pick=rand;
while pick==0
pick=rand;
end
pos=ceil(pick.*sum(lenchrom)); %隨機選擇進行交叉的位置,即選擇第幾個變數進行交叉,注意:兩個染色體交叉的位置相同
pick=rand; %交叉開始
v1=chrom(index(1),pos);
v2=chrom(index(2),pos);
chrom(index(1),pos)=pick*v2+(1-pick)*v1;
chrom(index(2),pos)=pick*v1+(1-pick)*v2; %交叉結束
flag1=test(lenchrom,bound,chrom(index(1),:)); %檢驗染色體1的可行性
flag2=test(lenchrom,bound,chrom(index(2),:)); %檢驗染色體2的可行性
if flag1*flag2==0
flag=0;
else flag=1;
end %如果兩個染色體不是都可行,則重新交叉
end
end
ret=chrom;

clc
clear all
% warning off

%% 遺傳演算法參數
maxgen=50; %進化代數
sizepop=100; %種群規模
pcross=[0.6]; %交叉概率
pmutation=[0.1]; %變異概率
lenchrom=[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)= (x(1)*exp(-(x(1)^2 + x(2)^2)));
%-20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)+20+2.71289
% 這個是我的測試函數
% 如果有這個函數的話,可以得到最優值

end
%找最好的染色體
[bestfitness bestindex]=min(indivials.fitness);
bestchrom=indivials.chrom(bestindex,:); %最好的染色體
avgfitness=sum(indivials.fitness)/sizepop; %染色體的平均適應度
% 記錄每一代進化中最好的適應度和平均適應度
trace=[];

%% 進化開始
for i=1:maxgen

% 選擇操作
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)=(x(1)*exp(-(x(1)^2 + x(2)^2)));
%-20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)+20+2.71289
% -20*exp(-0.2*sqrt((x(1)^2+x(2)^2)/2))-exp((cos(2*pi*x(1))+cos(2*pi*x(2)))/2)+20+2.71289;

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);
figure
plot([1:r]',trace(:,1),'r-',[1:r]',trace(:,2),'b--');
title(['函數值曲線 ' '終止代數=' num2str(maxgen)],'fontsize',12);
xlabel('進化代數','fontsize',12);ylabel('函數值','fontsize',12);
legend('各代平均值','各代最佳值','fontsize',12);
ylim([-0.5 5])
disp('函數值 變數');
% 窗口顯示
disp([bestfitness x]);

㈢ matlab,遺傳演算法,求大佬幫忙

用遺傳演算法求最大值問題,可以這樣來解決。

1、將最大值問題轉換為最小值問題,即 max Z =- min Z;

2、建立其自定義函數,即

z=-(f1*40^1.5/1+f2*30^1.5/2+f2*20^1.5/2+。。。+f12*127^1.5/2+f12*5^1.5/4)

其中:f1,f2,f3,。。。f11,f12為0,1變數,可以用sign()符號函數來處理。

3、用遺傳演算法ga()函數求解,使用方法

[email protected]_func;

nvars=12;

[x, fval] =ga(objectivef,nvars)

4、編程運行後得到

f1=1,f2=1,f3=1,f4=0,f5=1,f6=0,f7=1,f8=1,f9=1,f10=1,f11=1,f12=1

Zmax=27329.5018

㈣ matlab遺傳演算法程序

在matlab里沒有
for
i
=
1
to
80
...
endfor
這樣的語法的
在matlab里應該是:
for
i
=
1:
1:
80
...
end
1:1:80
第一個1是初始值,第二個是每次+1的意思
當然如果是我古若寡聞那也請見諒~~哈哈~~

㈤ matlab的遺傳演算法程序

MaxGenerations,是迭代次數,是用循環語句實現的,如果求解空間不大,改小點就好,population 是每次迭代的並行運算數量。我個人在求解中發現,該值對結果影響較大,一般不要改變。crossoverfraction,變異系數,與運算復雜度無關。 如果程序運行時間很長,檢查一下是不是你把遺傳演算法又放入另一層循環了,一般這樣運算時間就會呈現指數級增長。如果這樣,就修改演算法。

㈥ 求一個基本遺傳演算法的MATLAB代碼

我發一些他們的源程序你,都是我在文獻中搜索總結出來的:
%
下面舉例說明遺傳演算法
%
%
求下列函數的最大值
%
%
f(x)=10*sin(5x)+7*cos(4x)
x∈[0,10]
%
%

x
的值用一個10位的二值形式表示為二值問題,一個10位的二值數提供的解析度是每為
(10-0)/(2^10-1)≈0.01

%
%
將變數域
[0,10]
離散化為二值域
[0,1023],
x=0+10*b/1023,
其中
b

[0,1023]
中的一個二值數。
%
%
%
%--------------------------------------------------------------------------------------------------------------%
%--------------------------------------------------------------------------------------------------------------%
%
編程
%-----------------------------------------------
%
2.1初始化(編碼)
%
initpop.m函數的功能是實現群體的初始化,popsize表示群體的大小,chromlength表示染色體的長度(二值數的長度),
%
長度大小取決於變數的二進制編碼的長度(在本例中取10位)。
%遺傳演算法子程序
%Name:
initpop.m
%初始化
function
pop=initpop(popsize,chromlength)
pop=round(rand(popsize,chromlength));
%
rand隨機產生每個單元為
{0,1}
行數為popsize,列數為chromlength的矩陣,
%
roud對矩陣的每個單元進行圓整。這樣產生的初始種群。
%
2.2.2
將二進制編碼轉化為十進制數(2)
%
decodechrom.m函數的功能是將染色體(或二進制編碼)轉換為十進制,參數spoint表示待解碼的二進制串的起始位置
%
(對於多個變數而言,如有兩個變數,採用20為表示,每個變數10為,則第一個變數從1開始,另一個變數從11開始。本例為1),
%
參數1ength表示所截取的長度(本例為10)。
%遺傳演算法子程序
%Name:
decodechrom.m
%將二進制編碼轉換成十進制
function
pop2=decodechrom(pop,spoint,length)
pop1=pop(:,spoint:spoint+length-1);
pop2=decodebinary(pop1);
%
2.4
選擇復制
%
選擇或復制操作是決定哪些個體可以進入下一代。程序中採用賭輪盤選擇法選擇,這種方法較易實現。
%
根據方程
pi=fi/∑fi=fi/fsum
,選擇步驟:
%
1)
在第
t
代,由(1)式計算
fsum

pi
%
2)
產生
{0,1}
的隨機數
rand(
.),求
s=rand(
.)*fsum
%
3)

∑fi≥s
中最小的
k
,則第
k
個個體被選中
%
4)
進行
N
次2)、3)操作,得到
N
個個體,成為第
t=t+1
代種群
%遺傳演算法子程序
%Name:
selection.m
%選擇復制
function
[newpop]=selection(pop,fitvalue)
totalfit=sum(fitvalue);
%求適應值之和
fitvalue=fitvalue/totalfit;
%單個個體被選擇的概率
fitvalue=cumsum(fitvalue);
%如
fitvalue=[1
2
3
4],則
cumsum(fitvalue)=[1
3
6
10]
[px,py]=size(pop);
ms=sort(rand(px,1));
%從小到大排列
fitin=1;
newin=1;
while
newin<=px
if(ms(newin))
評論
0
0
載入更多

㈦ Matlab遺傳演算法「選擇」的程序一小段,求解

function u1=select(u)
%u是輸入,u1是輸出
%選擇函數
%從i等於1到10計算適應度函數賦值給y
for i=1:10
y(i)=syd(u(i,:));
end
%求y的和
F=sum(y);
%並將適應度函數賦值除以他的和
P=y/F;
s=0;
%Q為累計概率
for i=1:10
s=s+P(i);
Q(i)=s;
end
%找到y中的最大值的值m和位置I
[m,I]=max(y);
取輸入的u總I的解賦值給u1中第9個解的位置
u1(9,:)=u(I,:);
取輸入的u總I的解賦值給u1中第10個解的位置
u1(10,:)=u(I,:);
%得到一個8行1列的隨機數(0-1之間)
r=rand(8,1);
%對應i等於1到8
for i=1:8
%如果r的第i個隨機數小於Q的第一個值
if r(i)<Q(1)
%u的第一個解賦值給u1的第i個解
u1(i,:)=u(1,:);
%否則如果r的第i個隨機數大於Q的第一個值,並且r的第i個隨機數大於Q的第二個值
elseif r(i)>=Q(1)& r(i)<Q(2)
%u的第二個解賦值給u1的第i個解
u1(i,:)=u(2,:);
elseif r(i)>=Q(2)& r(i)<Q(3)
u1(i,:)=u(3,:);
elseif r(i)>=Q(3)& r(i)<Q(4)
u1(i,:)=u(4,:);
elseif r(i)>=Q(4)&r(i)<Q(5)
u1(i,:)=u(5,:);
elseif r(i)>=Q(5)&r(i)<Q(6)
u1(i,:)=u(6,:);
elseif r(i)>=Q(6)&r(i)<Q(7)
u1(i,:)=u(7,:);
elseif r(i)>=Q(7)&r(i)<Q(8)
u1(i,:)=u(8,:);
elseif r(i)>=Q(8)&r(i)<Q(9)
u1(i,:)=u(9,:);
else
u1(i,:)=u(10,:);
end
end

㈧ 求MATLAB編遺傳演算法的程序

figure(1);
fplot('variable.*sin(10*pi*variable)+2.0',[-1,2]);
NIND=40;
MAXGEN=25;
PRECI=20;
GGAP=0.9;
trace=zeros(2,MAXGEN);
FieldD=[20;-1;2;1;0;1;1];
Chrom=CRTBP(NIND,PRECI);
gen=0;
variable=BS2RV(Chrom,FieldD);
ObjV=variable.*sin(10*pi*variable)+2.0;
while gen<MAXGEN,
FitnV=ranking(-ObjV);
SelCh=SELECT('SUS',Chrom,FitnV,GGAP);
SelCh=RECOMBIN('XOVSP',SelCh,0.7)
SelCh=MUT(SelCh);
variable=BS2RV(SelCh,FieldD);
ObjVSel=variable.*sin(10*pi*variable)+2.0;
[Chrom,ObjV]=REINS(Chrom,SelCh,1,1,ObjV,ObjVSel);
gen=gen+1;
[Y,I]=max(ObjV),hold on;
plot(variable(I),Y,'bo');
trace(1,gen)=max(ObjV);
trace(2,gen)=sum(ObjV)/length(ObjV);
end
variable=BS2RV(Chrom,FieldD);
hold on;
grid;
plot(variable',ObjV','b*');
figure(2);
plot(trace(1,:)');
hold on;
plot(trace(2,:)','-.');
grid;
看看這個能用得上么
I never think of the future. It comes soon enough.

㈨ MATLAB遺傳演算法編程(多目標優化)

多目標是通過分布性 和非劣解來進行評價的

㈩ 遺傳演算法的matlab代碼實現是什麼

遺傳演算法我懂,我的論文就是用著這個演算法,具體到你要遺傳演算法是做什麼?優化什麼的。。。我給你一個標准遺傳演算法程序供你參考:
該程序是遺傳演算法優化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]);

熱點內容
螢石雲存儲關閉 發布:2023-01-29 11:01:36 瀏覽:580
sql讀寫分離 發布:2023-01-29 11:01:34 瀏覽:567
查詢雲伺服器訪問的ip 發布:2023-01-29 11:01:20 瀏覽:258
植物圖像資料庫 發布:2023-01-29 10:59:51 瀏覽:649
snkrs為什麼安卓永不了 發布:2023-01-29 10:54:49 瀏覽:943
linux防篡改 發布:2023-01-29 10:53:49 瀏覽:206
qt音樂播放器源碼 發布:2023-01-29 10:50:35 瀏覽:794
cc2541編程 發布:2023-01-29 10:44:42 瀏覽:988
華為哪個型號不同配置相同 發布:2023-01-29 10:43:05 瀏覽:298
ave編程 發布:2023-01-29 10:42:09 瀏覽:413