0

我是优化新手,一直在努力求解线性方程 Ax + By = C 中的变量 x 和 y,而 y 受 x 的解约束。问题的一个例子可以是:

A = np.random.rand(20,100)
B = np.random.rand(20,200)
C = np.random.rand(20)

求解xyAx +By = C约束x为非负且-0.7*x0 < y0,y1 <0.7*x0, -0.7*x1 < y2,y3 <0.7*x1... ( -0.7x[i] < y[2i],y[2i+1]<0.7x[i] )

如果有人可以向我推荐一个解决此问题的 python 包,或者以某种方式将我的问题转换为可以直接使用 Scipy.optimize 等库解决的更传统的格式,我将不胜感激

4

2 回答 2

0

这取决于您所说的解决方案是什么意思,您所描述的有多个解决方案,它是多面体的内部。

如果您愿意将问题转换为说,这是一个线性规划问题

-0.7x_0 <=y_0 <= 0.7x_0

假设不是,考虑引入一个小的正数 m 来做一个线性规划。

-0.7x_0 + m <=y_0 <= 0.7x_0 - m

然后,您可以使用scipy.optimize.linprog来求解线性程序。

如果您只是对特定解决方案感兴趣,则可以将目标函数中的 c 设置为零。

编辑:

import numpy as np
from scipy.optimize import linprog

m_size = 20
bound = 0.7
x_size = 100
y_size = 2 * x_size
small_m = 0

A = np.random.rand(m_size, x_size)
B = np.random.rand(m_size, y_size)
C = np.random.rand(m_size)

A_eq = np.hstack((A, B))
b_eq = C

sub_block = np.array([-bound, -bound ])
sub_block.shape = (2,1)
block = np.kron(np.eye(x_size), sub_block)

upper_block = np.hstack((block, - np.eye(y_size)))
lower_block = np.hstack((block, np.eye(y_size)))

A_ub = np.vstack((upper_block, lower_block))
b_ub = -small_m * np.ones( 2 * y_size)

bounds = tuple([tuple([0, None]) for i in range(x_size)] + [tuple([None, None]) for i in range(y_size)])

c = [0 for i in range(x_size+y_size)]

res = linprog(c, A_ub = A_ub, b_ub = b_ub, A_eq = A_eq, b_eq = b_eq, bounds = bounds)

x_part = res.x[:x_size]
y_part = res.x[x_size:]
于 2018-08-28T01:40:15.580 回答
0

我使用CVXPY解决了这个问题:

import cvxpy as cp
import numpy as np
m = 20
n = 100
A = np.random.rand(m,n)
B = np.random.rand(m,n)
C = np.random.rand(m,n)
d = np.random.rand(m)

# construct the problem.

x = cp.Variable(n)
y = cp.Variable(n)
z = cp.Variable(n)
objective = cp.Minimize(cp.sum_squares(A*x + B*y + C*z -d))
constaints = [0 <= x, x <= 1, y <= 0.7*x, y >= -0.7*x, z <= 0.7*x, z >= -0.7*x]
prob = cp.Problem(objective, constraints)
result = prob.solve()
于 2018-08-28T19:54:54.253 回答