tictoc 例子理解 13-15

news2024/11/6 7:25:57

tictoc13-

    • tictoc13 子类化cMessage生成消息,随机目标地址
    • tictoc 14 在13的基础上增加两变量显示于仿真界面
    • tictoc 15 模型数据输出为直方图

tictoc13 子类化cMessage生成消息,随机目标地址

  1. 在这一步中,目标地址不再是节点2——我们绘制了一个随机的目的地,并将目标地址添加到消息中。
  2. 最好的方法是子类化cMessage并添加destination作为数据成员。
    手工编写消息类通常是令人厌烦的,因为它包含很多样板代码,所以我们让omnet++为我们生成该类。
  3. 消息类规范在tictoc13.msg——tictoc13_m.h和.cc将从这个文件自动生成。
  4. 为了延长模型的执行时间,在消息到达目的地后,目标节点将生成另一个带有随机目的地地址的消息,以此类推。
    tictoc13.msg
message TicTocMsg13
{
    int source;
    int destination;
    int hopCount = 0;
}

ned

simple Txc13
{
    parameters:
        @display("i=block/routing");
    gates:
        inout gate[];
}

network Tictoc13
{
    types:
        channel Channel extends ned.DelayChannel {
            delay = 100ms;
        }
    submodules:
        tic[6]: Txc13;
    connections:
        tic[0].gate++ <--> Channel <--> tic[1].gate++;
        tic[1].gate++ <--> Channel <--> tic[2].gate++;
        tic[1].gate++ <--> Channel <--> tic[4].gate++;
        tic[3].gate++ <--> Channel <--> tic[4].gate++;
        tic[4].gate++ <--> Channel <--> tic[5].gate++;
}

cc

#include <stdio.h>
#include <string.h>
#include <omnetpp.h>

using namespace omnetpp;

// Include a generated file: the header file created from tictoc13.msg.
// It contains the definition of the TictocMsg10 class, derived from
// cMessage.包含一个生成的文件:从tictoc13.msg创建的头文件。它包含了派生自cMessage的TictocMsg10类的定义。
#include "tictoc13_m.h"

/**
 * In this step the destination address is no longer node 2 -- we draw a
 * random destination, and we'll add the destination address to the message.
 *
 * The best way is to subclass cMessage and add destination as a data member.
 * Hand-coding the message class is usually tiresome because it contains
 * a lot of boilerplate code, so we let OMNeT++ generate the class for us.
 * The message class specification is in tictoc13.msg -- tictoc13_m.h
 * and .cc will be generated from this file automatically.
 *
 * To make the model execute longer, after a message arrives to its destination
 * the destination node will generate another message with a random destination
 * address, and so forth.
 * 1. 在这一步中,目标地址不再是节点2——我们绘制了一个随机的目的地,并将目标地址添加到消息中。
2. 最好的方法是子类化cMessage并添加destination作为数据成员。
手工编写消息类通常是令人厌烦的,因为它包含很多样板代码,所以我们让omnet++为我们生成该类。
3. 消息类规范在tictoc13.msg——tictoc13_m.h和.cc将从这个文件自动生成。
4. 为了延长模型的执行时间,在消息到达目的地后,目标节点将生成另一个带有随机目的地地址的消息,以此类推。
 */
class Txc13 : public cSimpleModule
{
  protected:
    virtual TicTocMsg13 *generateMessage();
    virtual void forwardMessage(TicTocMsg13 *msg);
    virtual void initialize() override;
    virtual void handleMessage(cMessage *msg) override;
};

Define_Module(Txc13);

void Txc13::initialize()
{
    // Module 0 sends the first message ,模块0发送第一个消息
    if (getIndex() == 0) {
        // Boot the process scheduling the initial message as a self-message.
        TicTocMsg13 *msg = generateMessage();
        scheduleAt(0.0, msg);
    }
}

void Txc13::handleMessage(cMessage *msg)
{
    TicTocMsg13 *ttmsg = check_and_cast<TicTocMsg13 *>(msg); //接收到的消息进行类型转换
	//如果消息到达目的地址
    if (ttmsg->getDestination() == getIndex()) {
        // Message arrived.
        EV << "Message " << ttmsg << " arrived after " << ttmsg->getHopCount() << " hops.\n";
        bubble("ARRIVED, starting new one!");
        delete ttmsg;

        // Generate another one.
        EV << "Generating another message: ";
        TicTocMsg13 *newmsg = generateMessage();
        EV << newmsg << endl;
        forwardMessage(newmsg);
    }
    else {
        // We need to forward the message.
        forwardMessage(ttmsg);
    }
}

