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

如何在OPL CPlex中更新受损线路集合元素?

在OPL CPLEX中实现受损线路集合的动态更新

问题背景

初始时刻t=1时,受损线路集合为damagelines = {1,5,8,10,25};当t=2时,线路l=5被修复(二进制变量rep[l][t]=1表示该线路已修复),需要将受损线路集合更新为{1,8,10,25}。

实现方案

1. 模型内动态计算集合(适合约束/目标函数使用)

通过集合推导式,基于初始受损集合和修复变量的取值,直接推导对应时刻的受损线路集合:

// 定义所有线路范围
{int} Lines = {1..25};

// t=1时的初始受损线路集合
{int} damagedLines_t1 = {1,5,8,10,25};

// 修复变量:rep[l][t] = 1 表示线路l在时刻t已修复
dvar boolean rep[Lines][1..2];

// 推导t=2时的受损线路集合:保留初始集合中未被修复的线路
{int} damagedLines_t2 = {l in damagedLines_t1 | rep[l][2] == 0};

2. 脚本中动态更新集合(适合求解过程/结果输出)

在OPL的main脚本块中,通过遍历初始集合并筛选未修复线路,手动更新集合:

// 先定义基础数据与变量
{int} Lines = {1..25};
{int} damagedLines_t1 = {1,5,8,10,25};
dvar boolean rep[Lines][1..2];

main {
  var model = thisOplModel;
  
  // 初始化t=1的受损线路集合
  var currentDamaged = new IloIntSet(model.env, damagedLines_t1);
  writeln("t=1 受损线路集合: ", currentDamaged);
  
  // 模拟线路5在t=2时完成修复(设置rep[5][2]的值为1)
  model.rep[5][2].setValue(1);
  
  // 构建更新后的受损线路集合
  var updatedDamaged = new IloIntSet(model.env);
  for(var line in currentDamaged) {
    if (model.rep[line][2].getValue() == 0) {
      updatedDamaged.add(line);
    }
  }
  
  writeln("t=2 更新后的受损线路集合: ", updatedDamaged);
}

说明

  • 第一种方式利用OPL的集合推导特性,集合会自动随修复变量的取值变化而更新,适合在模型约束或目标函数中直接引用。
  • 第二种方式通过脚本逻辑手动更新集合,更灵活,适合需要在求解过程中动态调整集合、或者输出结果时使用。

内容的提问来源于stack exchange,提问作者Vandana Kumari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 20:33:22