Я пытаюсь преобразовать сумму абсолютных отклонений в задачу линейного программирования, чтобы я мог использовать CPLEX (или другой решатель). Я застрял на том, как матрицы должны быть настроены. Проблема заключается в следующем:
minimize abs(x1 - 5) + abs(x2 - 3)
s.t. x1 + x2 = 10
У меня установлены следующие ограничения для преобразования задачи в линейную форму:
x1 - 5 <= t1
-(x1 - 5) <= t1 and
x2 - 3 <= t2
-(x2 - 3) <= t2
Я настроил целевую функцию как
c = [0,0,1,1]
но я заблудился о том, как настроить
Ax <= b
в матричной форме. Пока что у меня есть:
A = [[ 1, -1, 0, 0],
[-1, -1, 0, 0],
[ 0, 0, 1,-1],
[ 0, 0,-1,-1]]
b = [ 5, -5, 3,-3]
Я установил другое ограничение в матрице для:
B = [1, 1, 0, 0]
b2 = [10]
Когда я запускаю следующее:
linprog(c,A_ub=A,b_ub=b,A_eq=B,b_eq=b2,bounds=[(0,None),(0,None)])
Я получаю следующее сообщение об ошибке:
ValueError: Invalid input for linprog: A_eq must have exactly two dimensions, and the number of columns in A_eq must be equal to the size of c
Я знаю, что есть решение, потому что когда я использую scipy.optimize.minimize, оно решает [6,4]. Я уверен, что проблема в том, что я неправильно формулирую входные матрицы, но я не уверен, как настроить их так, чтобы они работали.
Редактировать - вот код, который не запускается:
import numpy as np
from scipy.optimize import linprog, minimize
c = np.block([np.zeros(2),np.ones(2)])
print("c =>",c)
A = [[ 1, -1, 0, 0],
[-1, -1, 0, 0],
[ 0, 0, 1,-1],
[ 0, 0,-1,-1]]
b = [[ 5, -5, 3,-3]]
print(A)
print(np.multiply(A,b))
B = [ 1, 1, 0, 0]
b2 = [10]
print(np.multiply(B,b2))
linprog(c,A_ub=A,b_ub=b,A_eq=B,b_eq=b2,bounds=[(0,None),(0,None)],
options={'disp':True})