基质的scipy优化

时间:2017-01-17 16:53:11

标签: python optimization scipy

我试图找到带二进制条目(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有不同的尺寸,我得到了一个错误。 其次,当我运行最小化函数时,我得到了错误,表示标量变量的索引无效。

1 个答案:

答案 0 :(得分:1)

这是我心中的重塑

<ItemsControl ItemsSource="{Binding Path=Errors}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <Label Content="{Binding Path=Key}" />
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

我还没有纳入界限

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

例如,这会约束0到1之间的所有值

In [298]: np.array(x0).ravel()
Out[298]: array([1, 0, 1, 0, 0, 1, 0, 0])