【问题标题】:AMPL difficulty writing an objective from a constraint using "count"AMPL 难以使用“计数”从约束中编写目标
【发布时间】:2014-07-20 22:46:09
【问题描述】:

我正在尝试解决 AMPL 中的一个小问题,但我遇到了一个我无法将其转化为约束的难题。问题是: 假设我有 3 组 ABC。我想将 A 中的元素链接到 B 中的元素,以便 A 中的不超过 2 个元素链接到 中的单个元素>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

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 ) &lt;= MAX; 其中 MAX 声明为:

param MAX:= 5;

【问题讨论】:

    标签: mathematical-optimization linear-programming solver cplex ampl


    【解决方案1】:

    您只能优化线性和(某些)二次表达式。由于您试图最小化次数 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
    

    constr1 如果两个 x 变量为 1,则强制 has_2 为 1。如果 x 变量中有 0 或 1 个为 1,则目标将强制 has_2 为 0。如果您的 x 变量已经是二进制的,那么您让 has_2 在上限为 1 的情况下连续可能会更好,尤其是考虑到 has_2 变量比 x 变量多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多