如果我使用matlab中的GA,有没有办法将染色体中的基因限制为10000的整数倍?
我有一个类似这样的染色体{Pdg1 Pdg2 ... Pdg33}
,我需要0<=Pdgn<=400000
n=1,2..,33
和mod(Pdgn ,10000)=0
。 matlab中的GA(多目标优化算法)是否允许这样做?如果是,怎么样?
答案 0 :(得分:1)
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);