我需要实现一个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]
对于所有j
和i
.一旦一个人被分配到房屋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
)