AMPL(cplex& gurobi):如何将"if statement"实现为约束?



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

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

'people_to_house[j,i]' 也是一个二进制变量(如果将 person-j 分配给 house-i,则它是 1,否则为 0)

我想使"open_house[i]"等于1,如果(在每个房子里)分配给该房子的人数之和至少为1。换句话说,如果至少有 1 个人被分配到一所房子,那么我们决定打开那所房子。

以下 AMPL 代码给了我一个语法错误。你如何在"主题"中写if-then语句?

subject to
if (open {i in house}: sum {j in people} people_to_house[j,i] >= 1) then open_house[i] = 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)

最新更新