使用CVXPY

时间:2016-12-12 07:41:55

标签: mathematical-optimization entropy cvx cvxpy

我试图使用CVXPY以数字方式解决熵最大化问题。即使问题通过DCP检查,我仍然得到无限结果,并且问题状态如不可行和unbounded_inaccurate(取决于我为参数选择的值)。我设法使用像A中的Alabama这样的非线性约束优化器来解决同样的问题。下面是一个重现问题的小例子。

import cvxpy as cvx

vals = array([  750.,   770.,   790.,   810.,   830.,   850.,   870.,   890.,
         910.,   930.,   950.,   970.,   990.,  1010.,  1030.,  1050.,
        1070.,  1090.,  1110.,  1130.])

n = size(freq)
z = cvx.Variable(2,n)

a = cvx.Parameter(sign="positive", value=989.)
b = cvx.Parameter(sign="positive", value=.1) 
d = cvx.Parameter(sign="positive", value=10.)

obj = cvx.Maximize(cvx.sum_entries(cvx.entr(z)))

cons = []
cons += [ z >= 0., cvx.sum_entries(z) == 1, cvx.sum_entries(z, axis=0) * vals == a ] 

for i in range(n):
    cons += [ cvx.logistic(b*(vals[i] - a - d)) * z[1,i] == cvx.exp(b*(vals[i] - a - d)) * (z[0,i] + z[1,i]) ]

prob = cvx.Problem(obj, cons)
prob.solve(solver=cvx.SCS)

我不太明白为什么CVX比其他非凸算编程问题的算法更难解决这个问题。我是否忽略了编写约束的方式?

*编辑*

到目前为止,我没有收到任何答复,我也会在CVXPY Google group上提出这个问题。我会相应地更新这个帖子。

1 个答案:

答案 0 :(得分:0)

我设法解决了我的问题。解决方案是使用Numpy函数存储logit分布的数值,然后在约束中使用其组件:

qre = np.exp(b.value*(vals - a - d.value))/(1.+np.exp(b.value*(vals - a - d.value)))
...
cons += [ qre[i] * (z[0,i]+z[1,i])   ==  z[1,i] ]