微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Omnet++ - 在初始化 (.ini) 文件中访问不同模块的参数并使用 for 循环

如何解决Omnet++ - 在初始化 (.ini) 文件中访问不同模块的参数并使用 for 循环

我需要生成流量的泊松到达,因此需要相应地设置客户端中应用程序的启动时间。为此,我需要两件事:

1. access parameters of different modules and use them as input for defining a parameter of another module
2. use a for loop to define parameters of modules

例如- 下面的例子展示了我想要做什么。 我有 100 个客户端,每个客户端有 20 个应用程序。我想设置第一个客户端的第一个应用程序的开始时间,想用循环写其余的。

// iat = interarrivalTime
**.cli[0].app[0].startTime = 1 // define this
**.cli[0].app[1].startTime = <**.cli[0].app[0].startTime> + exponential(<iat>) 
**.cli[0].app[2].startTime = <**.cli[0].app[1].startTime> + exponential(<iat>)
.
.
.
**.cli[n].app[m].startTime = <**.cli[n].app[m-1].startTime> + exponential(<iat>)

我查看了 'ned' 函数,但找不到任何解决方案。

当然我可以写一个脚本来硬编码几个客户端的启动时间,但是这个脚本会输出一个巨大的文件,如果客户端和应用程序的数量太多,这个文件很难管理。

谢谢!

解决方法

INI 文件基本上是模式匹配器。每次初始化模块时,INI 文件中每一行的 = 符号左侧都会与实际模块路径匹配,从 INI 文件的开头开始。在从头开始的第一个匹配中,该行的右侧用作参数的值。

简而言之,这些不是赋值操作,而是告诉每个模块如何初始化它们自己的参数的规则。例如,它是未定义的,在初始化期间这些行将按什么顺序使用。 INI 文件中较早的内容在模块初始化期间必须较早使用。当然,这可以防止您引用其他模块的参数。事实上,您可能根本不使用任何其他参数。

简而言之,INI 文件是声明性的,而不是过程结构,因此不能在此处使用交叉引用、循环和其他过程结构。

如果您想在模块参数之间创建依赖关系,您可以在模块的 initialize() 方法中进行编码,方法是从 C++ 代码中显式初始化一个参数。您可以使用 C++ API 访问任何其他模块的参数。

当然,如果您不想修改现有应用程序,这不是最佳解决方案,但是您可以创建一个单独的模块来负责您的“过程”初始化,并且该单独的模块可以运行所有应用程序和根据需要设置所需的参数。这种方法在 INET 中必须计算初始化数据的几个地方使用。一个值得注意的例子是路由表信息的计算。例如Ipv4FlatNetworkConfigurator

另一种方法是使用 Python 等脚本语言来设置和配置您的模拟。但是,OMNeT++(尚)不支持此功能。

长话短说,编写一个配置器模块并在那里进行初始化。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。