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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

在matlab中intcon什么意思,GADST,你为何这么叼?(一)

發(fā)布時(shí)間:2025/3/15 循环神经网络 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在matlab中intcon什么意思,GADST,你为何这么叼?(一) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一周前,我的遺傳算法在數(shù)值優(yōu)化上再次失敗。在此之前我嘗試過遺傳算法結(jié)合局部搜索(隨機(jī)爬山、SQP、模式搜索),由于INTJ型人格認(rèn)為結(jié)合局部信息的進(jìn)化不是好進(jìn)化,轉(zhuǎn)而嘗試了其他的方法:小生境技術(shù)(niching),以適應(yīng)度共享的手段來維持種群的多樣性——在某些函數(shù)上取得了極好的效果,而參數(shù)的自適應(yīng)控制卻非常困難;多種群技術(shù)(MPGA)——由于我的遷徙算法錯(cuò)誤使得我的程序本質(zhì)上就是用不同的控制參數(shù)進(jìn)行多次計(jì)算;正交技術(shù)(OGA),通過構(gòu)造正交矩陣,使得在初始化種群和產(chǎn)生子代時(shí)能夠均勻搜索整個(gè)解空間——在幾個(gè)測試函數(shù)上都取得了不錯(cuò)的成果,但是后來我意識(shí)到這明明就是帶啟發(fā)式策略的網(wǎng)格搜索(grid

search),以及在一次離散事件仿真模擬的優(yōu)化上得到了很糟糕的結(jié)果,加上計(jì)算開銷大、運(yùn)算速度慢,很快被我打入冷宮。再加上遺傳算法在集合覆蓋問題、TSP、Packing問題上令我蛋疼的表現(xiàn),一度我對(duì)遺傳算法的態(tài)度是“雞肋,還不如用分支定界”,轉(zhuǎn)而研究傳統(tǒng)優(yōu)化算法——序列二次規(guī)劃(sequential

quadratic programming,SQP),在組合優(yōu)化上也開始關(guān)注遺傳算法結(jié)合回溯搜索。

由于在五月份的對(duì)仿真模擬的優(yōu)化問題上,我使用的NPMEA算法在處理帶約束的問題上讓我印象深刻(之前我只用著名的G8函數(shù)做過測試),上周我懷著極大的信心采用它的單純形交叉算子和自適應(yīng)的高斯變異來做無約束優(yōu)化(或者說是bound

constraint),但令人失望的是在某個(gè)五元函數(shù)上幾乎連全局最優(yōu)點(diǎn)的附近都搜索不到,增加了多種群和小生境運(yùn)算速度又太慢,實(shí)在令人垂頭喪氣。

最后我抱著死馬當(dāng)活馬醫(yī)的態(tài)度打開gatool——我對(duì)這東西從來不屑一顧的,花里胡哨,不如自己coding來得快——結(jié)果太可怕了,一切參數(shù)采用默認(rèn)設(shè)置,Schaffer函數(shù)以1的概率收斂到全局最優(yōu),顛覆三觀!!我當(dāng)時(shí)又是失落又是激動(dòng),心里只有兩個(gè)字:“GADST,你為何這么叼?”一怒之下,把GADST的ga.m拆了,恍然大悟。

二、拆ga.m

step1:ga.m設(shè)置默認(rèn)defaultopt

%-----------------------------e.g.---------------------------------

%代碼取自ga.m 181th~202th rows

%默認(rèn)編碼類型為雙精度編碼

%默認(rèn)生成初始種群向量下界為0上界為1

%默認(rèn)種群大小為20

%默認(rèn)使用gacreationuniform函數(shù)來生成均勻隨機(jī)分布的初始種群

defaultopt = struct('PopulationType', 'doubleVector', ...

'PopInitRange', [0;1],

...

'PopulationSize', 20,

...

'CreationFcn',@gacreationuniform);

step2:ga.m作各種檢查和判斷

