2016-09-12 4 views
0

У меня есть проблема оптимизации с ограничениями, но решатель COBYLA, похоже, не соблюдает ограничения, которые я указываю.Scipy.optimize нарушение ограничения 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 пытается получить значение -0,025 для одного из значений t. Почему оптимизация не учитывает ограничения?

ответ

3

COBYLA технически говоря об методе технически невозможно, а это значит, что итерацию могут быть не всегда осуществимы в отношении ваших ограничений! (речь идет только о конечной конвергенции, где для этих алгоритмов важна осуществимость).

Использование объектной функции, которая не определена везде, будет проблематичной. Возможно, вы вынуждены перейти к допустимому методу .

Альтернативно вы могли бы подумать об обобщении своей цели, чтобы были введены штрафы за отрицательные t. Но это зависит от проблем и может также вводить другие проблемы (конвергенция, числовая стабильность).

Попробуйте использовать L-BFGS-B, который ограничен ограничениями, которые здесь не являются проблемой (для вашей текущей проблемы!).

Смежные вопросы