Как создать случайно связанный граф в OMNeT ++? - PullRequest
1 голос
/ 09 ноября 2019

Я пытаюсь создать граф со случайно соединенными узлами. Узлы должны быть подключены случайным образом, и если узел уже подключен к другому узлу, он не должен снова подключаться к тому же узлу, используя другой порт inout.

В документах естьВот этот пример для создания случайного графа:

module RandomGraph {
    parameters:
        int count;
        double connectedness; // 0.0<x<1.0
    submodules:
        node[count]: Node {
            gates:
                in[count];
                out[count];
        }
    connections allowunconnected:
        for i=0..count-1, for j=0..count-1 {
            node[i].out[j] --> node[j].in[i]
                if i!=j && uniform(0,1)<connectedness;
        }
}

Но этот метод может соединять одни и те же два узла несколько раз, используя разные порты, а это не то, что мне нужно.

connected nodes

Как видно из приведенного выше снимка экрана, node1 подключен к node6 через два разных порта.

Я не хочу этого поведения, потому что в своем коде я отправляю сообщение всемиз портов, используя цикл for, который затем отправляет одно и то же сообщение дважды одному и тому же узлу.

Я мог бы попытаться удалить несколько соединений с одним и тем же узлом в функции initialize() Я думаю, я просто подумал об этом, пока ясоздаю этот пост. Я еще не пробовал, но буду и буду делиться результатом. Я также хотел бы услышать ваши решения.

1 Ответ

1 голос
/ 10 ноября 2019

Пример, который вы использовали, должен быть исправлен в руководстве. Внутренний цикл for должен начинаться с текущего значения индекса во внешнем цикле. Кроме того, оператор ++ должен использоваться для шлюзов, потому что согласно Руководству OMNeT ++:

Обозначение gatename ++ вызывает использование первого индекса неподключенного гейта.

Благодаря ++ нет необходимости поддерживать индекс шлюза для подключения.
Последнее изменение: оба входных и выходных вентиля должны быть подключены при выполнении условия.
Исправленный код вашего NED можетвыглядит так:

module RandomGraph
{
    parameters:
        int count;
        double connectedness; // 0.0<x<1.0
    submodules:
        node[count]: Node {
            gates:
                in[count];
                out[count];
        }
    connections allowunconnected:
        for i=0..count-1, for j=i..count-1, if i!=j && uniform(0,1)<connectedness {
            node[i].out++ --> node[j].in++;
            node[i].in++ <-- node[j].out++;
        }
}

РЕДАКТИРОВАТЬ
Упрощенный код, касающийся предложений @Rudi:

module RandomGraph
{
    parameters:
        int count;
        double connectedness; // 0.0<x<1.0
    submodules:
        node[count]: Node {
            gates:
                in[];  // removed the size of gate
                out[];
        }
    connections allowunconnected:
       for i=0..count-2, for j=i+1..count-1, if uniform(0,1)<connectedness {
            node[i].out++ --> node[j].in++;
            node[i].in++ <-- node[j].out++;
        }
}
...