MATLAB ga()忽略用户提供的初始填充

时间:2014-05-15 02:32:16

标签: matlab constraints genetic-algorithm constraint-programming

我正在尝试使用MATLAB ga()函数解决优化问题。

我会尽量做到尽可能简短。它基本上是一个最小二乘拟合问题,我操纵一些输入来尝试匹配目标函数。这个问题有40个变量。存在约束约束,线性等式,线性不等式和非线性约束。

在我让MATLAB选择初始人口之前,结果很差。我觉得这是由于MATLAB的选择缺乏多样性。所以我编写了一个函数来创建一个满足除非线性约束之外的所有约束的初始种群(这些是在模拟后计算的)。

我用谷歌搜索,在MATLAB中央交流中只发现了一个涉及同一主题的问题,它是从2007年开始的,从未得到解决。

以下是可能存在问题的代码部分。我很抱歉它太大了,但我认为它的布局非常合乎逻辑。我正在使用ga(问题),这段代码的大部分内容只是列出了所有约束。

ineq_con_tau_LB = [zeros(1,nInjections) zeros(1,nInjections) tau_LB/60/1e6  tau_LB/60/1e6  tau_LB/60/1e6 0]
ineq_con_tau_UB = [zeros(1,nInjections) zeros(1,nInjections) 0 0 -tau_UB/60/1e6 0]
problem_structure.Aineq = [ineq_con_tau_LB; ineq_con_tau_UB];
problem_structure.bineq = [nInjections*CP.reactorVolume;-nInjections*CP.reactorVolume];


    eq_con_antisolvent =  [ones(1,nInjections) zeros(1,nInjections) -1  0 0 0];
    eq_con_puresolvent = [zeros(1,nInjections)  ones(1,nInjections)  0 -1 0 0];
    problem_structure.Aeq = [eq_con_antisolvent; eq_con_puresolvent];
    problem_structure.beq = [0 0]';

    %Upper and lower bounds.
    Atotal_min = 10; Atotal_max = 1000;
    Stotal_min = 10; Stotal_max = 1000;
    Vfeed_min = 10; Vfeed_max = 1000;
    ypercent_min = 0.02;
    ypercent_max = 0.07;

    problem_structure.lb = [     zeros(1,nInjections)      zeros(1,nInjections) Atotal_min Stotal_min Vfeed_min ypercent_min];
    problem_structure.ub = [repmat(inf,1,nInjections) repmat(inf,1,nInjections) Atotal_max Stotal_max Vfeed_max ypercent_max];


    problem_structure.nonlcon = @constr;
    problem_structure.nvars = 2*nInjections + 4;    
    problem_structure.fitnessfcn = @objfun;
    problem_structure.intcon = [];
    populationsize = 5;
    gapop = dissolution_optimization_initialpop(populationsize,nInjections,problem_structure.Aineq, ...
                                                                           problem_structure.bineq, ...
                                                                            problem_structure.lb(:), ...
                                                                            problem_structure.ub(:), ...
                                                                             tau_LB, ...
                                                                             tau_UB, ...
                                                                             ypercent_min, ...
                                                                             ypercent_max);

    problem_structure.options  = gaoptimset('Generations', 25,...
                              'PopulationSize',populationsize, ...
                              'InitialPopulation',gapop, ...
                              'OutputFcn', @sse_outputfcn, ...
                              'MutationFcn', {@mutationadaptfeasible});
    problem_structure.options  
    save('gapop_save','gapop')
    [x,fval,exitflag,output] = ga(problem_structure)

可以提供的任何帮助非常感谢。请帮忙! :(((

2 个答案:

答案 0 :(得分:1)

如果发生这种情况,首先要做的是检查并确保初始填充不违反边界,线性或等式约束。 Matlab将忽略不满足这些约束条件的初始种群成员。

安德鲁

答案 1 :(得分:0)

感谢您的帮助。

我实际上是在不久前自己解决了这个问题,你是对的。初始人口没有遵循约束条件。

或者说,他们并没有按照matlab GA的要求精确地遵守它们。限制在1e-15内得到满足。但这仍然不够好,MATLAB会拒绝那些样本,除非这些等值是死的“0”。