[英]Optimization in scipy for a matrix
我试图找到带有二进制条目(0,1)的优化矩阵,以便使目标函数最大化。
我的X输入是带有0和1项的二维矩阵。
我的目标函数是这样的:
def objective(x):
w=[[2,3],[4,6],[1,0],[2,8]]
return -1* (x[0][0]*w[0][0]+x[0][1]*w[0][1]+x[1][0]*w[1][0]+x[1][1]*w[1][1])
这是我的初始X:
x0=[[1,0],[1,0],[0,1],[0,0]]
在这里,我定义了X的边界:
b=(0,1)
bnds=((b,b),(b,b))
最后是最大化问题
sol=minimize(objective2,x0,method='SLSQP',bounds=bnds)
但是我有两个问题:
第一:绑定的尺寸与我的X不同,因此我得到了一个错误。 其次,当我运行最小化函数时,我得到了错误并指出标量变量的索引无效。
这是我心目中的重塑
In [293]: objective(x0)
Out[293]: -6
In [294]: def foo(x):
.....: return objective(x.reshape(-1,2))
.....:
In [295]: foo(np.array(x0).ravel())
Out[295]: -6
In [296]: from scipy.optimize import minimize
In [297]: minimize(foo, x0, method='SLSQP')
Out[297]:
fun: -801353716.84727359
jac: array([ 0., 0., 0., 0., 0., 0., 0., 0., 0.])
message: 'Optimization terminated successfully.'
nfev: 130
nit: 13
njev: 13
status: 0
success: True
x: array([ 2.46570281e+07, 3.69855528e+07, 4.93140795e+07,
7.39711140e+07, 0.00000000e+00, 1.00000000e+00,
0.00000000e+00, 0.00000000e+00])
我还没有纳入界限
In [290]: np.array(bnds).shape
Out[290]: (2, 2, 2)
它们必须与展平的x0
兼容
In [298]: np.array(x0).ravel()
Out[298]: array([1, 0, 1, 0, 0, 1, 0, 0])
例如,这将所有值限制在0到1之间
In [301]: bnds=np.array((np.zeros(8),np.ones(8))).T
In [302]: bnds
Out[302]:
array([[ 0., 1.],
[ 0., 1.],
[ 0., 1.],
[ 0., 1.],
[ 0., 1.],
[ 0., 1.],
[ 0., 1.],
[ 0., 1.]])
In [303]: minimize(foo, x0, method='SLSQP',bounds=bnds)
Out[303]:
fun: -14.999999999999773
jac: array([-2., -3., -4., -6., 0., 0., 0., 0., 0.])
message: 'Optimization terminated successfully.'
nfev: 20
nit: 2
njev: 2
status: 0
success: True
x: array([ 1., 1., 1., 1., 0., 1., 0., 0.])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.