2015-10-06 7 views
0

Я столкнулся с проблемами с квадратичными объектными условиями. Я составил очень простой код, чтобы проиллюстрировать мое намерение.Квадратичный объектный член в интерфейсе Gurobi Python

Код объяснения: мы хотим дать конфеты девушке. Радость девушки за получение 1 конфеты (joy_per_candy) зависит от общего количества конфет, которые она получает. Чем больше конфет мы даем ей, тем меньше ее joy_per_candy. Цель состоит в том, чтобы максимально увеличить ее общую радость, которая является квадратичным членом:

total_joy = candies * joy_per_candy 

В случае ниже 1 конфеты производит joy_per_candy из 10; 10 конфет производят joy_per_candy из 0. Вот joy curve. Простая математика показывает, что total_joy максимизируется для candies = 5.

Как я могу это решить?

joy_curve = [(1,10),(10,0)] 
    m = Model('candy') 
    candies=m.addVar(ub=joy_curve[1][0]) 
    joy_per_candy=m.addVar(ub=joy_curve[0][1]) 
    m.update() 
    total_joy=QuadExpr(candies*joy_per_candy) 
    m.setObjective(total_joy,GRB.MAXIMIZE) 
    m.optimize() 

результаты:

Оптимизировать модель с 0 строк, 2 столбцов и 0 ненулевые.

Модель имеет 1 квадратичную объективный термин

диапазон Матрица [0e + 00, 0e + 00]

Цель Диапазон [0e + 00, 0e + 00]

границы диапазона [3e + 00 , 1e + 01]

РИТ диапазон [0e + 00, 0e + 00]

Presolve время:

0,00 с

GurobiError

ответ

0

Проблема в основном в вашей спецификации модели.

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

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

Так принимая вашу кривую радость по номинальной стоимости и интеграции, ваша цель должна быть

(100/9) * (конфеты - 1) - (5/9) * (конфеты^2 - 1).

Это немного странно, потому что наклон предельной кривой выгоды (кривая радости) составляет -10/9. Таким образом, вы бы установили цель как:

m.setObjective((100/9)*(candies - 1) - (5/9)*(candies * candies - 1),GRB.MAXIMIZE)