Ограничение пульпы с абсолютным значением> = минимум игнорируется - PullRequest
0 голосов
/ 12 октября 2019

Я пытаюсь ограничить свою проблему, делая абсолютную разницу двух LpVariables больше 0. Есть ли что-то очевидное, чего мне не хватает в моей реализации?

Это реализация, которую я нашел на http://lpsolve.sourceforge.net/5.1/absolute.htm, которая реализовала ее в приведенном ниже коде. Я попытался изменить значение для M, но это не имеет значения.

Когда я ввожу фактический результат в формулу (такой, что q1x-q2x = 0), я обнаружил, что это не удовлетворяет ограничениям. Однако целлюлоза говорит, что решение является оптимальным.

prob = LpProblem("myProblem", LpMinimize)

q1x = LpVariable("q1x",1,8)

q2x = LpVariable("q2x",1,8) 

B12 = LpVariable("B12",0,1)

M=8

prob += (q1x-q2x) + M * B12 >= 1

prob += -(q1x-q2x) + M * (1-B12) >= 1

prob += q1x+q1y

Ожидаемый :

 q1x = 1; q2x = 2 or "infeasible"

Фактический:

q1x = 1; q2x = 1 "optimal"

1 Ответ

0 голосов
/ 17 октября 2019

Самое первое «ограничение», добавленное к классу LpProblem, всегда будет считаться целевой функцией, как описано в этой тестовой задаче.

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

Попробуйте это:

prob = LpProblem('myProblem', LpMinimize)

q1x = LpVariable("q1x",lowBound = 1, upBound = 8, cat = "Integer")

q2x = LpVariable("q2x",lowBound = 1, upBound = 8, cat = "Integer")

B12 = LpVariable("B12", lowBound = 0, upBound = 1, cat = "Integer")

# B12 can be also be defined by: 
#B12 = LpVariable("B12", cat = "Binary")

M = 8

prob += q1x + q2x 

prob += (q1x-q2x) + M * B12 >= 1

prob += -(q1x-q2x) + M * (1-B12) >= 1



prob.solve()

for v in prob.variables():
    print(v.name, " = ",  v.varValue)
print("Status:", LpStatus[prob.status])
...