Кусочно-линейная функция в Gurobi, понимая пример - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь реализовать кусочно-линейную задачу в задаче оптимизации gurobi в python.Когда я пытался познакомиться с этим методом, используя пример с сайта gurobi (http://examples.gurobi.com/production-scheduling/)

, я застрял и не мог решить проблему сам в течение нескольких дней. Теперь я надеюсь, что кто-тоЗдесь можно показать, где моя интерпретация неверна.

Упомянутый пример оптимизирует прибыль от производства нескольких товаров с ограниченными производственными мощностями, особенно с ограниченным количеством рабочих часов персонала. Однако последнее ограничениеэто не сложно, но для некоторой бонусной выплаты возможное рабочее время может быть расширено (это кусочно-линейная функция). В общей постановке задачи проблема выглядит так:

profit = revenue−cost = ∑r(i)x(i)−cost(t)

где r отображает удельный доход для товара «i» и x долю этого товара, в то время как термин «затраты» обеспечивает потенциальные дополнительные расходы за сверхурочные. Однако в фактическом коде цель пропускает термин «затраты», по крайней мере, в соответствии с моимпонимание:

  # Set objective
  m.setObjective( quicksum(revenue[i]*x[i] for i in range(n)), GRB.MAXIMIZE)

Я подозреваю, что это как-то вводитed / учитывается кусочно-линейной целью, но, к сожалению, я просто не понимаю, как.

# Set piecewise linear objective
nPts = 101
ti = []
costi = []
lb = 0
ub = maxhours;

for i in range(nPts):
    ti.append(lb + (ub - lb) * i / (nPts - 1))
    costi.append(-cost(ti[i], limithours, penalty))

m.setPWLObj(t, ti, costi)
m.optimize()

Всегда ли PWLObj вычитается из основной цели?Есть ли способ, например, умножить PWLObj на основную целевую функцию?Я надеюсь, что я не просто упустил какой-то тривиальный момент (я все еще довольно новичок в программировании и оптимизации).Большое спасибо за ваше время и поддержку!

...