TicTocMsg13 *Txc13::generateMessage()
{
    // Produce source and destination addresses.生成源地址和目的地址。
    int src = getIndex();  // our module index我们的模块索引 0 
    int n = getVectorSize();  // module vector size模块矢量尺寸 ,共有6个节点,即模块
    int dest = intuniform(0, n-2); //0-4 均匀分布
    if (dest >= src) 
        dest++;

    char msgname[20];
    sprintf(msgname, "tic-%d-to-%d", src, dest);

    // Create message object and set source and destination field.
    TicTocMsg13 *msg = new TicTocMsg13(msgname);
    msg->setSource(src);
    msg->setDestination(dest);
    return msg;
}

void Txc13::forwardMessage(TicTocMsg13 *msg)
{
    // Increment hop count. 增加跳数。
    msg->setHopCount(msg->getHopCount()+1);

    // Same routing as before: random gate.路由和之前一样,随机门。
    int n = gateSize("gate");
    int k = intuniform(0, n-1);

    EV << "Forwarding message " << msg << " on gate[" << k << "]\n";
    send(msg, "gate$o", k);
}

在这里插入图片描述

tictoc 14 在13的基础上增加两变量显示于仿真界面

  1. 在此步骤中,我们跟踪发送和接收的消息数量,并将其显示在图标上方。
  2. WATCH(numSent); WATCH(numReceived);//收发次数的变量显示在仿真界面的模块上

msg

message TicTocMsg14
{
    int source;
    int destination;
    int hopCount = 0;
}

ned

simple Txc14
{
    parameters:
        @display("i=block/routing");
    gates:
        inout gate[];
}

network Tictoc14
{
    types:
        channel Channel extends ned.DelayChannel {
            delay = 100ms;
        }
    submodules:
        tic[6]: Txc14;
    connections:
        tic[0].gate++ <--> Channel <--> tic[1].gate++;
        tic[1].gate++ <--> Channel <--> tic[2].gate++;
        tic[1].gate++ <--> Channel <--> tic[4].gate++;
        tic[3].gate++ <--> Channel <--> tic[4].gate++;
        tic[4].gate++ <--> Channel <--> tic[5].gate++;
}

cc

#include <stdio.h>
#include <string.h>
#include <omnetpp.h>
#include "tictoc14_m.h"

using namespace omnetpp;

/**
 * In this step we keep track of how many messages we send and received,
 * and display it above the icon.
 * 在此步骤中,我们跟踪发送和接收的消息数量,并将其显示在图标上方。
 */
class Txc14 : public cSimpleModule
{
  private:
    long numSent;
    long numReceived;

  protected:
    virtual TicTocMsg14 *generateMessage();
    virtual void forwardMessage(TicTocMsg14 *msg);
    virtual void refreshDisplay() const override;

    virtual void initialize() override;
    virtual void handleMessage(cMessage *msg) override;
};

Define_Module(Txc14);

void Txc14::initialize()
{
    // Initialize variables
    numSent = 0;
    numReceived = 0;
    WATCH(numSent);//收发次数的变量显示在仿真界面的模块上
    WATCH(numReceived);

    // Module 0 sends the first message
    if (getIndex() == 0) {
        // Boot the process scheduling the initial message as a self-message.
        TicTocMsg14 *msg = generateMessage();
        numSent++;
        scheduleAt(0.0, msg);
    }
}

void Txc14::handleMessage(cMessage *msg)
{
    TicTocMsg14 *ttmsg = check_and_cast<TicTocMsg14 *>(msg);

    if (ttmsg->getDestination() == getIndex()) {
        // Message arrived
        int hopcount = ttmsg->getHopCount();
        EV << "Message " << ttmsg << " arrived after " << hopcount << " hops.\n";
        numReceived++;
        delete ttmsg;
        bubble("ARRIVED, starting new one!");

        // Generate another one.
        EV << "Generating another message: ";
        TicTocMsg14 *newmsg = generateMessage();
        EV << newmsg << endl;
        forwardMessage(newmsg);
        numSent++;
    }
    else {
        // We need to forward the message.
        forwardMessage(ttmsg);
    }
}

TicTocMsg14 *Txc14::generateMessage()
{
    // Produce source and destination addresses.
    int src = getIndex();  // our module index
    int n = getVectorSize();  // module vector size
    int dest = intuniform(0, n-2);
    if (dest >= src)
        dest++;

    char msgname[20];
    sprintf(msgname, "tic-%d-to-%d", src, dest);

    // Create message object and set source and destination field.
    TicTocMsg14 *msg = new TicTocMsg14(msgname);
    msg->setSource(src);
    msg->setDestination(dest);
    return msg;
}

