[英]cvxpy integer variable - exclude certain integer values from the solution
我有以下問題,我不知道 cvxpy 是否可以做我需要的。 背景:我優化投資組合。 在購買債券和優化每只債券的購買數量時,每只債券只能以1,000個單位的倍數購買。 但是,大多數情況下需要購買的最低件數為 10,000。 這意味着我們要么根本不購買債券,要么購買它,購買的數量必須是 10,000、11,000、12,000 等等。 有沒有辦法(似乎沒有)限制整數變量可能具有的可能解決方案中的某些值? 所以讓我們假設我們有一個非負的整數變量 x。 我們基本上想購買 1000x 但我們知道 x 可以是 x = {0, 10, 11, 12, ...} 是否可以跳過值 1.. 9 而不添加其他變量?
例如:
import numpy as np
import pandas as pd
import cvxpy as cvx
np.random.seed(1)
# np.random.rand(3)
p = pd.DataFrame({'bond_id': ['s1','s2', 's3', 's4', 's5', 's6', 's7','s8','s9', 's10'],
'er': np.random.rand(10),
'units': [10000,2000,3000,4000,27000,4000,0,0,0,0] })
final_units = cvx.Variable( 10, integer=True)
constraints = list()
constraints.append( final_units >= 0)
constraints.append(sum(final_units*1000) <= 50000)
constraints.append(sum(final_units*1000) >= 50000)
constraints.append(final_units <= 15)
obj = cvx.Maximize( final_units @ np.array(list(p['er'])) )
prob = cvx.Problem(obj, constraints)
solve_val = prob.solve()
print("\n* solve_val = {}".format(solve_val))
solution_value = prob.value
solution = str(prob.status).lower()
print("\n** SOLUTION 3: {} Value: {} ".format(solution, solution_value))
print("\n* final_units -> \n{}\n".format(final_units.value))
p['FINAL_SOL'] = final_units.value * 1000
print("\n* Final Portfolio: \n{}\n".format(p))
這個解決方案是我面臨的問題的一個非常簡化的版本。 最終向量 final_units 可以建議值,如本例中我們必須購買 5,000 單位的債券 s9,但我不能,因為我可以購買的最小值是 10,000。 我知道我可以添加一個額外的整數向量來表達 OR 條件,但實際上我真正的問題比這大得多,我已經有數千個整數變量了。 因此,我想知道是否有辦法排除 1 到 9 之間的值而不向問題添加額外的變量。 謝謝
不,不是 CVXPY。 您可以使用整數變量x[i]
加上二進制變量y[i]
對其進行建模,並使用約束(以數學符號表示):
y[i] * 10 <= x[i] <= y[i] * 15
這導致 x[i] ∈ {0, 10..15}。
一些求解器為此提供了一個變量類型:半整數變量。 使用它,您不需要額外的二進制變量和這 2 個約束。 CVXPY 不支持這種變量類型 AFAIK。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.