%-----------------------------e.g.---------------------------------

%代碼取自ga.m 251th~277th rows

%檢查第十個(gè)輸入變量,若存在且是結(jié)構(gòu)體,則為整數(shù)約束規(guī)劃

if nargin == 10 &&

isstruct(intcon)

options = intcon;

intcon = [];

end

%檢查輸入的FitnessFcn是不是function handles或者inlines,若不是則返回error

if isempty(FitnessFcn) ||

~(isa(FitnessFcn,'inline') ||

isa(FitnessFcn,'function_handle'))

error(message('globaloptim:ga:needFunctionHandle'));

end

step3:ga.m對(duì)空的options結(jié)構(gòu)域使用默認(rèn)defaultopt

%-----------------------------e.g.---------------------------------

%代碼取自ga.m 304th~308th rows

%若options為空,則使用默認(rèn)的defaultopt

if ~isempty(options) &&

~isa(options,'struct')

error(message('globaloptim:ga:optionsNotAStruct'));

elseif isempty(options)

options =

defaultopt;

end

step4:ga.m調(diào)用子函數(shù)gacommon判斷問題類型和種群編碼類型

%-----------------------------e.g.---------------------------------

%代碼取自gacommon.m

14th~33th rows

%若結(jié)構(gòu)體nonlcon非空則為非線性約束規(guī)劃,若線性等式約束矩陣非空則為線性約束規(guī)劃,若上下界矩陣非空

%則為邊界約束規(guī)劃,若都為空則為無約束規(guī)劃

if ~isempty(nonlcon)

type =

'nonlinearconstr';

elseif ~isempty(Aeq) || ~isempty(beq) || ~isempty(Aineq) ||

~isempty(bineq)

type =

'linearconstraints';

elseif ~isempty(lb) || ~isempty(ub)

type =

'boundconstraints';

else

type =

'unconstrained';

end

step5:ga.m對(duì)不同類型的問題調(diào)用不同子求解器

%-----------------------------e.g.---------------------------------

%代碼取自ga.m 349th~359th rows

%'unconstrained'調(diào)用無約束規(guī)劃求解器gaunc,'boundconstraints'和'linearconstraints'調(diào)用線性規(guī)劃求解

%器galincon,'nonlinearconstr'調(diào)用非線性規(guī)劃求解器gacon。

switch (output.problemtype)

case

'unconstrained'

[x,fval,exitFlag,output,population,scores] =

gaunc(FitnessFcn,nvars, ...

options,output,Iterate);

case

{'boundconstraints', 'linearconstraints'}

[x,fval,exitFlag,output,population,scores] =

galincon(FitnessFcn,nvars, ...

Aineq,bineq,Aeq,beq,lb,ub,options,output,Iterate);

case

'nonlinearconstr'

[x,fval,exitFlag,output,population,scores] =

gacon(FitnessFcn,nvars, ...

Aineq,bineq,Aeq,beq,lb,ub,NonconFcn,options,output,Iterate,type);

end

(下面以boundconstraints為例,調(diào)用galincon)

step6:在galincon.m中調(diào)用子函數(shù)makeState來初始化結(jié)構(gòu)數(shù)組state

%-----------------------------e.g.---------------------------------

%代碼取自makeState.m 10th~30th rows

%初始化當(dāng)前進(jìn)化代數(shù)和當(dāng)前停止代數(shù)

state.Generation = 0;

state.LastImprovement = 1;

%調(diào)用options.CreationFcn里的函數(shù)來生成初始種群,見step7

state.Population =

feval_r(options.CreationFcn,GenomeLength,FitnessFcn,options,

options.CreationFcnArgs{:});

(下面以默認(rèn)的gacreationuniform函數(shù)為例,生成初始種群)

step7:在gacreationuniform.m里通過用戶提供的初始種群和初始種群范圍來隨機(jī)生產(chǎn)種群

%-----------------------------e.g.---------------------------------