void Txc14::forwardMessage(TicTocMsg14 *msg)
{
    // Increment hop count.
    msg->setHopCount(msg->getHopCount()+1);

    // Same routing as before: random gate.
    int n = gateSize("gate");
    int k = intuniform(0, n-1);

    EV << "Forwarding message " << msg << " on gate[" << k << "]\n";
    send(msg, "gate$o", k);
}

void Txc14::refreshDisplay() const
{
    char buf[40];
    sprintf(buf, "rcvd: %ld sent: %ld", numReceived, numSent);
    getDisplayString().setTagArg("t", 0, buf);
}

在这里插入图片描述

tictoc 15 模型数据输出为直方图

  1. 这个模型足够令人兴奋,因此我们可以收集一些统计数据。我们将在输出向量中记录每条消息到达时的跳数。输出向量被写入omnetpp。vec文件,可以用Plove程序可视化。
  2. 我们还收集基本统计数据(最小值、最大值、平均值、std.dev.)和关于跳数的直方图,我们将在模拟结束时打印出这些数据。
  3. 仿真结束调用finish()
  4. recordScalar("#sent", numSent);//将一个double变量记录到标量结果文件中。
    msg
message TicTocMsg15
{
    int source;
    int destination;
    int hopCount = 0;
}

ned

simple Txc15
{
    parameters:
        @display("i=block/routing");
    gates:
        inout gate[];
}

network Tictoc15
{
    types:
        channel Channel extends ned.DelayChannel {
            delay = 100ms;
        }
    submodules:
        tic[6]: Txc15;
    connections:
        tic[0].gate++ <--> Channel <--> tic[1].gate++;
        tic[1].gate++ <--> Channel <--> tic[2].gate++;
        tic[1].gate++ <--> Channel <--> tic[4].gate++;
        tic[3].gate++ <--> Channel <--> tic[4].gate++;
        tic[4].gate++ <--> Channel <--> tic[5].gate++;
}

cc

#include <stdio.h>
#include <string.h>
#include <omnetpp.h>
#include "tictoc15_m.h"

using namespace omnetpp;

/**
 * This model is exciting enough so that we can collect some statistics.
 * We'll record in output vectors the hop count of every message upon arrival.
 * Output vectors are written into the omnetpp.vec file and can be visualized
 * with the Plove program.
 *
 * We also collect basic statistics (min, max, mean, std.dev.) and histogram
 * about the hop count which we'll print out at the end of the simulation.
 * 这个模型足够令人兴奋,因此我们可以收集一些统计数据。我们将在输出向量中记录每条消息到达时的跳数。输出向量被写入omnetpp。vec文件,可以用Plove程序可视化。

我们还收集基本统计数据(最小值、最大值、平均值、std.dev.)和关于跳数的直方图,我们将在模拟结束时打印出这些数据。
 */
class Txc15 : public cSimpleModule
{
  private:
    long numSent;
    long numReceived;
    cHistogram hopCountStats;//直方图类对象
    cOutVector hopCountVector;//输出向量

  protected:
    virtual TicTocMsg15 *generateMessage();//msg作消息
    virtual void forwardMessage(TicTocMsg15 *msg);
    virtual void initialize() override;
    virtual void handleMessage(cMessage *msg) override;

    // The finish() function is called by OMNeT++ at the end of the simulation:
    //仿真结束之后会调用
    virtual void finish() override;
};

Define_Module(Txc15);

void Txc15::initialize()
{
    // Initialize variables
    numSent = 0;
    numReceived = 0;
    WATCH(numSent);
    WATCH(numReceived);

    hopCountStats.setName("hopCountStats");
    hopCountVector.setName("HopCount");

    // Module 0 sends the first message
    if (getIndex() == 0) {
        // Boot the process scheduling the initial message as a self-message.
        TicTocMsg15 *msg = generateMessage();
        scheduleAt(0.0, msg);
    }
}

