我想创建一个网络,其中包含ned文件中节点的随机位置(x,y)。起初,我不想在节点之间创建任何链接。我知道设置参数x,y并编写硬编码的每个节点都可以。但我想自动完成
network Network {
submodules:
node1:Node {
@display("p=250,300");
}
node2:Node {
@display("p=591,450");
}
node3:Node {
@display("p=213,150");
}
}
希望将此转变为:
network Network {
submodules:
for i=0..50 {
node[i]:Node{
@display("p=randomX,randomY");
}
}
答案 0 :(得分:2)
通常,通过NED和INI配置文件配置这种随机放置。但是您也可以在NED文件中执行此操作,看一下将在没有任何其他框架的情况下在纯OMNeT ++中运行的示例:
network Random
{
parameters:
int n @prompt("Number of nodes") = default(10);
volatile int posX = intuniform (0,100);
volatile int posY = intuniform (0,100);
submodules:
node[n]: Node{
parameters:
@display("p=$posX,$posY");
}
}
每次定位节点时,这将从0到100之间的均匀分布中绘制一个整数。 ``volatile```是必要的,允许多次评估参数表达式(Update test results for a test run)。
如果需要,您还可以参数化非均匀分布的最小值和最大值。
重要提示: check the OMNeT Simulation Manual for additional infos(以及一般的模拟框架)只是伪随机性。随机数生成器使用种子值来开始计算随机数流。如果种子相同,则绘制的随机数相同。因此,每次开始模拟时,您都会看到相同的随机节点位置。这不是一个错误,而是一个重要的功能,可以实现重复的模拟运行和一般的实验的可重复性。如果您想在NED或INI变量中使用不同的随机值,那么您可以修改种子起始值,使其在每次运行时都不同。
您可以(例如)使用进程ID作为种子起始值。每次开始模拟(运行OMNeT GUI)时,都会生成(希望不同的)进程ID并将其用作种子起始值。
在相应的omnetpp.ini
文件中插入以下行:
seed-set = ${processid}
如果您想在之后添加随机连接,请查看OMNeT ++示例中的neddemo
文件夹。它有一个很好的随机连接示例,也解释了Randomness in OMNeT++。