2013-03-13 35 views
1

如果我使用matlab中的遺傳算法,是否有辦法將染色體中的基因限制爲10000的整倍數?將遺傳算法染色體中的基因限制爲整倍數

我有這樣的染色體{Pdg1 Pdg2 ... Pdg33},我需要0<=Pdgn<=400000其中n=1,2..,33mod(Pdgn ,10000)=0。遺傳算法(matlab中的多目標優化問題)是否允許這樣做?如果是,如何?

回答

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:您可以使用lbub參數設置下限和上限。

mod(Pdgn ,10000)=0有不同的方法來把複雜的約束。我想最優化你是要改變你的健身功能:

f(Pdgn) where 0<=Pdgn<40000f(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);