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
相关产品推荐
相关产品推荐

