Как сформулировать задачу линейного программирования в Cplex с использованием Python - PullRequest
0 голосов
/ 03 сентября 2018

Я пытаюсь решить задачу линейного программирования, используя IBM Cplex, при вызове ее из Python.

Проблема состоит в том, чтобы минимизировать + c,

с учетом ограничения, что Ax '= m',

, где x = [a, b, c]

A = [[20,0,0], [0,20,30]]

м = [20,30]

с a, b, c между 0 и 1.

Одним из правильных решений проблемы является a = 1, b = 0 и c = 1. Но Cplex дает решения, a = 1, b = 1 и c = 0. В формулировке проблемы есть ошибка, но я не могу понять где. Код ниже

import cplex
from cplex.exceptions import CplexError
import sys



my_obj      = [1.0, 0.0, 1.0]
my_ub       = [1.0] * len(my_obj)
my_lb       = [0.0] * len(my_obj)
my_colnames = ["a", "b", "c"]
my_rhs      = [20.0, 30.0]
my_rownames = ["c1", "c2"]
my_sense    = "E" * len(my_rownames)


def populatebynonzero(prob):
    prob.objective.set_sense(prob.objective.sense.minimize)

    prob.linear_constraints.add(rhs = my_rhs, senses = my_sense,names = my_rownames)

    prob.variables.add(obj = my_obj, ub = my_ub, lb = my_lb ,names = my_colnames)


    rows = [0,1]
    cols = [0,1]
    vals = [20.0,30.0]

    prob.linear_constraints.set_coefficients(zip(rows, cols, vals))


def lpex1():
    try:
        my_prob = cplex.Cplex()
        handle = populatebynonzero(my_prob)
        my_prob.solve()
    except CplexError, exc:
        print exc
        return

    numrows = my_prob.linear_constraints.get_num()
    numcols = my_prob.variables.get_num()

    print
    # solution.get_status() returns an integer code
    print "Solution status = " , my_prob.solution.get_status(), ":",
    # the following line prints the corresponding string
    print my_prob.solution.status[my_prob.solution.get_status()]
    print "Solution value  = ", my_prob.solution.get_objective_value()
    slack = my_prob.solution.get_linear_slacks()
    pi    = my_prob.solution.get_dual_values()
    x     = my_prob.solution.get_values()
    dj    = my_prob.solution.get_reduced_costs()
    for i in range(numrows):
        print "Row %d:  Slack = %10f  Pi = %10f" % (i, slack[i], pi[i])
    for j in range(numcols):
        print "Column %d:  Value = %10f Reduced cost = %10f" % (j, x[j], dj[j])

    my_prob.write("lpex1.lp")




    print x, "SOLUTIONS"

lpex1()

1 Ответ

0 голосов
/ 04 сентября 2018

Произошла ошибка в определении строк и столбцов ограничения, приведенные ниже исправления, теперь работает

rows = [0,1,1] 
cols = [0,1,2]
vals = [20.0,20.0,30.0]
...