void Txc15::handleMessage(cMessage *msg)
{
    TicTocMsg15 *ttmsg = check_and_cast<TicTocMsg15 *>(msg);

    if (ttmsg->getDestination() == getIndex()) {
        // Message arrived
        int hopcount = ttmsg->getHopCount();
        EV << "Message " << ttmsg << " arrived after " << hopcount << " hops.\n";
        bubble("ARRIVED, starting new one!");

        // update statistics.更新统计数据
        numReceived++;
        hopCountVector.record(hopcount);
        hopCountStats.collect(hopcount);

        delete ttmsg;

        // Generate another one.
        EV << "Generating another message: ";
        TicTocMsg15 *newmsg = generateMessage();
        EV << newmsg << endl;
        forwardMessage(newmsg);
        numSent++;
    }
    else {
        // We need to forward the message.
        forwardMessage(ttmsg);
    }
}

TicTocMsg15 *Txc15::generateMessage()
{
    // Produce source and destination addresses.
    int src = getIndex();
    int n = getVectorSize();
    int dest = intuniform(0, n-2);
    if (dest >= src)
        dest++;

    char msgname[20];
    sprintf(msgname, "tic-%d-to-%d", src, dest);

    // Create message object and set source and destination field.
    TicTocMsg15 *msg = new TicTocMsg15(msgname);
    msg->setSource(src);
    msg->setDestination(dest);
    return msg;
}

void Txc15::forwardMessage(TicTocMsg15 *msg)
{
    // Increment hop count.
    msg->setHopCount(msg->getHopCount()+1);

    // Same routing as before: random gate.
    int n = gateSize("gate");
    int k = intuniform(0, n-1);

    EV << "Forwarding message " << msg << " on gate[" << k << "]\n";
    send(msg, "gate$o", k);
}

