CPLEX建模求助:如何随机生成流服务链及λf等相关参数
CPLEX 流与服务链参数随机生成实现
对应论文核心定义:
- 流$f \in F$是从源到目的的数据包序列,发送速率为$\lambda_f$
- 流$f$的服务链为有序NF序列$\vec{S}[f] = (S[1][f], S[2][f], ..., S[J[f]][f])$,$J[f]$为服务链长度,每个$S[j][f] \in V$为链上第j个网络功能类型
你已经完成的基础集合定义无需修改,后续参数按规则生成的完整OPL代码如下:
// 已完成的基础参数定义 int F = 50; range Nuflow = 1..F; int V = 5; range Nuvnf = 1..V; // 随机数初始化:固定种子可复现实验结果,不需要可删除 int random_seed = 202406; execute { opl.setRandomSeed(random_seed); } // -------------------------- // 参数1:流到达速率lambda[f],服从均值0.5的对数正态分布 // 对数正态分布参数换算:取对数后服从正态分布N(ln_mu, sigma^2) // 网络流量建模场景下sigma取常用值0.2,若论文给定方差可直接修改该值 float sigma = 0.2; float ln_mu = Math.log(0.5) - sigma*sigma/2; float lambda[Nuflow]; execute { for (var f in Nuflow) { // Box-Muller法将0-1均匀分布随机数转换为标准正态分布 var u1 = opl.rand(); var u2 = opl.rand(); var std_norm = Math.sqrt(-2*Math.log(u1)) * Math.cos(2*Math.PI*u2); // 转换为目标对数正态分布 lambda[f] = Math.exp(ln_mu + sigma * std_norm); } } // -------------------------- // 参数2:服务链长度J[f],取值范围2-4的随机整数 int max_chain_length = 4; int J[Nuflow]; execute { for (var f in Nuflow) { // opl.rand(3)生成0/1/2随机整数,加2后得到2/3/4 J[f] = 2 + opl.rand(3); } } // -------------------------- // 参数3:服务链序列S[j][f],每个位置从V种NF中随机选取 range ChainPos = 1..max_chain_length; int S[ChainPos][Nuflow]; execute { for (var f in Nuflow) { // 填充有效服务链位置 for (var j=1; j<=J[f]; j++) { // opl.rand(V)生成0~V-1随机整数,加1匹配1~V的NF索引 S[j][f] = 1 + opl.rand(V); } // 超出实际链长的位置标记为0,作为无效位后续建模跳过即可 for (var j=J[f]+1; j<=max_chain_length; j++) { S[j][f] = 0; } } }
实现注意事项
- 固定随机种子是学术实验的通用做法,保证多次运行代码生成的拓扑、流量参数完全一致,方便结果复现;如果需要每次生成不同的随机参数,删除
setRandomSeed相关代码即可。 - 服务链存储采用固定最大长度的二维数组,不需要实现OPL中较复杂的可变长数组结构,后续写约束时只需要遍历到
J[f]位置,或者增加S[j][f] != 0的判断即可跳过无效位。 - 当前实现允许同一条服务链中出现重复类型的NF,如果论文要求服务链内NF类型不重复,只需要在生成
S[j][f]的循环中增加去重判断,排除已经选过的NF类型即可。 - 如果论文中明确给出了对数正态分布的标准差/方差参数,只需要修改代码中
sigma的取值,重新计算ln_mu即可匹配要求的分布。
内容的提问来源于stack exchange,提问作者Mahsa
相关产品推荐
相关产品推荐

