Возможны ли несколько целей? (ИЛИ-ИНСТРУМЕНТЫ программирования ограничений)

#python #constraints #constraint-programming #or-tools

#python #ограничения #программирование ограничений #или-инструменты

Вопрос:

У меня проблема, когда у меня есть набор складов с заданной производственной мощностью, которые отправляют некоторый продукт в список клиентов по заданной цене. Я пытаюсь минимизировать общую стоимость отправки продуктов, чтобы удовлетворить спрос каждого клиента. Эта часть отсортирована.

Теперь мне нужно добавить новую цель (или ограничение), в которой я пытаюсь удовлетворить все запросы клиентов с минимальными затратами, но при этом используя минимальное количество возможных складов. Скажем, начните с 5 складов, если проблема невозможна, тогда попробуйте 6, 7, 8 и т. Д., Пока не будет найдено решение, Если я удовлетворю все требования, используя минимально возможное количество складов.

Как я мог бы сделать это, используя модуль программирования ограничений or-tool? Возможно ли это вообще? Я хорошо просмотрел документацию, но не смог найти никаких ограничений или функций, которые, казалось, соответствовали бы этой идее.

Ответ №1:

Решите с первой целью, ограничьте цель решением, намекните и решите с новой целью.

 from ortools.sat.python import cp_model

model = cp_model.CpModel()
solver = cp_model.CpSolver()
x = model.NewIntVar(0, 10, "x")
y = model.NewIntVar(0, 10, "y")

# Maximize x
model.Maximize(x)
solver.Solve(model)
print("x", solver.Value(x))
print("y", solver.Value(y))
print()

# Hint (speed up solving)
model.AddHint(x, solver.Value(x))
model.AddHint(y, solver.Value(y))

# Maximize y (and constraint prev objective)
model.Add(x == round(solver.ObjectiveValue()))  # use <= or >= if not optimal
model.Maximize(y)

solver.Solve(model)
print("x", solver.Value(x))
print("y", solver.Value(y))
 

Источник (мой блог)

Ссылка (проблема с github)

Комментарии:

1. Я вижу в этом логику. Это довольно разумный способ взглянуть на проблему: фиксируя общее количество отправленных товаров, мы теперь можем минимизировать количество мест, из которых мы их отправляем. Я сейчас это реализую. Если я могу добавить, есть ли у вас какие-нибудь советы о том, как ускорить производительность? Может быть, решатели или что-то еще. Спасибо за вашу помощь!

2. самый простой заключается solver.parameters.num_search_workers=8 в том, что сокращение доменов intvars также помогает