如果我使用matlab中的遺傳算法,是否有辦法將染色體中的基因限制爲10000的整倍數?將遺傳算法染色體中的基因限制爲整倍數
我有這樣的染色體{Pdg1 Pdg2 ... Pdg33}
,我需要0<=Pdgn<=400000
其中n=1,2..,33
和mod(Pdgn ,10000)=0
。遺傳算法(matlab中的多目標優化問題)是否允許這樣做?如果是,如何?
如果我使用matlab中的遺傳算法,是否有辦法將染色體中的基因限制爲10000的整倍數?將遺傳算法染色體中的基因限制爲整倍數
我有這樣的染色體{Pdg1 Pdg2 ... Pdg33}
,我需要0<=Pdgn<=400000
其中n=1,2..,33
和mod(Pdgn ,10000)=0
。遺傳算法(matlab中的多目標優化問題)是否允許這樣做?如果是,如何?
gamultiobj
不支持整數約束。我通常執行標量化並使用普通的ga
。
function res = scalarizedFitness(x)
[obj1, obj2, obj3] = yourFitnessFunction(x);
%choose w1, w2, w3
res = w1 * obj1 + w2 * obj2 + w3 * obj3;
end
避免標量化的方法是寫自己的突變功能gamultiobj
。我從來沒有這樣做過。 Here是關於它的一些說明。
自從某個版本以來,ga
支持整型約束。我的2011b支持它。鍵入help ga
並查找它是否包含行X = ga(FITNESSFCN,NVARS,A,b,[],[],lb,ub,NONLCON,INTCON)
。請注意,INTCON
參數用於說明哪些參數是整數。
0<=Pdgn<=400000
:您可以使用lb
和ub
參數設置下限和上限。
mod(Pdgn ,10000)=0
有不同的方法來把複雜的約束。我想最優化你是要改變你的健身功能:
從f(Pdgn) where 0<=Pdgn<40000
到f(X) where 0<X<40 and Pdgn = X * 10000
生成的代碼可能看起來像
function result = fitnessfun(X)
Pgds = X * 10000;
result = scalarizedFitness(Pgds);
end
NVARS = 33;
%lower bounds
lb = 0 * ones(1, NVARS);
%upper bounds
ub = 40 * ones(1, NVARS);
%which variables are integers (all of them)
intcon = 1:NVARS;
result = ga(@fintessfun, NVARS, [], [], [], [], lb, ub, [], intcon);