PuLP дает неоптимальное решение для простой задачи с ограничениями - PullRequest
0 голосов
/ 06 февраля 2019

Решатель PuLP не дает оптимального результата, хотя это было возможно.Это плохо определенная проблема или проблема в библиотеке или ограничениях?

Обычно это дает оптимальную для большинства ограничений возможность, но это не для этого конкретного случая.

from pulp import *
prob = LpProblem("minimization", LpMinimize)

#introducing vars
a=LpVariable("a", 0, None)
b=LpVariable("b", 0, None)
c=LpVariable("c", 0, None)
d=LpVariable("d", 0, None)
e=LpVariable("e", 0, None)

#introducing main obj and constraints
#basically addition of all vars should be minimized to 1.
prob+=a+b+c+d+e>=1,"main objective"
prob+=a<=0.3,"a const"
prob+=b<=0.3,"b const"
prob+=c<=0.3,"c const"
prob+=d<=0.3,"d const"   #can change to 0
prob+=e==0.1,"e const"

"""
for this const. 
the res is:
a=0.3
b=0.3
c=0.3
d=0.3
e=0.1
a+b+c+d+e=1.3

if you change prob+=d<=0.3 to prob+=d<=0
then:
a=0.3
b=0.3
c=0.3
d=0.0
e=0.1
a+b+c+d+e=1

"""


#solves the problem
status = prob.solve()
#checks if optimal or infeasible
print("status:",LpStatus[prob.status])

#shows all the vars
for variable in prob.variables():
    print("{} = {}".format(variable.name, variable.varValue))

для этого const.

Res:

a = 0,3

b = 0,3

c = 0,3

d = 0,3

e = 0,1

a + b + c + d + e = 1,3

Это должно быть 1, так как это LpMinimize.

, если вы измените prob + = d<= 0,3 до вероятности + = d <= 0 </p>

, затем:

a = 0,3

b = 0,3

c = 0,3

d = 0.0

e = 0.1

a + b + c + d + e = 1

1 Ответ

0 голосов
/ 06 февраля 2019

Это ограничение, а не цель:

prob+=a+b+c+d+e>=1,"main objective"

По существу у вас нет цели, поэтому решатель просто ищет выполнимое решение.

Попробуйте

prob+=a+b+c+d+e,"main objective"
prob+=a+b+c+d+e>=1,"constraint"

Теперь вы оба минимизируете a+b+c+d+e, а также ограничиваетесь этим.

Вывод: я думаю, что PuLP здесь верен.

...