AMPL (cplex & gurobi): как реализовать оператор if в качестве ограничения? - PullRequest
0 голосов
/ 22 марта 2020

Мне нужно реализовать оператор 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;

1 Ответ

1 голос
/ 23 марта 2020

Вам не нужно если-то-еще для этого. Вы можете просто потребовать

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

для всех j и i. Это заставит open_house[i] к 1, как только человек будет назначен на дом i. Если число людей, которые могут быть назначены, не слишком велико, вы также можете сформулировать это как ограничение большого M:

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

(где M - количество людей, то есть sum { j in people } 1 )

...