AnyMath 文档
Notebook

合成排队系统发生器

导言

在排队理论的问题中,特别是在优化M/M/1型网络结构中的流分布时,源数据的质量起着关键作用:通信信道的带宽(容量)矩阵和外部应用流强度矩阵。 为了验证、测试和比较梯度法或内点法等非线性优化算法的有效性,需要生成具有拓扑、稀疏性、不对称性和系统负载等受控参数的具有代表性的测试场景集。

在此示例中,实现了合成排队系统(Cfo)的参数化生成器。 与手动生成初始矩阵不同,生成器允许您自动创建多个CFR配置,改变节点的数量,图形的连接程度,通道容量和流量的统计分布。 获得的数据以标准化导出。xlsx格式,可确保与后续分析阶段直接兼容,包括基于M/M/1模型的优化。

因此,执行此脚本的结果不仅是可视化的CFR拓扑,而且是受控的测试数据集。 这些套件的设计,特别是,用于优化排队系统的算法的质量,收敛性和性能的定量测试,使他们能够评估其稳定性与不同程度的稀疏性,信道不对称性和竞

CFR结构

排队系统的结构可以表示为网络大小的方阵 :

哪里 -网络中的节点数, -连接节点的通信信道(图分支)的总带宽,并从具有编号的节点定向 到编号的节点 .

排队系统中的流向也可以表示为大小的方阵 :

哪里 -网络中的节点数, -从带编号的节点引导的流量 到编号的节点 .

通常,在实际系统中没有循环流(从节点寻址到自身的流),矩阵的对角线分别为零。 然而,对于额外的实验,在这个例子中可以生成具有非零对角线的矩阵。

附加文件和库

我们将附加必要的库。 在这个例子中,我们将需要库。:

  • LinearAlgebra-用于矩阵运算;
  • XLSX, Printf-用于数据输出和保存;
  • Graphs, Colors, GraphPlot, SimpleWeightedGraphs-用于以图形的形式显示CFR。
In [ ]:
# EngeePkg.purge()

neededLibs = ["XLSX", "Graphs", "Colors", "Printf", "GraphPlot", "LinearAlgebra", "SimpleWeightedGraphs"]
for lib in neededLibs
    try
        eval(Meta.parse("using $lib"))
    catch ex
        Pkg.add(lib)
        eval(Meta.parse("using $lib"))
    end
end

我们还将附加功能所需的文件。:

flGplot.jl, flowGraph.jl, "netGraph.jl", nGplot.jl, sGplot.jl", simpGraph.jl -用于以图表的形式显示CFR;

optiwrite.jl, "readqs.jl", qsdata.jl-用于数据输出和保存。

In [ ]:
foreach(include, ("flGplot.jl", "flowGraph.jl", "netGraph.jl", "nGplot.jl", "optiwrite.jl", "readqs.jl", "sGplot.jl", "simpGraph.jl","qsdata.jl"))

初始参数

让我们定义初始数据。

邻接矩阵的参数:

*节点数
*矩阵的稀疏程度(一个参数,用于设置节点之间连接的随机归零迭代次数,从而调节网络拓扑的密度)
*条件:对角线是否为零(是否有循环)
*条件:矩阵是否对称(对于每条传出通信线路都有一条传入通信线路);

通信线路容量参数:

*容量矩阵是否对称(传出和传入通信线路的容量是否等于每个节点)
*条件:容量是否相同(通信线路的所有容量是否相等,如果相等,则等于最小容量的值)
*最低容量
*最大容量;

流量参数:

*条件:是否有循环流
*条件:流量是否相同(所有流量的强度是否相等,如果相等,则等于最小流量的值)
*最小流量
*最大流量
*流矩阵的稀疏程度;

In [ ]:
# 邻接矩阵的参数
узлов = 9  # 节点数
разр = 2  # 稀疏程度
диаг = true  # 对角线是否为零
симм = false  # 矩阵对称吗

# 通信线路容量参数
симм_ёмк = false  # 容量矩阵是否对称
равно_ёмк = false  # 容量是否相同
мин_ёмк = 1.0     # 最低容量
макс_ёмк = 12.0     # 最大容量
диаг_поток = false # 循环流

# 流量参数
равно_поток = false # 流量是否相同
мин_поток = 1.5  # 最小流量
макс_поток = 5.5  # 最大流量
разр_поток = 4   # 流矩阵的稀疏程度
Out[0]:
4

矩阵生成函数

让我们定义一个接受初始数据的函数,并根据它们返回通信线路的容量和邻接矩阵,以及流的方向和强度矩阵。

In [ ]:
function RandQ(qN, spL, dZ, sM, syBw, smBw, minBw, maxBw, dZf, smFl, minFl, maxFl, spFl)

# 创建一个1和0的矩阵
rM = ones(qN, qN)
for n = 1:spL
    rM = rM .* rand(0:1, qN, qN)
end

# 对角线上的零
if dZ
    for m in 1:qN
        rM[m, m] = 0
    end
end

# 邻接矩阵的对称性
    if sM
        for p in 1:qN
            for q in p:qN
                rM[q, p] = rM[p, q]
            end
        end
    end

