我有约束的优化问题,但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的值。为什么优化不遵守约束条件?
答案 0 :(得分:3)
COBYLA 从技术上讲是一种不可行的方法,这意味着迭代可能并不总是可行的约束!(这只是关于最终收敛,这些算法的可行性很重要。)
使用未在任何地方定义的目标函数将会出现问题。也许你被迫转向一些可行的方法。
或者你可以考虑概括你的目标,以便对负面t进行惩罚。但这与问题有关,也可能引入其他问题(收敛;数值稳定性)。
尝试使用L-BFGS-B,这仅限于绑定约束,这不是问题(对于您当前的问题!)。
答案 1 :(得分:0)
对于这么简单的事情,只需通过取 np.exp(t) 甚至 t**2 重新定义您的函数以取任何实际值,然后取解的对数(或平方根)。