%代碼取自gacreationuniform.m 42th~46th rows

%在PopInitRange范圍內(nèi)生成均勻分布的隨機(jī)初始種群

%等價(jià)于Population=

unifrnd(lb,ub,initPopProvided+1,PopSize);

range = options.PopInitRange;

lowerBound = range(1,:);

span = range(2,:) - lowerBound;

Population(initPopProvided+1:end,:) =

repmat(lowerBound,individualsToCreate,1) + ...

repmat(span,individualsToCreate,1) .*

rand(individualsToCreate,GenomeLength);

step8:在galincon.m中調(diào)用子函數(shù)gadsplot繼續(xù)初始化結(jié)構(gòu)數(shù)組state,為作圖做準(zhǔn)備

略..

step9:在galincon.m中判斷是否滿足進(jìn)化結(jié)束條件,若不滿足則進(jìn)化一次

%-----------------------------e.g.---------------------------------

%代碼取自galincon.m 48th~91th rows

while isempty(exitFlag)

%進(jìn)化代數(shù)加一

state.Generation =

state.Generation + 1;

%函數(shù)stepGA內(nèi)完成排序\選擇\交叉\變異和種群的進(jìn)化,見step10

[score,population,state]

=

stepGA(score,population,options,state,GenomeLength,FitnessFcn);

%記錄最佳個(gè)體

best =

min(state.Score);

generation =

state.Generation;

state.Best(generation) =

best;

%判斷和進(jìn)行遷徙操作(僅針對(duì)多種群)

state =

migrate(FitnessFcn,GenomeLength,options,state);

%更新圖像輸出

state =

gadsplot(options,state,currentState,'Genetic Algorithm');

end

step10:stepGA.m產(chǎn)生精英后代、交叉后代和變異后代

%-----------------------------e.g.---------------------------------

%代碼取自stepGA.m 9th~36th rows

%精英后代數(shù)目

nEliteKids = options.EliteCount;

%交叉后代數(shù)目

nXoverKids = round(options.CrossoverFraction *

(size(thisPopulation,1) - nEliteKids));

%變異后代數(shù)目

nMutateKids = size(thisPopulation,1) - nEliteKids -

nXoverKids;

%用于產(chǎn)生交叉和變異所需的父代數(shù)目

nParents = 2 * nXoverKids + nMutateKids;

%適應(yīng)度排序操作,見step11

state.Expectation =

feval_r(options.FitnessScalingFcn,thisScore,nParents,...

options.FitnessScalingFcnArgs{:});

%選擇交叉和變異所需的后代,見step12

parents =

feval_r(options.SelectionFcn,state.Expectation,nParents,options,...

options.SelectionFcnArgs{:});

[unused,k] = sort(thisScore);

%產(chǎn)生精英后代

eliteKids ?=

thisPopulation(k(1:options.EliteCount),:);

%產(chǎn)生交叉后代,見step13

xoverKids ?= feval_r(options.CrossoverFcn,

parents(1:(2 * nXoverKids)),options,GenomeLength,...

FitnessFcn,thisScore,thisPopulation,options.CrossoverFcnArgs{:});

%產(chǎn)生交叉后代,見step14

mutateKids = feval_r(options.MutationFcn,

parents((1 + 2 * nXoverKids):end),

options,GenomeLength,

FitnessFcn,state,thisScore,thisPopulation,options.MutationFcnArgs{:});

step11:在stepGA.m中調(diào)用options.FitnessScalingFcn中的適應(yīng)度排序函數(shù)進(jìn)行適應(yīng)度排序操作

這里用默認(rèn)的fitscalingrank函數(shù)

%-----------------------------e.g.---------------------------------

%代碼取自fitscalingrank.m 16th~21th rows

%expectation將score映射到從1開始的整數(shù)的平方根的倒數(shù),并作比例處理

[~,i] = sort(scores);

expectation = zeros(size(scores));

expectation(i) = 1 ./ ((1:length(scores)) ?.^

0.5);

