Включение простого оператора if в смешанное целочисленное линейное программирование - PullRequest
0 голосов
/ 31 октября 2018

Я борюсь с проблемой смешанного целочисленного программирования, в которую входит оператор 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, соответствующий контейнер может быть выбран или не выбран.

Как мне кодировать это, если ограничение оператора?

1 Ответ

0 голосов
/ 31 октября 2018

Я считаю, что это правильный подход:

for i in container_index:
    prob += b[i] >= must_haves[i]

Таким образом, если must_haves равно 1, контейнер должен быть выбран. Если must_haves равно 0, контейнер может быть выбран или нет.

Я сделал это изначально и получил ошибку. Теперь я думаю, что этот код правильный, и он вернул «неосуществимый», потому что он был просто неосуществим, учитывая количество элементов контейнера, которые у меня есть.

...