Docplex建模时目标函数无需直接包含变量的实现方案咨询
解决方案
首先明确数学规划的基本规则:优化模型的目标函数必须和决策变量存在关联才能求解,否则求解器无法判断不同x取值的优劣,只能返回任意可行解。根据你的场景,可对应选择以下两种方案:
方案1:按业务规则正确关联决策变量到目标函数
你提到r[i]、v[i]是决策变量x[i]对应的收益率、方差,本质上只有当x[i]被选中/配置时,对应的r[i]、v[i]才需要计入目标,因此用x[i]作为权重乘入目标项是完全合理的逻辑,不会对运算产生额外干扰:
- 如果x[i]代表「是否选择资产i」的0-1变量,直接调整目标函数为你预期的形式即可:
model = Model() # 若需要0-1变量可以改成binary_var_dict x = model.continuous_var_dict(keys, name='invs') # 匹配你预期的∑(r[i] * v[i])关联规则,只有x[i]不为0时对应项才会被计入 model.maximize(model.sum(x[i] * return_dict[i] * var_dict[i] for i in keys))
- 如果你当前代码里的
return_dict[i] / var_dict[i]是你真实需要的收益风险比指标,现有写法已经是正确的,不需要调整。
方案2:仅需要可行解不需要优化的场景
如果你的业务确实不需要对目标做优化,只需要找到满足所有约束的任意x取值,可以直接将目标函数设为常数,此时求解器会跳过优化逻辑直接返回可行解:
model = Model() x = model.continuous_var_dict(keys, name='invs') # 这里写你的所有约束条件 # ... # 目标设为常数即可,最大化最小化都不影响结果 model.maximize(0)
内容的提问来源于stack exchange,提问作者Wagno Leao Sergio
相关产品推荐
相关产品推荐