expectation = nParents * expectation ./

sum(expectation);

step12:在stepGA.m中調(diào)用options.SelectionFcn中的選擇函數(shù),根據(jù)各父代的適應(yīng)度選出參與交叉變異的父代。

這里用默認(rèn)的selectionstochunif函數(shù)

%-----------------------------e.g.---------------------------------

%代碼取自selectionstochunif.m 22th~44th rows

%對(duì)expectation累計(jì)求和及對(duì)[0,1]等分為stepSize后,position從第一等分的任意位置開始,找到第一個(gè)大于

%position的wheel的索引作為選出的一個(gè)子代,position前進(jìn)一個(gè)stepSize

wheel = cumsum(expectation) / nParents;

stepSize = 1/nParents;

position = rand * stepSize;

lowest = 1;

for i = 1:nParents % for each parent needed,

for j =

lowest:length(wheel)

if(position <

wheel(j))

parents(i)

= j;

lowest =

j;

break;

end

end

position = position +

stepSize;

end

step13:在stepGA.m中調(diào)用options.CrossoverFcn中的交叉函數(shù),產(chǎn)生交叉后代。

這里用默認(rèn)的selectionstochunif函數(shù)

%-----------------------------e.g.---------------------------------

%代碼取自crossoverscattered.m 42th~48th rows

%對(duì)子代的每個(gè)位置,取[0,1]隨機(jī)數(shù),若隨機(jī)數(shù)大于0.5則取父代A對(duì)應(yīng)位置的數(shù),反之取父代B

for j = 1:GenomeLength

if(rand >

0.5)

xoverKids(i,j) = thisPopulation(r1,j);

else

xoverKids(i,j) = thisPopulation(r2,j);

end

end

step14:在stepGA.m中調(diào)用options.MutationFcn中的變異函數(shù),讓選出的父代變異產(chǎn)生后代。

MATLAB默認(rèn)的mutationadaptfeasible函數(shù)采用了復(fù)雜的算法來確定變異的搜索方向(search

directions)

%-----------------------------e.g.---------------------------------

%代碼簡化自mutationadaptfeasible.m 58th~126th rows

%MeshSize是自適應(yīng)網(wǎng)格步長,和模式搜索類似,當(dāng)遺傳算法進(jìn)化一代搜索到更優(yōu)解時(shí)步長擴(kuò)大為四倍,反之縮

%小為四分之一

%注意到MeshSize = 2^(-4^k),可知pollParam一定為整數(shù)

pollParam = 1/sqrt(MeshSize);

%等價(jià)于lowerT?=?tril(unidrnd(pollParam,?nGenome,?nGenome));

lowerT = tril((round((pollParam+1)*rand(nGenome) -

0.5)),-1);

%等價(jià)于diagtemp = unidrnd(2*pollParam,?nGenome)

-?pollParam;

diagtemp = pollParam*sign(rand(nGenome,1) - 0.5);

diagT ?= diag(diagtemp);

Basis = lowerT + diagT;

order = randperm(nGenome);

%方陣Basis每一列決定一個(gè)搜索方向向量

Basis = Basis(order,order);

%隨機(jī)取搜索方向向量和方向符號(hào)來生成后代

indexVec = [1:nGenome 1:nGenome];

dirSign = [ones(1,nGenome) -ones(1,nGenome)];

OrderVec = randperm(2*nGenome);

for jj = 1:2*nGenome

direction =

dirSign(jj).*Basis(:,indexVec(OrderVec(jj)));

mutant = Parent(ii,:) +

MeshSize*direction';

%若生成后代滿足約束則不再搜索其他方向

if all(mutant

>= lb & mutant <=

ub)

Kid(ii,:) = mutant;

break;

else

Kid(ii,:) = Parent(ii,:);

end

end

總結(jié)

以上是生活随笔為你收集整理的在matlab中intcon什么意思,GADST,你为何这么叼?(一)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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