Как решить проблему оптимизации с помощью Gurobi - PullRequest
0 голосов
/ 18 октября 2019

Я новичок в Гуроби. Я написал следующий код. Я сохраняю в Sample.lp. Запустите как

gurobi_cl sample.lp

Maximize
 x1 +  x2 +  x3 + 1 x4 + 1 x5

Subject To
c1: 3 x1 + 5 x2 + 2 x3 + 5 x4 + 7 x5 - 28 <= 0
c2: 2 x1 + 0 x2 + 0 x3 + 8 x4 - 14 <= 0
c3: 4 x4 + 5 x5 - 22 <= 0
c4: 3 x2 - 2 <= 0
D1: 3 x4 -1 >= 0

Bounds
x1 <= 1
x2 <= 1
x3 <= 1
x4 <= 1
x5 <= 1

Integers
x1 x2 x3 x4 x5
End

Кажется, я не получаю правильное решение. Не могли бы вы мне помочь. Значения x являются двоичными.

После внесения изменений я получаю правильное решение. Если нет целевой функции, меня интересует получение общего бинарного решения. Если таких решений много, я хочу получить их несколько (скажем, 1000). Как справиться с этим? Для этого, если напишите

 Maximize
  1

Я получаю ошибку:

Solution count 0

Model is infeasible or unbounded
Best objective -, best bound -, gap -

1 Ответ

1 голос
/ 18 октября 2019

Ваш файл lp имеет константы с левой стороны, которые gurobi интерпретирует как переменные.

 >>> m.read("sample.lp")
    Read LP format model from file sample.lp
Reading time = 0.00 seconds
: 5 rows, 10 columns, 16 nonzeros

>>> m.getVars()                                                                                                                                                                                                          
[<gurobi.Var x1>,
 <gurobi.Var x2>,
 <gurobi.Var x3>,
 <gurobi.Var x4>,
 <gurobi.Var x5>,
 <gurobi.Var 28>,
 <gurobi.Var 14>,
 <gurobi.Var 22>,
 <gurobi.Var 2>,
 <gurobi.Var 1>]

Чтобы исправить, переместите константы вправо.

    Maximize
 x1 +  x2 +  x3 + 1 x4 + 1 x5

Subject To
c1: 3 x1 + 5 x2 + 2 x3 + 5 x4 + 7 x5 <= 28
c2: 2 x1 + 0 x2 + 0 x3 + 8 x4 <= 14
c3: 4 x4 + 5 x5 <= 22
c4: 3 x2 <= 2
D1: 3 x4 >= 1

Bounds
x1 <= 1
x2 <= 1
x3 <= 1
x4 <= 1
x5 <= 1

Integers
x1 x2 x3 x4 x5
End

Это даст ожидаемый ответ.

>>> m.read("sample.lp")
        Read LP format model from file sample.lp
    Reading time = 0.00 seconds
    : 5 rows, 5 columns, 11 nonzeros
>>> m.optimize()
   Optimal solution found (tolerance 1.00e-04)
   Best objective 4.000000000000e+00, best bound 4.000000000000e+00, gap 0.0000%

>>> m.getVars()
   [<gurobi.Var x1 (value 1.0)>,
 <gurobi.Var x2 (value 0.0)>,
 <gurobi.Var x3 (value 1.0)>,
 <gurobi.Var x4 (value 1.0)>,
 <gurobi.Var x5 (value 1.0)>]
...