MATLAB遗传算法约束(所有变量在二进制环境中不能同时为零)

时间:2017-04-01 22:14:22

标签: matlab optimization genetic-algorithm

我正在使用MATLAB ga函数来解决我的优化问题。在我的问题中,我有一些决策变量是整数(0和1:我为它指定了下限,上限和IntCon)加上两个继续变量。否则,所有整数变量不能同时为零,所以至少我们需要整数中的单个“一”变量。如何在MATLAB中实现提到的约束?

1 个答案:

答案 0 :(得分:1)

这是一个混合整数优化问题,它可以在MATLAB中使用ga来解决。如文档中所述:ga can solve problems when certain variables are integer-valued.并非所有变量都是某些变量。所以你应该在其他整数中至少有一个实变量。

Whit IntCon选项,您可以指定哪些变量是整数,例如IntCon=[1 3]表示您的第一个和第三个变量是整数。为了避免两个整数变量同时为0,我认为你可以添加一些不等式约束。

例如,请看以下示例:

假设我们希望找到具有5变量的Ackley函数的最佳值(例如,在5维中)[x(1)...x(5)],并假设第一个和第三个变量x(1)x(3)是整数。我们可以编写以下脚本:

nVar = 5;               
lb = -5*ones(1,nVar);   % define the upper bound
ub = 5*ones(1,nVar);    % define the lower bound
rng(1,'twister')        % for reproducibility
opts = optimoptions('ga','MaxStallGenerations',50,'FunctionTolerance',1e-3,'MaxGenerations',300);
[x,~,~] = ga(@ackleyfcn,nVar,[],[],[],[],lb,ub,[],[1 3],opts);
disp('solution:');disp(x)

在我的机器上,我得到了这个解决方案:

solution:
                   0  -0.000000278963321                   0   0.979067345808285  -0.000000280775000

可以看出x(1)x(3)是整数,0。现在让我们说,正如你所提到的,它们不能同时0,如果一个是0,则另一个应该是1。这里Ackley问题的边界允许变量在由下限和上限定义的范围内。但是,在您的情况下,对于两个整数变量,下限和上限应定义为[0][1]

现在我想避免两个变量都是0,所以我可以编写以下线性不等式约束:

% x(1) + x(3) >= 1  
% x(1) >= 0 
% x(3) > 0

这些不平等应以Ax <= b形式写出:

A = [-1 0 -1 0 0
    -1 0 0 0 0
    0 0 -1 0 0];
b = [-1
    0
    0];

现在,如果我们再次运行优化问题,我们会看到约束对输出的影响:

[x,~,~] = ga(@ackleyfcn,nVar,A,b,[],[],lb,ub,[],[1 3],opts);
disp('solution');disp(x)


solution
   1.000000000000000  -0.000005031565831                   0  -0.000011740569861   0.000008060759466