Scipy.optimize COBYLA约束违规

时间:2016-09-12 15:48:47

标签: python optimization scipy constraints

我有约束的优化问题,但COBYLA求解器似乎不尊重我指定的约束。

我的优化问题:

cons = ({'type':'ineq', 'fun':lambda t: t},) # all variables must be positive
minimize(lambda t: -stateEst(dict(zip(self.edgeEvents.keys(),t)), (0.1,)*len(self.edgeEvents), constraints=cons, method='COBYLA')

stateEst定义为:

def stateEst(t):
    val = 0
    for edge,nextState in self.edgeEvents.iteritems():
        val += edge_probability(self,edge,ts) * estimates[nextState]
        val += node_probability(self, edge.head, ts, edge_list=[edge])* cost
    for node,nextState in self.nodeEvents.iteritems():
        val += node_probability(self, node, ts) * \
            (estimates[nextState] + cost*len([e for e in node.incoming if e in self.compEdges])
    return val

概率函数仅针对正t值定义。字典是必要的,因为概率是根据“命名的”t值计算的。

当我运行它时,我注意到COBYLA为其中一个t值尝试了-0.025的值。为什么优化不遵守约束条件?

2 个答案:

答案 0 :(得分:3)

COBYLA 从技术上讲是一种不可行的方法,这意味着迭代可能并不总是可行的约束!(这只是关于最终收敛,这些算法的可行性很重要。)

使用未在任何地方定义的目标函数将会出现问题。也许你被迫转向一些可行的方法

或者你可以考虑概括你的目标,以便对负面t进行惩罚。但这与问题有关,也可能引入其他问题(收敛;数值稳定性)。

尝试使用L-BFGS-B,这仅限于绑定约束,这不是问题(对于您当前的问题!)。

答案 1 :(得分:0)

对于这么简单的事情,只需通过取 np.exp(t) 甚至 t**2 重新定义您的函数以取任何实际值,然后取解的对数(或平方根)。