【问题标题】:Optimization in scipy for a matrix矩阵的 scipy 优化
【发布时间】:2017-01-18 01:52:38
【问题描述】:

我正在尝试找到具有二进制项 (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)

但是我有两个问题:

首先:bnds 的维度与我的 X 不同,因此我收到错误消息。 其次,当我运行最小化函数时,我得到一个错误,指出标量变量的索引无效。

【问题讨论】:

  • 我认为您的 x0 必须是 1d。我回答了最近的一个问题。
  • @hpaulj 所以你的意思是它不可能是二维的?
  • 这不是一个严重的限制,因为您可以根据需要在函数中分解和重塑它。
  • 谢谢,但这个问题还没有得到正确回答

标签: python optimization scipy


【解决方案1】:

这是我想到的重塑

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.])

【讨论】:

  • 谢谢你的朋友,但你的回答不太可读。如果您能使其更清晰和有条理,我将不胜感激。
  • 我的大部分答案都是从实际的 Ipython 交互会话中复制而来的。
猜你喜欢
  • 1970-01-01
  • 2017-03-24
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 1970-01-01
  • 2020-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多