纸浆优化问题 - 约束问题

Pulp Optimization Problem - Constraint Problems

我正在使用 PuLP 创建优化函数来优化投资组合。我有一个资产列表,每个资产都具有以下流动性水平之一 [1、2、3]。

我正在尝试创建一个约束条件,即至少 20% 的投资组合需要具有 1 级流动性。

我创建了一个保存了 {'Asset':Level} 的字典(流动性),并试图用它和资产变量(asset_vars)创建约束,这是一个Lp变量。

asset_vars = pl.LpVariable.dicts("Assets", asset_list,lowBound=0, upBound=1, cat='Integer')

prob += pl.lpSum([liquidity[f] * asset_vars[f] for f in asset_vars]) >= ?

我知道我现在的设置并不接近我需要做的,但是,我很难找到/提出解决方案。

鉴于您的资产,您已经知道每项资产的流动性水平。您只需要确保至少 20% 的投资组合是由流动性级别为 1 的资产构成的。
您可以使用以下约束来做到这一点。

prob += pl.lpSum(asset_vars[f] for f in asset_vars if liquidity[f]==1) >= 0.2 * pl.lpSum(asset_vars[f] for f in asset_vars)

假设您有 6 项资产,x1,x2,x3,x4,x5,x6,其中 x1 是唯一与流动性级别为 1 的资产相关联的资产。 约束将是:

x1 >= 0.2*(x1 + x2 + x3 + x4 + x5 + x6)
0.8*x1 >= 0.2*(x2 + x3 + x4 + x5 + x6)

这实质上意味着:对于我采用的每个流动性水平为 1 的资产,我不能采用超过 4 个流动性水平不同于 1 的资产