matlab遺傳演算法實數編碼
⑴ matlab的遺傳演算法 如何調用已經訓練好的神經網路輸出
遺傳演算法優化的BP神經網路建模借鑒別人的程序做出的模擬,最近才有時間整理。
目標:
對y=x1^2+x2^2非線性系統進行建模,用1500組數據對網路進行構建網路,500組數據測試網路。由於BP神經網路初始神經元之間的權值和閾值一般隨機選擇,因此容易陷入局部最小值。本方法使用遺傳演算法優化初始神經元之間的權值和閾值,並對比使用遺傳演算法前後的效果。
步驟:
未經遺傳演算法優化的BP神經網路建模
1、 隨機生成2000組兩維隨機數(x1,x2),並計算對應的輸出y=x1^2+x2^2,前1500組數據作為訓練數據input_train,後500組數據作為測試數據input_test。並將數據存儲在data中待遺傳演算法中使用相同的數據。
2、 數據預處理:歸一化處理。
3、 構建BP神經網路的隱層數,次數,步長,目標。
4、 使用訓練數據input_train訓練BP神經網路net。
5、 用測試數據input_test測試神經網路,並將預測的數據反歸一化處理。
6、 分析預測數據與期望數據之間的誤差。
遺傳演算法優化的BP神經網路建模
1、 讀取前面步驟中保存的數據data;
2、 對數據進行歸一化處理;
3、 設置隱層數目;
4、 初始化進化次數,種群規模,交叉概率,變異概率
5、 對種群進行實數編碼,並將預測數據與期望數據之間的誤差作為適應度函數;
6、 循環進行選擇、交叉、變異、計算適應度操作,直到達到進化次數,得到最優的初始權值和閾值;
7、 將得到最佳初始權值和閾值來構建BP神經網路;
8、 使用訓練數據input_train訓練BP神經網路net;
9、 用測試數據input_test測試神經網路,並將預測的數據反歸一化處理;
10、 分析預測數據與期望數據之間的誤差。
⑵ 在matlab中如何用遺傳演算法求解函數和的最小值
該程序採用實數編碼的遺傳演算法編寫,附件1(real code ga.m)為matlab代碼。
附件2(實數編碼遺傳演算法參考資料):
http://www.math.zju.e.cn/cagd/resources/thesis/PhDthesis_ZhouMingHUa.pdf
優化結果需要修改mutate_P以及變異量的大小。因為只有一個優化變數因此編程較為簡單。
提供一個參考鏈接:http://..com/question/583959020.html?oldq=1
⑶ 如何用遺傳演算法實現多變數的最優化問題
是不是像求函數最值那樣子?建議你了解一下遺傳演算法的實數編碼,這個對於求函數最值很方便,不用像二進制那樣需要轉換。
簡單介紹一下思路:
最重要的是確定適應度函數,只要確定這個函數就很容易了,就用你不會編程,直接調用matlab的工具箱就行了。
1st.設置種群規模,並初始化種群p,並計算各個個體的適應度。
例如,20個個體,每個個體包含5個變數,x1,x2,x3,x4,x5.
如果你用matlab來編程的話,這個可以很容易實現,會用到random('unif',a,b)這個函數吧。
例如x1的取值范圍是[0,1],那麼x1=random('unif',0,1).
2nd.採用輪盤賭選出可以產生後代的父本,p_parents。
額,輪盤賭的實質就是適應度大的被選出的概率大。這個不難,但說起來比較長,你可以自己去看一下。
3rd.雜交過程的思路隨機將p_parents中的個體隨機兩兩配對,然後隨機產生一個1到n的數(n為變數的個數),設為i,交換每對父本中i之後的變數值。交換以後的p_parents成為後代p_offspring.
這里變起來有點點復雜,不過只要耐心一點,編好配對過程和交換過程。
4th.變異過程,這個比較簡單,不過需要自己把握的較好。
基本的思路是設置一個概率,例如0.05,然後產生一個隨機數如果隨機數比0.05小那麼這個變數值就要產生微小的增加或減少。
這個變異過程要歷遍p_offspring所有的變數喔。
5th.將p和p_offspring合並起來,然後選出適應度大的,重新構成一個如原始種群規模相等的種群。
⑷ 求一個基本遺傳演算法的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中遺傳演算法編程中,二進制編碼如何處理實數變數
假如你想要編碼為x,設x的范圍是【min,max】,二進制編碼長度為10,那二進解碼方式是:x*(max-min)/1023,這個不用開始編碼,開始你可以用rand(n,10)產生n個樣本的隨機數,然後優化即可。
不是能把「數學模型中的目標函數和每一條約束函數分別編程Matlab里的M文件」,是你用遺傳演算法就必須要編進去,電腦怎麼知道往哪個方向優化是好的,要不把你郵箱留下,我給你發個尋求最大值的遺傳演算法。
⑹ 遺傳演算法的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]);
⑺ 關於遺傳演算法的MATLAB實現
function [x fx string]=fun_SuiJiSuanFa2(N,genLenth,Pc,Pm,downbound,upbound,generation)
%[x fx string]=fun_SuiJiSuanFa2(6,16,0.7,0.01,-3,3,100)
%f 表示函數
%N表示染色體種群大小
%genLenth表示染色體長度
%Pc表示交叉概率
%Pm表示突變概率
%downbound
%upbound
%generation循環代數
%進制編碼,此處編寫為二進制
num=2;
initdata=randi([0 num-1],N,genLenth);
%二進制編碼的權值
weight=(num).^(genLenth/2-1:-1:0);
weights=repmat(weight,N,1);
%保存每代的最好值和平均值,
meanally=zeros(1,generation);
maxally=zeros(1,generation);
Nowx=zeros(generation,genLenth);
for k=1:generation
%解碼後的整數
allx1=sum(initdata(:,1:genLenth/2).*weights,2);
allx2=sum(initdata(:,genLenth/2+1:end).*weights,2);
%映射到取值范圍
delt=(upbound-downbound)/(num^(genLenth/2)-1);
allx1=allx1.*delt+downbound;
allx2=allx2.*delt+downbound;
%染色體的適應性
ally=f(allx1,allx2);
%平均值,最大值
meanally(k)=mean(ally);
maxally(k)=max(ally);
%找下標,確定是哪條染色體
index=find(ally==maxally(k));
Nowx(k,:)=initdata(index(1),:);
%最大值沒有提高就取上次的
if(k>=2&&maxally(k)<maxally(k-1))
maxally(k)=maxally(k-1);
Nowx(k,:)=Nowx(k-1,:);
end
%染色體的適應性比率
ratio=ally./sum(ally);
%交叉,變異
%??交叉幾個,從第幾個開始。
%此處只交叉1個(總共才6個),隨機給一個。
sumRatio=cumsum(ratio);
data=zeros(N,genLenth);
for i=1:N/2
Select1=find(sumRatio>=rand);
Select2=find(sumRatio>=rand);
data(2*i-1,:)=initdata(Select1(1),:);
data(2*i,:)=initdata(Select2(1),:);
if(rand<Pc)
%交叉
location=randi([1,genLenth]);
temp=data(2*i-1,location:end);
data(2*i-1,location:end)=data(2*i,location:end);
data(2*i,location:end)=temp;
else
%變異
if(rand<Pm)
location=randi([1,genLenth]);
data(2*i-1,location)=1-data(2*i-1,location);
end
if(rand<Pm)
location=randi([1,genLenth]);
data(2*i,location)=1-data(2*i,location);
end
end
end
initdata=data;
end
fx=max(maxally);
lastIndex=find(maxally==fx);
string=Nowx(lastIndex(1),:);
x(1)=sum(string(1:genLenth/2).*weight).*(upbound-downbound)/(num^(genLenth/2)-1)+downbound;
x(2)=sum(string(1+genLenth/2:end).*weight).*(upbound-downbound)/(num^(genLenth/2)-1)+downbound;
%繪制性能圖
%figure,hold on;
clf;figure(1),hold on;
plot((1:k)',meanally,'b.-');
plot((1:k)',maxally,'r.:');
end
function fun=f(x,y)
fun=(1-x).^2.*exp(-x.^2-(1+y).^2)-(x-x.^3-y.^3).*exp(-x.^2-y.^2);
%fun=-(x-1).^2-3.*(y-2).^2+100;
end
⑻ 我想請教一下遺傳演算法裡面的實數編碼是怎麼一回事,我在做一個多目標優化的問題,希望您能指點
說的是用函數crtrp產生初始種群吧,格式為chrom=crtrp(個體數,約束);
個體數即希望產生的初始種群數,
約束為矩陣,表示變數的取值范圍。如:[-10,-5,-3,-2;10,5,3,2]表示有四個變數,范圍分別是
[-10,10],[-5,5],[-3,3],[-2,2]。這樣就會產生一個初始種群有四列,是隨機取值。
希望有用,當然別忘了支持一下啊!互相學習。。。
⑼ matlab2008遺傳演算法工具箱採用的是二進制編碼還是實數編碼
兩種編碼都有,可以自己選擇。
你在MATLAB2008里輸入 gaoptimset
會彈出遺傳演算法的所有的設置選項及默認項。其中,第一行就是個體的編碼方式,第一行如下
PopulationType: [ 'bitstring' | 'custom' | {'doubleVector'} ]
其中,bitstring就是二進制編碼,而'doubleVector'即實數編碼(MATLAB里實數是用double雙精度浮點數表示的,精度很高。大括弧{}表示是默認設置。
而中間的'custom'是表示用戶自己構造個體的編碼形式。(參加GA算例,在美國地圖中的TSP問題,很帥~
加油,MATLAB是個好軟體~~~