Interactivelinearprogramming gives the wrong answer

asked 4 years ago

Cyrille gravatar image

updated 2 years ago

FrédéricC gravatar image

Here are two versions of the same linear programming problem.

The first one is simply the second one after eliminating the variable z.

  • min { 1.8xy+600|x30;y32;2x+3y90;10x+6y230 }

  • min { 4.2x+5y+6z|x30;y32;2x+3y90;10x+6y230;x+y+z=100 }

Here is some SageMath code to solve the first one

%display latex
A = matrix([[1, 0], [0, 1], [2, 3], [10, 6]])
b = vector([30, 32, 90, 230])
c = vector([-1.8, -12])
# La forme du `problem_type` est obligatoire pour `InteractiveLPProblemStandardForm`
inc = InteractiveLPProblem(A, b, c, ["I_A", "I_B"],
                           problem_type="min",
                           objective_constant_term=600)
show(inc)
inc.plot()
inc = inc.standard_form()
inc = inc.run_simplex_method()
show(inc)

But the answer is obviously false. I have used the same type of code to solve the second one.

%display latex
A = matrix([[1, 0, 0], [0, 1, 0], [2, 3, 0], [10, 6, 0], [1, 1, 1]])
b = vector([30, 32, 90, 230, 100])
c = vector([4.2, 5, 6])
inc = InteractiveLPProblem(A, b, c, ["x", "y", "z"],
                           problem_type="min",
                           constraint_type=['<=', '<=', '<=', '<=', '=='],
                           objective_constant_term=600)
show(inc)
inc = inc.standard_form()
inc = inc.run_simplex_method()
show(inc)

Here the answer is infeasibility.

But with the following code I reach the good answer (verified by Lips <- Sourceforge, which gives the same answer for both problems):

n = 5  # nombre de contraintes
m = 3  # nombre de variables
A = matrix(n, m, [1, 0, 0, 0, 1, 0, 2, 3, 0, 10, 6, 0, 1, 1, 1])  # les coefficients
bmin = [0, 0, 0, 0, 100]  # bornes inférieures pour les contraintes
bmax = [30, 32, 90, 230, 100]  # bornes supérieures pour les contraintes (oo = infini)
show(LatexExpr("A="), A)
show(LatexExpr("bmin="), bmin)
show(LatexExpr("bmax="), bmax)
sol = MixedIntegerLinearProgram(maximization=False, solver="GLPK")  # on crée le programme
x = sol.new_variable(integer=False, indices=[0 .. m - 1])  # les nouvelles variables sont x_0 à x_11
B = A*x  # la fonction linéaire pour les contraintes
sol.set_objective(4.2*x[0]+5*x[1]+6*x[2]+600) # fixe l'objectif
# on construit les contraintes avec leurs bornes
for i in range(n):
    sol.add_constraint(B[i], min=bmin[i], max=bmax[i])
sol.show()
sol.solve()
xx = sol.get_values(x)
show(LatexExpr(r"I_A^\star ="),
     xx[0], LatexExpr(r", I_B^\star ="),
     xx[1], LatexExpr(r", E^\star ="), 
     xx[2], LatexExpr(r" \text{ et } C^\star ="),
     sol.get_objective_value())

So I wonder if I made a mistake or if there is an error in the code. I am perfectly aware that the interactivelinearprogramming package is built for pedagogical reasons. But some things are not very obvious. For instance it is sensitive to the order of the options.

Preview: (hide)