2016-08-05 14 views
0

Я работаю на минимальной задаче оптимизации дисперсии в Python с использованием CVXPY, которая принимает в ограничениях в видеДинамически генерировать список ограничений в CVXPY

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 
      ] 

С w быть в форме

w = Variable(n) 

Чтобы выполнить это более эффективно, я хочу динамически создать список ограничений, основанный на файле, где я буду хранить свои настройки. Считывание и создание ограничений список прекрасно работает, и с помощью

type(constraints) 

это показывает

<type 'list'> 

Но, глядя на реальных записей содержит

[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)))] 

тогда как шахта в этом формате

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

Код используется для чтения в данных

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

Кто-нибудь знает, как это можно сделать? Проблема заключается в получении w в переменном формате CVXPY, прежде чем он может быть использован.

+0

(1) Вы не указали код, ответственный за чтение/запись. Возможно тебе следует. (2) Фактические записи на самом деле именно то, что вы сформулировали. Это внутреннее представление. (3) Эти ограничения/внутреннее представление могут зависеть от переменных объектов, поэтому я надеюсь, что вы их тоже сохраните. Может быть выбрана автоматически, если вы использовали рассол. (4) Расскажите подробнее о том, что вы на самом деле пытаетесь сделать? Замена * w * после прочтения ограничений? [cvxpy] (www.cvxpy.org) поддерживает параметры, чтобы сделать что-то подобное. Другие возможные подходы основаны на eval python, что страшно! – sascha

+0

1.) Я добавил код, который читается в моих данных. 2.) Вопрос в том, как мне передать элементы списка строк в переменные CVXOPT? 4.) Я решаю задачу с минимальной дисперсией, w - вектор весов, который говорит мне об оптимальной пропорции запаса, все веса составляют до 1. Надеюсь, что это немного уточняет, что я пытаюсь сделать. – ThatQuantDude

+0

Это выглядит смешно, читаете ли вы свои ограничения? Я был уверен, что ты бы использовал марихуану. Так что я все еще не получаю все очки. Я думаю, вы хотите создать свои ограничения один раз, прочитать в ограничениях, выбрать w и решить. Так почему вы хотите сделать это так? Любые реальные причины (вместо того, чтобы просто формулировать проблему в зависимости от заданного w)? В зависимости от характера w, на самом деле не будет ускорения. И вы обязательно должны изменить свой текст, поскольку мне кажется, что вы используете cvxpy (который использует cvxopt внутри), а не cvxopt. Это сводит меня с ума! – sascha

ответ

1

Хорошо, поэтому я нашел решение, которое работает.

можно прочитать в ограничениях и конкатенации строки, чтобы получить 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 ]' 

Тогда просто использовать

exec 'string from above' 

Я знаю Exec не самый безопасный вариант для использования, но это работает , W должен быть определен в коде

w = Variable(n)