CPLEX投资优化约束失效与品类选择限制实现咨询
CPLEX投资项目选择优化问题解决方案
核心问题修复说明
你现有代码的核心问题是缺少代表项目是否被选中的0-1决策变量,所有求和逻辑都是直接对全部项目计算,自然无法实现按选择结果计算的约束规则。
1. 总投资上限约束失效修复
- 新增0-1决策变量声明
dvar boolean x[Project];,其中x[p]=1代表选中项目p,x[p]=0代表未选中项目p - 目标函数、投资约束都需要乘以对应
x[p],仅将选中的项目计入总Impact和总投资 - 原代码中重复的
forall循环属于逻辑冗余,会重复执行12次完全相同的总投资约束,直接删除即可
2. 单品类最多选2个项目约束实现
- 将原代码中
string类型的Category改为int类型,降低分组匹配开销 - 遍历所有品类,约束每个品类下所有项目的
x[p]之和≤2
修正后完整可运行代码
int NumberofProjects = 12; range Project = 1..NumberofProjects; // 12个不同项目 // 参数声明 float Impact[Project] = [0.1, 0.03, 0.07, 0.13, 0.01, 0.04, 0.07, 0.08, 0.15, 0.12, 0.02, 0.04]; // 待最大化的影响值 float Investment[Project] = [2.0, 1.6, 2.5, 12.0, 10.3, 0.6, 1.2, 1.9, 4.0, 5.0, 0.2, 0.5]; // 项目投资成本,总投资上限为8.0 int Category[Project] = [1,1,1,1,1,2,2,2,3,3,3,3]; // 项目所属品类 float Budget = 8.0; // 决策变量定义 dvar boolean x[Project]; // 目标函数:最大化选中项目的总Impact值 maximize sum(p in Project) Impact[p] * x[p]; // 约束条件 subject to { // 总投资不超过预算上限 sum(p in Project) Investment[p] * x[p] <= Budget; // 每个品类最多选中2个项目 forall(c in 1..3) sum(p in Project: Category[p]==c) x[p] <= 2; }
扩展优化提示
如果后续品类数量有调整,可通过代码自动提取所有独立品类值,不需要手动写死1..3的遍历范围,适配性更强。
内容的提问来源于stack exchange,提问作者BST
相关产品推荐
相关产品推荐

