mathematical-optimization - AMPL 难以使用 "count"从约束编写目标

标签 mathematical-optimization linear-programming solver cplex ampl

我正在尝试解决 AMPL 中的一个小问题,但我遇到了一个困难,我无法将其转化为约束。问题是: 假设我有 3 组 ABC。我想将 A 中的元素链接到 B 中的元素,这样 A 中不超过 2 个元素链接到 B 中的单个元素>B 如果它们存在于 C 的 1 个子集中(C 任何子集中的 3 个元素中最多有 2 个元素链接到 中的 1 个元素) B)。 我已经完成了这部分

假设我写了这个约束:

subject to constr {(i,j,k) in C, b in B}: x[i,b] + x[j,b] + x[k,b] <= 2;

我希望代码的目标是最大化 {(i,j,k) in C, b in B}: x[i,b] + x[j,b] + x[k,b] <= 1; 的情况

或者换句话说,尽量减少以下情况:

{(i,j,k) in C, b in B}: x[i,b] + x[j,b] + x[k,b] = 2;

我该如何写这个目标?如果我想要 (约束为 = 2 ) <= 为常量(例如 MAX)的次数,我该如何做到这一点?下面是我到目前为止编写的代码。我正在使用 AMPL 学生版和 cplex 学生版。感谢您的帮助,并提前致谢。

set A;
set B;
set C within A cross A cross A;
param constant:= 5;
var x{A,B} binary;
subject to constr1 {(i,j,k) in C, b in B}: x[i,b]  + x[j,b] + x[k,b] <= 2;
subject to onlyOneLinkForEachElementInA {a in A}: sum{b in B} x[a,b] = 1;
data;
set A:= 0 a b c d e f;  #note that 0 is used only to pad the subsets and force them to have dimension of 3
set B:= 1 2 3;
set C: 0 a b c d e f:=
(a,b,c) (a,c,0) (c,d,0) (e,f,b) (a,b,0) (f,b,0);
solve;
for {i in A :i!=0} { printf "%s\t",i;for{c in B} {if x[i,c]=1 then printf "%s\n",c;}};

我尝试了这个,但没有成功(numberof 也没有成功):

subject to constr2 {b in B}: count {(i,j,k) in C} ( (x[i,b] + x[j,b] + x[k,b]) = 2 ) <= MAX;其中 MAX 声明为:

param MAX:= 5;

最佳答案

您只能优化线性和(某些)二次表达式。因为你正在努力减少次数 x[i,b] + x[j,b] + x[k,b] == 2,您需要一个额外的指示变量。

var has_2{C} binary;
minimize has_2 sum((i,j,k) in C) not_2[i,j,k]
subject to constr1 {(i,j,k) in C, b in B}: x[i,b] + x[j,b] + x[k,b] - has_2[i,j,k] <= 1

如果 x 变量中有两个为 1,则 constr1 强制 has_2 为 1。如果 x 变量中有 0 个或 1 个为 1,则目标将强制 has_2 为 0。如果您的 x 变量是已经是二进制的,那么您最好使 has_2 连续且上限为 1,特别是考虑到 has_2 变量比 x 变量多。

关于mathematical-optimization - AMPL 难以使用 "count"从约束编写目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24855633/

相关文章:

optimization - CPLEX 是否能降低 MIP 的成本?

r - 用一种优雅的方法来计算矩阵的每一列中元素的数量大于其他每一列中的元素的数量?

mathematical-optimization - 从一组项目中进行选择以满足特定功能目标优化

Python PuLP 性能问题 - 花费太多时间来解决

java - 寻找一个好的 Java ODE 求解器

artificial-intelligence - 你想解决哪些优化问题?

python - 使用 scipy 最小化多变量函数。导数未知

algorithm - 如何计算由 m 个对象组成的最大组合,每个对象都有 n 个备选方案?

python - 两种 ODE 求解器之间的差异

algorithm - 仅在 GPU 上求解小对称正定 Ax = b