2016-05-03 3 views
0

私は加重、合計= 1のポートフォリオを持っているとしましょう。
次に、これらのポケットに含まれるいくつかのアセットでポケット(0,1,2)合計私のUI上で(weights_pocket_assets)< pocket_max_weight
が、私はそれぞれのポケットのための3つの列を持って、資産がそうでないポケット、0であれば1で満たされ(この配列は、「ポケット」と呼ばれる)scipy optimize SLSQPは最後のineq constrantだけを考慮します

mask = list(map(int, pockets[0])) 
print(pocket_max[0], mask) 
constr0 = {'type': 'ineq', 'fun': lambda x: pocket_max[0] - np.sum(np.ma.array(x, mask=np.logical_not(mask)))} 

mask = list(map(int, pockets[1])) 
print(pocket_max[1], mask) 
constr1 = {'type': 'ineq', 'fun': lambda x: pocket_max[1] - np.sum(np.ma.array(x, mask=np.logical_not(mask)))} 

mask = list(map(int, pockets[2])) 
print(pocket_max[2], mask) 
constr2 = {'type': 'ineq', 'fun': lambda x: pocket_max[2] - np.sum(np.ma.array(x, mask=np.logical_not(mask)))} 

constr = [{'type': 'eq', 'fun': lambda x: np.sum(x) - 1}, constr0, constr1, constr2] 
print(constr) 

はとなります出力:

0.04 [1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
0.08 [0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
0.05 [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0] 

[{'fun': <function Book.optimize.<locals>.<lambda> at 0x00000060CCD9AD90>, 'type': 'eq'}, 
{'fun': <function Book.optimize.<locals>.<lambda> at 0x00000060CCD9AD08>, 'type': 'ineq'}, 
{'fun': <function Book.optimize.<locals>.<lambda> at 0x00000060CCD9ABF8>, 'type': 'ineq'}, 
{'fun': <function Book.optimize.<locals>.<lambda> at 0x00000060CCD9AAE8>, 'type': 'ineq'}] 

これは正しいと思われます。
問題は、eqとlast ineq(つまりsum(w)= 1、sum(w_pocket_2)= 0.05)でのみ最適化されます。
また、私は2つのポケットしか持たない場合、
要するに、最適化では最後のineqしかかかりません...何が問題なのか分かりません。

EDIT:ポケットは等号(各ポケットのためのすなわち、同一の部品、すなわち、同じマスク)であれば
は、すべて3「の不等式」の制約は考慮されている(つまり、実際にはほとんどの制約はなく、問題はない、それはだ場合最初の 'ineq'、最も制約の厳しい2番目または3番目)
ポケットに類似のコンポーネントがないと(たとえば、2番目の 'ineq'のコンポーネントを追加すると)最後の 'ineq'最適化。

答えて

0

多くの場合、変数スコープに問題がありました(変数がまだ定義されているため、奇妙なものですが上書きされています。次のコードは期待通りに機能します(すべてのポケットの制約が考慮されます)。

constr += ({'type': 'ineq', 
      'fun': lambda x, mask, pocket_max, i: pocket_max[i] - np.sum(np.ma.array(x, mask=np.logical_not(mask))), 
      'args': (mask, pocket_max, i)},) 
関連する問題