# 通信线路的容量
if smBw
    nM = minBw .* rM
else
    nM = (minBw .+ (maxBw .- minBw) .* rand(qN)) .* rM
end

# 邻接矩阵的对称性
if syBw
    for p in 1:qN
        for q in p:qN
            nM[q, p] = nM[p, q]
        end
    end
end

# 流动方向矩阵
if smFl
    flM = minFl .* rand(0:1, qN, qN)
else    
    flM = minFl .+ (maxFl .- minFl) .* rand(qN, qN)
end

# 流向矩阵的稀疏性
for n in 1:spFl
        flM = flM .* rand(0:1, qN, qN)
end

# 流向矩阵的零对角线
if dZf
    for m in 1:qN
        flM[m, m] = 0
    end
end

return nM, flM
end
Out[0]:
RandQ (generic function with 1 method)

创建和保存矩阵

参考矩阵生成函数,我们将根据指定的数量创建几对矩阵(邻接和流)。 将创建的矩阵保存到xlsx文件:

  • NetMatrix.xlsx -通信线路的容量和邻接矩阵;

  • FlowMatrix.xlsx-流动的强度和方向矩阵。

    每个新矩阵都在每个xlsx文件的新工作表中创建。 每个文件中的张数对应于矩阵对的数量。

In [ ]:
количество = 3   # 要创建的矩阵对的数量
QS =  zeros(Float64, узлов, узлов, количество)
Flows = zeros(Float64, узлов, узлов, количество)
for q in 1:количество
    nM, flM = RandQ(узлов, разр, диаг, симм, симм_ёмк, равно_ёмк, мин_ёмк, макс_ёмк, диаг_поток, равно_поток, мин_поток, макс_поток, разр_поток)
    QS[:,:,q] = nM
    Flows[:,:,q] = flM
end
optiwrite(QS, "NetMatrix.xlsx", "Net")
optiwrite(Flows, "FlowMatrix.xlsx", "Flow")

可视化

我们将显示CFR参数,以及以图形的形式显示它们。:

*结构简化视图;
*显示通信线路方向和容量的结构的全视图;
*流动的强度和方向。

In [ ]:
n = 1 # 矩阵对的编号
СМО, Потоки = qsdata(n)
и, п = simpGraph(СМО);
Граф = sGplot(и, п)
display(Граф)
s, t, bW = netGraph(СМО);
ГрафСМО = nGplot(s, t, bW, "Структура системы массового обслуживания");
display(ГрафСМО)
nfl, nl, flG, flI = flowGraph(Потоки);
ГрафПотоков = flGplot(flG, flI, nl, "Направления потоков");
display(ГрафПотоков)
В системе  массового обслуживания

узлов: 9
потоков: 4
линий связи: 19
In [ ]:
n = 2 # 矩阵对的编号
СМО, Потоки = qsdata(n)
и, п = simpGraph(СМО);
Граф = sGplot(и, п)
display(Граф)
s, t, bW = netGraph(СМО);
ГрафСМО = nGplot(s, t, bW, "Структура системы массового обслуживания");
display(ГрафСМО)
nfl, nl, flG, flI = flowGraph(Потоки);
ГрафПотоков = flGplot(flG, flI, nl, "Направления потоков");
display(ГрафПотоков)
В системе  массового обслуживания

узлов: 9
потоков: 10
линий связи: 17
In [ ]:
n = 3 # 矩阵对的编号
СМО, Потоки = qsdata(n)
и, п = simpGraph(СМО);
Граф = sGplot(и, п)
display(Граф)
s, t, bW = netGraph(СМО);
ГрафСМО = nGplot(s, t, bW, "Структура системы массового обслуживания");
display(ГрафСМО)
nfl, nl, flG, flI = flowGraph(Потоки);
ГрафПотоков = flGplot(flG, flI, nl, "Направления потоков");
display(ГрафПотоков)
В системе  массового обслуживания

узлов: 9
потоков: 5
линий связи: 18

因此,通过设置自己的初始参数,您可以以方便的xlsx格式创建自己的矩阵对,将其结构可视化为图形,并将其用于进一步研究。

结论

排队系统生成器为研究人员和工程师提供了一个工具,用于快速创建具有广泛拓扑和负载特性的合成但统计上合理的CFR配置。 以标准化格式生成多个矩阵对(容量—流量)的能力确保了实验的可重复性,并作为各种优化算法的比较分析的基础。

除了测试优化算法的性能和质量的任务外,所提出的生成器还可以在以下领域实际应用:

*电信网络设计-在选择拓扑和预留信道时生成多个负载场景。

*物流和供应链管理-用于建模具有不同物流枢纽容量的替代交付路线。

*教育过程-创建关于排队理论和优化方法的单独作业。

*分析模型的验证-通过将合成数据上的优化结果与特殊情况下的已知分析解决方案进行比较。

*优化算法的软件实现的负载测试-在增加问题维度(节点和线程数)以及图的稀疏程度时评估其稳定性。

因此,本例提出的算法不仅是数据准备的辅助工具,而且是系统研究排队系统属性和数值优化器在不同结构复杂度条件下的行为的独立工具。