RNG种子的选择对模拟结果影响很大



我第一次在Omnet++5.4中开发一个模拟,它利用了可用的queueinglib库。特别是,我构建了一个简单的模型,它可以理解服务器和一些被动队列。

我已经重复了不同的模拟次数,设置了不同的种子和参数,正如Omnet模拟手册中所写的,这是我的omnetpp.ini:

# specify how many times a run needs to be repeated
repeat = 100
# default: different seed for each run
# seed-set = ${runnumber}
seed-set = ${repetition} # I tried both lines
OppNet.source.interArrivalTime = exponential(${10,5,2.5}s)

这将为interArrivalTime分布参数的每个值产生300次运行,100次重复。

然而,我观察到了一些"奇怪"的行为,即根据RNG种子,由此产生的统计数据是高度可变的。例如,考虑到我的模型中队列的长度,我在大多数运行中的值都小于10,而在其他一些运行中,平均值在数量级上不同(85000、45000?)。

这是否意味着我的实现是错误的?或者,随机种子选择可能会对模拟结果产生如此大的影响?

任何帮助或提示都将不胜感激,谢谢。

我不能排除您的实现在没有看到它的情况下是错误的,但完全有可能您只是碰巧配置了一个混乱的场景。在这种情况下,是的,输入的任何微小变化(在本例中为PRNG种子)都可能导致结果的重大差异。

编辑

特别是考虑到给定的(非平凡的)排队网络,如果你改变"负载"(传入作业/消息的数量/速率,带有一些随机分布),你可能会在结果中观察到不同的"状态":

  • 负载很轻,几乎没有排队
  • 在负载非常大的情况下(关闭或达到最大容量),大多数队列几乎总是被加载,甚至不断无限制地增长
  • 在两者之间的某个地方,你可能会得到这种不稳定的行为,有时几个队列突然变得很深,然后被清空,然后加载不同的队列,等等;作为时间、PRNG种子或两者的函数——这就是我所说的混沌

但这只是猜测。。。

没有人能在没有看到的情况下说出你的实现是对是错。然而,有一些适用于队列的通用规则你应该知道。您说您正在更改interArrivalTime分布参数。排队中一个非常重要的概念是流量强度,它是到达率与服务率的比率。如果这个比率小于1,那么线路长度可能会有很大的变化,但从长远来看,队列清空时会有时间间隔,因为平均而言,服务器可以处理的客户比到达的客户多。这是一个稳定的队列。但是,如果该比率大于1,则队列将无限增长。系统运行的时间越长,线路就越长。令许多人惊讶的是,当交通强度等于1时,这条线也会渐近地无穷大。

另一件需要知道的事情是,对于一个稳定的队列,交通强度越接近1,可变性就越大。这是因为平均值会增加,但总有一段时间的线路长度为零,如上所述。为了使零始终存在但平均值不断增加,队列长度必须有时超过平均值,这意味着可变性必须不断增加。更改随机数种子可以让您了解在任何时间段可能出现的方差大小。

这里的底线是,你可能只是看到了排队比你想象的更奇怪、更多变的证据。

最新更新