2016-05-03 3 views
0

Angenommen, ich habe ein Portfolio mit Gewichten, Summe = 1.
Dann möchte ich Taschen (0, 1, 2) mit einigen Vermögenswerten in diesen Taschen und enthalten definieren sum (weights_pocket_assets) < pocket_max_weight
auf meinem UI, ich habe ein 3 Spalten für jede Tasche, mit 1 gefüllt, wenn Vermögenswert in der Tasche ist, sonst 0 (dieses Array genannt wird 'Taschen')scipy optimize SLSQP berücksichtigt nur die letzten 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) 

gibt als Ausgabe:

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'}] 

was scheint richtig.
Problem ist nur mit eq und letzte ineq zu optimieren (dh summe (w) = 1 und summe (w_pocket_2) = 0.05)
Auch wenn ich nur 2 Taschen habe, optimiert es nur mit Leisten.
Kurz gesagt, es dauert nur letzte ineq in der Optimierung ... weiß nicht, was los ist.

EDIT:
wenn Taschen Gleichen sind (dh gleiche Komponenten für jede Tasche, dh gleiche Maske), dann alle drei Einschränkungen ‚Ineq‘ berücksichtigt werden (dh die am meisten beschränke in der Tat, aber kein Problem, wenn es die zuerst 'ineq', der zweite oder der dritte, der am meisten einschränkt)
sobald die Taschen keine ähnlichen Komponenten haben (zB: wir fügen eine Komponente für die zweite 'ineq' hinzu), wird nur die letzte 'ineq' genommen Optimierung.

Antwort

0

Wie oft, es war ein Problem mit variabler Bereich (ungerade Sachen seit Variablen wurden noch definiert, aber überschrieben. Ich habe nicht mehr untersucht, um vollständig zu verstehen). Der folgende Code funktioniert wie erwartet (alle Einschränkungen der Taschen berücksichtigt):

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)},) 
Verwandte Themen