2016-09-12 19 views
0

制約に最適化問題がありますが、COBYLAソルバーは指定した制約を尊重していないようです。Scipy.optimize COBYLA制約違反

私の最適化問題:確率関数は、正のみt値のために定義されている

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 

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は以下のように定義されます。確率は '名前付き'のt値に対して計算されるため、辞書が必要です。

これを実行すると、COBYLAはt値の1つに対して-0.025の値を試行することに気付きます。最適化が制約を尊重しないのはなぜですか?

答えて

3

COBYLAは、技術的に反復するが、あなたの制約に関しては、常に可能ではないかもしれないことを、意味実行不可能な方法を、話しています!(最終的なコンバージェンスについては、これらのアルゴリズムの実現可能性が重要です)。

どこにも定義されていない目的関数を使用すると問題があります。おそらく、実行可能メソッドに切り替えるように強制されます。

また、あなたの目標を一般化することについて考えることができ、負のtに対して罰則が導入されることがあります。しかし、これは問題に依存し、他の問題(収束、数値安定性)も導入する可能性があります。

制限付き制約に限定されているL-BFGS-Bを試してください。これは問題ではありません(現在の問題です)。

関連する問題