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

CPLEX中如何使用随机函数生成含网络功能的不同流

CPLEX随机生成NF流的实现方案

原有代码问题

你写的代码存在3个核心错误,导致无法生成目标流:

  • CPLEX OPL内置的rand()函数仅返回0~1之间的浮点数,不支持传入字符串类型的集合元素作为入参
  • 原写法{rand(b) | b in V}是遍历所有NF元素执行运算,本质是全量处理而非随机抽样
  • 没有实现逻辑控制单条NF链的长度在2~4区间,也没有支持单条流包含多条独立NF链的结构

修正后可运行代码

{string} V = {"V11", "V12", "V13", "V21", "V22", "V23", "V31", "V32", "V41", "V42", "V43", 
"V51", "V52", "V53"};
const int nfCount = card(V);
range F = 1..20;

// 配置参数,可按需调整
const int minChainLength = 2;
const int maxChainLength = 4;
const int minChainPerFlow = 1;
const int maxChainPerFlow = 3;

// 建立NF索引方便随机抽样
string nfIndex[1..nfCount] = item(V, 1..nfCount);

// 数据存储结构
{string} Flow[f in F]; // 存储每条流包含的所有NF
{string} Chain[f in F][1..maxChainPerFlow]; // 存储每条流下的各条NF链
int chainRealLength[f in F][1..maxChainPerFlow]; // 记录每条链的实际长度

execute {
    // 固定随机种子保证结果可复现,需要每次生成不同结果可注释本行
    IloOplRandomSeed(42);

    for (var fIdx = 1; fIdx <= 20; fIdx++) {
        Flow[fIdx].clear();
        // 随机生成当前流包含的NF链数量
        var chainNum = Math.floor(Math.random() * (maxChainPerFlow - minChainPerFlow + 1)) + minChainPerFlow;
        
        for (var cIdx = 1; cIdx <= chainNum; cIdx++) {
            Chain[fIdx][cIdx].clear();
            // 随机生成当前链的长度,范围2~4
            var curLen = Math.floor(Math.random() * (maxChainLength - minChainLength + 1)) + minChainLength;
            chainRealLength[fIdx][cIdx] = curLen;

            // 无放回抽取不重复的NF组成链
            var selectedNf = new Set();
            while (selectedNf.size < curLen) {
                var randPos = Math.floor(Math.random() * nfCount) + 1;
                selectedNf.add(nfIndex[randPos]);
            }

            // 写入存储结构
            var it = selectedNf.iterator();
            while (it.hasNext()) {
                var curNf = it.next();
                Chain[fIdx][cIdx].add(curNf);
                Flow[fIdx].add(curNf);
            }
        }
    }

    // 打印结果校验
    for (var f=1; f<=20; f++) {
        writeln("流编号", f, " 总NF集合:", Flow[f]);
        for (var c=1; c<=maxChainPerFlow; c++) {
            if (Chain[f][c].size > 0) {
                writeln("  链", c, " 长度", chainRealLength[f][c], ":", Chain[f][c]);
            }
        }
        writeln("------------------------");
    }
}

使用说明

  • 复杂随机抽样逻辑不要放在OPL声明段实现,放在execute脚本块中用JS类语法编写灵活度更高
  • 当前代码默认单条链内NF不重复,如果需要允许重复NF,把抽样部分的Set结构替换为普通数组、去掉重复校验即可
  • 如果需要每次运行生成完全不同的流,注释掉IloOplRandomSeed(42)这行即可
  • 可通过修改顶部的配置参数,调整单条流的链数量范围、单条链的长度范围

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:06:19