2016-08-05 25 views
0

ich auf einem Minimum-Varianz-Optimierungsproblem in Python arbeite CVXPY verwenden, dieDynamische Liste von Einschränkungen in CVXPY erzeugen

constraints = [ 
       sum_entries(w) == 1, 
       w[0:5] >0.05, 
       w[1] > 0.05, 
       w[6] == 0, 
       sum_entries(w[country_mappings['France']]) == 0.39, 
       w >= 0,positive 
       w[country_mappings['France']] > 0.12 
      ] 

Mit w ist in Form von

w = Variable(n) 
nimmt in Zwänge in Form von

Um dies effizienter zu machen, möchte ich meine Liste von Constraints dynamisch basierend auf einer Datei erstellen, in der ich meine Einstellungen speichern werde. Einlesen und die Schaffung ein Constraints Liste funktioniert gut, und von

type(constraints) 

mit es zeigt

<type 'list'> 

Aber ein Blick auf den tatsächlichen Einträgen es

[EqConstraint(Expression(AFFINE, UNKNOWN, (1, 1)), Constant(CONSTANT, 
POSITIVE, (1, 1))), LeqConstraint(Constant(CONSTANT, POSITIVE, (1, 
1)), Expression(AFFINE, UNKNOWN, (5, 1))), 
LeqConstraint(Constant(CONSTANT, POSITIVE, (1, 1)), 
Expression(AFFINE, UNKNOWN, (1, 1))), EqConstraint(Expression(AFFINE, 
UNKNOWN, (1, 1)), Constant(CONSTANT, ZERO, (1, 1))), 
EqConstraint(Expression(AFFINE, UNKNOWN, (1, 1)), Constant(CONSTANT, 
POSITIVE, (1, 1))), LeqConstraint(Constant(CONSTANT, ZERO, (1, 1)), 
Variable(10, 1)), LeqConstraint(Constant(CONSTANT, POSITIVE, (1, 1)), 
Expression(AFFINE, UNKNOWN, (3L, 1L)))] 

enthält, während Mine in diesem Format ist

['sum_entries(w) == 1', 
'w[0:5] > 0.05', 
'w[1] > 0.05', 
'w[6] == 0', 
'sum_entries(w[country_mappings['France']]) == 0.39', 
'w >= 0', 
'w[country_mappings['France']] > 0.12' 
] 

Der verwendete Code in den Daten zu lesen ist

def read_in_config(filename): 
    with open(filename) as f: 
     content = f.read().splitlines() 
    return content 

Wer weiß, wie dies getan werden kann? Das Problem besteht darin, dass w im Variablenformat von CVXPY vor der Verwendung verwendet wird.

+0

(1) Sie haben den für das Lesen/Schreiben zuständigen Code nicht angezeigt. Vielleicht solltest du. (2) Die tatsächlichen Einträge sind tatsächlich genau das, was Sie formuliert haben. Es ist die interne Darstellung. (3) Diese Constraints/interne Repräsentation hängt möglicherweise von den Variablenobjekten ab, also hoffe ich, dass Sie sie auch speichern. Wird möglicherweise automatisch abgerufen, wenn Sie Essiggurken verwendet haben. (4) Erzählen Sie mehr darüber, was Sie eigentlich tun möchten? Ersetzen Sie * w * nach dem Lesen der Einschränkungen? [cvxpy] (www.cvxpy.org) unterstützt Parameter, um so etwas zu tun. Andere mögliche Ansätze basieren auf Pythons Eval, was beängstigend ist! – sascha

+0

1.) Ich habe den Code hinzugefügt, der meine Daten einliest. 2.) Die Frage, wie ich meine String-Listenelemente in die CVXOPT-Variablen umwandle? 4.) Ich löste ein minimales Varianzproblem, w ist ein Vektor von Gewichten, der mir den optimalen Anteil einer Aktie sagt, alle Gewichte summieren sich zu 1. Hoffe das klärt ein bisschen mehr was ich versuche zu tun – ThatQuantDude

+0

Das sieht Komisch, liest du deine Einschränkungen so? Ich war sicher, du hättest Gurke benutzt. So bekomme ich immer noch nicht alle Punkte. Ich denke, du willst deine Constraints einmal erstellen, die Constraints einlesen, w auswählen und lösen. Also warum willst du das so machen? Irgendwelche wirklichen Gründe (anstatt nur das Problem in Abhängigkeit von einem gegebenen w zu formulieren)? Abhängig von der Art von w, wird es nicht wirklich eine Beschleunigung geben. Und du solltest deinen Text sicherlich ändern, da es mir scheint, dass du cvxpy verwendest (das intern cvxopt benutzt), nicht cvxopt. Das macht mich verrückt! – sascha

Antwort

1

Ok, also habe ich eine Lösung gefunden, die funktioniert.

One in den Zwängen lesen kann und einen String verketten wie zu bekommen s.th

'constraints = [sum_entries(w) == 1,w[0:5] > 0.05,w[1] > 0.05,   
w[6] == 0, sum_entries(w[country_mappings['France']]) == 0.39, 
w >= 0, w[country_mappings['France']] > 0.12 ]' 

Dann benutzen Sie einfach

exec 'string from above' 

ich exec wissen, ist nicht die sicherste Option zu verwenden, aber es funktioniert . W muss im Code definiert werden

w = Variable(n)