2016-08-05 21 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 

有沒有人知道如何做到這一點?問題是在使用CVXPY的變量格式之前獲取w。

+0

(1)您沒有顯示負責讀/寫的代碼。也許你應該。 (2)實際的條目實際上正是你制定的。這是內部表示。 (3)這些約束/內部表示可能取決於變量對象,所以我希望你也保存它們。如果您使用過酸菜,可能會自動提取。 (4)更多地瞭解你實際上想做什麼?在閱讀約束條件後替換* w * [cvxpy](www.cvxpy.org)支持參數來做類似的事情。其他可能的方法是基於python的eval,這是可怕的! – 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)