【问题标题】:AMPL (cplex& gurobi): How to implement 'if statement' as constraint?AMPL (cplex& gurobi):如何实现“if 语句”作为约束?
【发布时间】:2020-03-22 15:35:19
【问题描述】:

我需要实现一个 if 语句作为约束。但是,我的代码不断地报错。

'open_house[i]' 是一个二进制变量(1 表示“开放”,0 表示“未开放”)。

'people_to_house[j,i]'也是二进制变量(如果person-j赋值给house-i,则为1,否则为0)

我想让 'open_house[i]' 等于 1,如果(在每个房子中)分配到该房子的人数总和至少为 1。换句话说,如果至少有1人被分配到一所房子,然后我们决定打开那所房子。

下面的 AMPL 代码给了我一个语法错误。你如何在“subject to”中编写 if-then 语句?

 subject to
     if (open {i in house}: sum {j in people} people_to_house[j,i] >= 1) then open_house[i] = 1;

【问题讨论】:

    标签: cplex gurobi ampl


    【解决方案1】:

    你不需要 if-then-else 。你可以只要求

    people_to_house[j,i] <= open_house[i]
    

    适用于所有 ji。一旦有人被分配到房子i,这将强制open_house[i] 为1。如果要分配的潜在人数不是太大,您也可以将其表述为 big-M 约束:

    sum { j in people } people_to_house[j,i] <= M * open_house[i]
    

    (其中M是人数,即sum { j in people } 1

    【讨论】:

    • 感谢您的回答。事实上,在我在这里发布这个问题之前,我已经尝试过 big-M 约束和你的第一个建议。问题是 big-M 约束确实给出了解决方案,但看起来有点奇怪:当我显示 people_to_house 变量时,它显示有些人被分配到这所房子,而另一些人被分配到其他一些房子。但是,当我显示 open_house 时,它​​显示所有值都是 0,考虑到有人被分配到房屋,这是不正确的。这就是为什么我认为我的约束有问题......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    相关资源
    最近更新 更多