Простая символическая задача LP в матричной форме

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

import cvxpy as cp
import numpy as np

x11 = cp.Variable(nonneg=True)
x12 = cp.Variable(nonneg=True)
x21 = cp.Variable(nonneg=True)
x22 = cp.Variable(nonneg=True)
x31 = cp.Variable(nonneg=True)
x32 = cp.Variable(nonneg=True)

constraints = [x11 + x12 == 1000,
              x21 + x22 == 1500,
              x31 + x32 == 1200,
              x11 + x21 + x31 == 2300,
              x12 + x22 + x32 == 1400]

obj = cp.Minimize((80*x11 + 215*x12 + 100*x21 + 108*x22 + 102*x31 + 68*x32))

prob = cp.Problem(obj, constraints)
prob.solve()
print('status: ', prob.status)
print('optimal value: ', prob.value)
print('optimal variables: ', x11.value, x12.value, x21.value, x22.value, x31.value, x32.value)

статус: оптимальный

оптимальное значение: 313200.00003146095

оптимальные переменные: 999,9999999627637 3,7235625579412695e-08 1299,99999940076 200,00000059923934 6,364774533690845e-07 1199,999999363524

Но я хочу преобразовать этот код в матричную форму. вот мой другой код для матричной формы

x = cp.Variable((3, 2), nonneg=True)

constraints = [cp.sum(x[0,:]) == 1000,
              cp.sum(x[1,:]) == 1500,
              cp.sum(x[2,:]) == 1200,
              cp.sum(x[:, 0]) == 2300,
              cp.sum(x[:, 1]) == 1400]

coe = [[80, 215], [100, 108], [102, 68]]

t
obj = cp.Minimize(cp.sum(coe @ x))

prob = cp.Problem(obj, constraints)
prob.solve()
print('status: ', prob.status)
print('optimal value: ', prob.value)
for i in range(3):
    for j in range(2):
        print('optimal variables:x('+str(i)+','+str(j)+')', x[i,j].value)

статус: оптимальный

оптимальное значение: 810999,9999986519

оптимальные переменные: x(0,0) 649,9892627159586

оптимальные переменные: x(0,1) 350,01073728291954

оптимальные переменные: x(1,0) 900,0113075911175

оптимальные переменные: x(1,1) 599,9886924056102

оптимальные переменные: x(2,0) 749,9994296884455

оптимальные переменные:x(2,1) 450.00057030957413

Я думаю, что результаты должны быть одинаковыми, а код матричной формы неверный. Не могли бы вы найти мои ошибки?


person hoan    schedule 18.06.2020    source источник


Ответы (1)


Вы должны быть осторожны, когда работаете с умножением матриц, особенно в разных библиотеках. Я обнаружил, что @ используется в матрично-матричном умножении. А не умножение на element-wise. См. официальные документы cvxpy.

Каким-то образом во время умножения @ cvxpy неправильно понимает вашу цель.

Решение: изменить obj = cp.Minimize(cp.sum(coe @ x)) на

obj = cp.Minimize(cp.sum(cp.multiply(coe, x.T))) (я тоже не понимаю, почему coe считается (2x3))

person lincr    schedule 18.06.2020