Программирование абсолютного отклонения как линейной программы - PullRequest
1 голос
/ 11 апреля 2020

Я пытаюсь преобразовать сумму абсолютных отклонений в задачу линейного программирования, чтобы я мог использовать 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})

1 Ответ

0 голосов
/ 11 апреля 2020

Я думаю, что сообщение довольно хорошее. B должна быть 2-мерной матрицей вместо 1-мерного вектора. Итак:

B =  [[1, 1, 0, 0]]

Во-вторых, массив границ слишком короткий. В-третьих, ваш порядок переменных не согласован. Столбцы в A равны x1,t1,x2,t2, в то время как столбцы в B (и c) кажутся x1,x2,t1,t2. Им нужно следовать той же схеме.

...