簡體   English   中英

cvxpy 整數變量 - 從解決方案中排除某些整數值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM