Я борюсь с проблемой смешанного целочисленного программирования, в которую входит оператор if. При использовании PuLP, я продолжаю получать «неосуществимый» как статус решения,
Моя переменная решения - это просто список двоичных индикаторов (либо 0, либо 1), соответствующих серии контейнеров, и того, используются они или нет (0 = не используется, 1 = используется).
# Instantiate problem to be solved
prob = LpProblem('Test Problem', LpMaximize)
b = []
for id in container_names:
max_count = 1
b.append(LpVariable('b_{}'.format(id),
lowBound=0,
upBound=1,
cat='Integer'))
Целевой функцией является просто выбор контейнера (принимает значение 1), умноженное на точки, которые были предварительно назначены для каждого контейнера
prob += lpSum([i * j for i, j in zip(points, b)]), 'Total Points'
Первое ограничение следующее. В каждом контейнере есть комбинация предметов. Мы не можем превысить инвентарь для любого из этих предметов. 'container_item_dict' - это словарь, в котором ключи - это идентификаторы контейнеров, а значения - это словари, где ключи - это идентификаторы ресурсов, а значения - это счетчики в контейнере. Когда я запускаю только с этим ограничением, алгоритм работает, и я получаю хорошие результаты.
for j in inventory_names:
prob += lpSum([b[i]*container_item_dict[container_names[i]][j] for i in container_index]) <= inventory_in_stock_dict[j]
Я пытаюсь добавить дополнительное ограничение, но не могу понять. У меня есть еще один список бинарных индикаторов под названием «must_haves». «must_haves» имеет ту же длину, что и «container_names», и каждое значение соответствует контейнеру. Если элемент «must_haves» равен 1, то этот контейнер должен быть выбран в решении. Если элемент "must_haves" равен 0, соответствующий контейнер может быть выбран или не выбран.
Как мне кодировать это, если ограничение оператора?