You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 15:36:03