void Txc15::finish()
{
    // This function is called by OMNeT++ at the end of the simulation.
    EV << "Sent:     " << numSent << endl;
    EV << "Received: " << numReceived << endl;
    EV << "Hop count, min:    " << hopCountStats.getMin() << endl;
    EV << "Hop count, max:    " << hopCountStats.getMax() << endl;
    EV << "Hop count, mean:   " << hopCountStats.getMean() << endl;
    EV << "Hop count, stddev: " << hopCountStats.getStddev() << endl;

    recordScalar("#sent", numSent);//将一个double变量记录到标量结果文件中。
    recordScalar("#received", numReceived);
    hopCountStats.recordAs("hop count");
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/54726.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计springboot现代诗歌交流平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

MySQL存储过程

目录 存储过程 1、存储过程的概念 2、存储过程的优点 3、创建存储过程 格式&#xff1a; 4、调用存储过程 格式 5、查看存储过程 格式&#xff1a; 6、存储过程的参数 7、删除存储过程 格式&#xff1a; 8、存储过程的控制语句 准备a表 &#xff08;1&#xff09;条…

Spring基础篇:注入

第一章&#xff1a;注入 一&#xff1a;什么是注入 &#xff08;Injection&#xff09;注入就是通过Spring的工厂类和spring的配置文件&#xff0c;对spring所创建的对象进行赋值&#xff0c;为成员变量进行赋值 二&#xff1a;为什么注入 为什么需要Spring工厂创建对象的时…

[附源码]Python计算机毕业设计SSM开放式在线课程教学与辅助平台(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

[附源码]计算机毕业设计JAVA校园闲置物品租赁系统

[附源码]计算机毕业设计JAVA校园闲置物品租赁系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM my…

Maven使用指南(超详细)

Maven高级 目标 理解并实现分模块开发能够使用聚合工程快速构建项目能够使用继承简化项目配置能够根据需求配置生成、开发、测试环境&#xff0c;并在各个环境间切换运行了解Maven的私服 1&#xff0c;分模块开发 1.1 分模块开发设计 (1)按照功能拆分 我们现在的项目都是在…

Delay Penalty for RNN-T and CTC

1. 背景 之前介绍了如何在 RNN-T 流式模型上应用时延正则&#xff0c;以及在 Conformer 和 LSTM 上的实验结果。 本期公众号重点带大家回顾下具体的思路&#xff0c;以及如何类似地在 CTC 流式模型上应用时延正则。 有些内容可能有所重复&#xff0c;读者可适当跳过。2. Dela…

iwebsec靶场 SQL注入漏洞通关笔记12-等价函数替换绕过

系列文章目录 iwebsec靶场 SQL注入漏洞通关笔记1- 数字型注入_mooyuan的博客-CSDN博客 iwebsec靶场 SQL注入漏洞通关笔记2- 字符型注入&#xff08;宽字节注入&#xff09;_mooyuan的博客-CSDN博客 iwebsec靶场 SQL注入漏洞通关笔记3- bool注入&#xff08;布尔型盲注&#…

Ajax学习:同源策略(与跨域相关)ajax默认遵循同源策略

同源策略&#xff1a;是浏览器的一种安全策略 同源意味着&#xff1a;协议、域名、端口号必须相同 违背同源便是跨域 当前网页的url和ajax请求的目标资源的url必须协议、域名、端口号必须相同 比如&#xff1a;当前网页&#xff1a;协议http 域名 a.com 端口号8000 目标请求…

python——spark入门

Hadoop是对大数据集进行分布式计算的标准工具&#xff0c;这也是为什么当你穿过机场时能看到”大数据(Big Data)”广告的原因。它已经成为大数据的操作系统&#xff0c;提供了包括工具和技巧在内的丰富生态系统&#xff0c;允许使用相对便宜的商业硬件集群进行超级计算机级别的…

Android Poco初始化时,不大起眼但可能存在坑点的参数们

1. 前言 进行Android poco初始化的时候&#xff0c;可能大多数同学都是直接在Poco辅助窗里选择Android模式&#xff0c;然后选择自动帮我们补充poco的初始化脚本&#xff1a; 这种情况下&#xff0c;我们大多数都不会关注初始化的参数。但如果我们不了解这些参数的含义&#x…

Spring之@RequestMapping、@GetMapping、 @PostMapping 三者的区别

我的理解&#xff1a;其实RequestMapping、GetMapping、 PostMapping 三者就是父类和子类的区别&#xff0c;RequestMapping是父类&#xff0c;GetMapping、 PostMapping为子类集成了RequestMapping更明确了http请求的类型 分析三者的源码&#xff1a; RequestMapping .class&…

C#教务管理大数据平台系统源码

校务管理系统是专门针对幼儿园、培训学校的业务应用而设计研发的一款行业应用软件。校管家校务管理系统融入先进的协同管理理念&#xff0c;运用领先的信息化、网络化处理技术&#xff0c;结合丰富的教育培训行业经验&#xff0c;切实有效的解决幼儿园、培训学校日常工作中的关…

[附源码]计算机毕业设计-菜篮子系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

KVM虚机添加磁盘

KVM虚拟机添加磁盘两种方法&#xff1a; 1、添加虚拟磁盘文件 2、添加物理磁盘 需求 1、/kvm/kvms目录是我们KVM磁盘镜像集中管理的位置&#xff0c;我们需要在/kvm/kvms下给ceph1虚拟机创建名为ceph1-vdb.qcow2的磁盘文件&#xff0c;大小为80G&#xff0c;作为ceph1的vdb磁盘…

Python和labview先学哪个

前言 在这之前&#xff0c;先跟大家分享个身边的故事。 大学同学小宏&#xff0c;在北京一家电子设备公司做运维&#xff0c;上周四刚被升为运维部经理&#xff0c;薪资涨了35%。 但你一定想不到&#xff0c;他平时从不加班&#xff0c;甚至还经常迟到。 &#xff08;文末送…

Qt入门总结

文章目录Qt一、各文件基本概念1、main.cpp文件2、XXX.pro文件3、XXX.h文件二、基本知识1、命名规范2、快捷键三、入门操作1、添加按钮2、重置窗口大小3、设置窗口标题4、设置固定的窗口大小5、对象树6、添加源文件/头文件7、窗口坐标系四、信号与槽1、让按钮附带功能2、自定义信…

浅谈affine_trans_point_2d与affine_trans_pixel

先看下两个坐标图谱&#xff1a; 变换前&#xff1a; 变换后&#xff1a; 我们根据1号点和9号点前后的关系&#xff0c;计算变换后其他点的坐标&#xff1a;这其实就是根据MARK点进行定位的原理 halcon代码&#xff1a; 执行结果&#xff1a; 我们发现&#xff0c;两种变换方…

湘江新区:金融活水赋能实体经济

湘江早报全媒体记者 黄荣佳 通讯员 易芳 吴硕 4月26日&#xff0c;艾布鲁环保在创业板首发上市&#xff1b; 10月28日&#xff0c;“国产操作系统第一股&#xff02;麒麟信安敲响上市钟声&#xff0c;成为今年全省第一家在科创板上市的公司&#xff1b; 11月24日&#xff0c;…

临床信息去冗余 临床数据处理分组不同的GSE数据集有不同的临床信息,不同的分组技巧

最近&#xff0c;我发现学徒在学习GEO数据挖掘的过程中&#xff0c;遇到了第一个也是至关重要的一个难题就是对下载后的数据集进行合适的分组&#xff0c;因为只有对样本进行合适的分组&#xff0c;才有可能得到我们想要的信息。但是不同的GSE数据集有不同的临床信息&#xff0…