MATLAB遗传算法约束(二进制环境下所有变量不能同时为零)
MATLAB genetic algorithm constraint (all variables can't be zero at the same time in a binary environment)
我正在使用 MATLAB ga
函数来解决我的优化问题。在我的问题中,我有一些决策变量是整数(0 和 1:我为其指定了下限、上限和 IntCon
)加上两个连续变量。否则,所有整数变量不可能同时为零,所以至少,我们需要整数中的单个 "one" 变量。如何在 MATLAB 中实现上述约束?
这是一个混合整数优化问题,可以在 MATLAB 中使用 ga
求解。如文档中所述:ga can solve problems when certain variables are integer-valued.
不是所有变量,而是某些变量。所以你应该在其他整数中至少有一个实变量。
Whit IntCon
选项,你可以指定哪些变量是整数,比如IntCon=[1 3]
表示你的第一个和第三个变量是整数。为了避免两个整数变量同时为 0
,我认为您可以添加一些不等式约束。
例如看下面的例子:
假设我们想用 5
个变量(例如在 5 个维度)[x(1)...x(5)]
找到 Ackley 函数的最佳值,并假设第一个和第三个变量 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
我正在使用 MATLAB ga
函数来解决我的优化问题。在我的问题中,我有一些决策变量是整数(0 和 1:我为其指定了下限、上限和 IntCon
)加上两个连续变量。否则,所有整数变量不可能同时为零,所以至少,我们需要整数中的单个 "one" 变量。如何在 MATLAB 中实现上述约束?
这是一个混合整数优化问题,可以在 MATLAB 中使用 ga
求解。如文档中所述:ga can solve problems when certain variables are integer-valued.
不是所有变量,而是某些变量。所以你应该在其他整数中至少有一个实变量。
Whit IntCon
选项,你可以指定哪些变量是整数,比如IntCon=[1 3]
表示你的第一个和第三个变量是整数。为了避免两个整数变量同时为 0
,我认为您可以添加一些不等式约束。
例如看下面的例子:
假设我们想用 5
个变量(例如在 5 个维度)[x(1)...x(5)]
找到 Ackley 函数的最佳值,并假设第一个和第三个变量 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