Я обратился к CPLEX, поскольку мне предстоит решить довольно большую линейную задачу.
Если мы используем scipy.optimize.linprog Обозначение:
Свернуть: c ^ T *x
при условии: A_ub * x <= b_ub и A_eq * x == b_eq, </p>
, тогда моя A_ub матрица имеет форму примерно (20000, 10000): 20000 ограничений10000 переменных.
Очень быстро построить матрицы A_ub, A_eq и векторы c, b_ub, b_eq , используя numpy.
Но создание проблемы CPLEX из этого требуетоколо 30 секунд (что не приемлемо в моей ситуации).Это происходит потому, что их Python API не может принимать матрицу в качестве входных данных (по крайней мере, я не смог найти такую функциональность после нескольких дней тестирования различных сценариев).
Единственный способ создать проблему - это построить ее либо по столбцу,столбец или строка за строкой, например:
problem = cplex.Cplex()
problem.set_problem_type(problem.problem_type.LP)
problem.objective.set_sense(problem.objective.sense.minimize)
problem.variables.add(obj=c)
n_constraints, n_vars = A_ub.shape
index = list(range(n_vars))
list_rhs = list(b_ub)
# for each row (constraint) create a SparsePair instance
sparse_pairs = [cplex.SparsePair(ind=index, val=A_ub[i]) for i in range(n_constraints)]
# this piece takes 30 seconds
problem.linear_constraints.add(
lin_expr=sparse_pairs,
rhs=list_rhs,
senses=['L'] * n_less_cons
)
Я также пытался сделать это столбец за столбцом и непосредственно заполняя коэффициенты, но все одинаково медленно.
Я не могу поверить, что этоОбычно постановка задачи занимает в 6-7 раз больше времени, чем ее решение (решение занимает 4-5 секунд).Кто-нибудь знает, есть ли более быстрый способ создать проблему в CPLEX?
В настоящее время быстрее решить проблему с помощью cvxopt, используя GLPK с открытым исходным кодом (15 секунд), потому что он непосредственно принимает матрицы в качестве входных данных,как scipy.linprog.
PS Я также проверил API Python Gurobi, и у него та же проблема (он работает даже медленнее).