tictoc例子理解6-9

news2024/11/27 10:41:43

tictoc 6-9

    • tictoc 6 自消息实现计时
    • tictoc 7 节点等待时延随机,丢失包概率
    • tictoc 8 两个节点分别定义两个类
    • tictoc 9 保留原始包副本,从而不需要重新构建包

tictoc 6 自消息实现计时

  1. 在前面的模型中,’ tic’和’ toc’立即将收到的消息发送回。这里将添加一些计时:tic和toc将在将消息发送回之前模拟地保持消息1秒。
    在omnet++中,这种计时是通过模块向自身发送消息来实现的。
    这样的消息称为自消息(但仅仅是因为它们的使用方式,否则它们就是完全普通的消息)或事件。
  2. 可以使用scheduleAt()函数“发送”自消息,并且您可以指定它们应该在何时返回模块。
  3. 我们不会立即开始,而是向自己发送一条信息(“自我信息”)——当它返回给我们时,我们会在模拟时间t=5.0时进行第一次发送。(tictocMsg = new cMessage("tictocMsg"); scheduleAt(5.0, event);)
  4. 自我消息到达了,所以我们可以发送tictocMsg和nullptr它的指针,这样以后就不会让我们感到困惑了。(send(tictocMsg, "out"); tictocMsg = nullptr;)
  5. 如果我们收到的信息不是我们的自我信息,那么它一定是我们的伴侣发来的信息。我们记住它在tictocMsg变量中的指针,然后安排我们的自消息在模拟的1s时间内返回给我们。(scheduleAt(simTime()+1.0, event);)

ned文件(还是两个结点不变)

simple Txc6
{
    parameters:
        @display("i=block/routing");
    gates:
        input in;
        output out;
}

network Tictoc6
{
    submodules:
        tic: Txc6 {
            parameters:
                @display("i=,cyan");
        }
        toc: Txc6 {
            parameters:
                @display("i=,gold");
        }
    connections:
        tic.out --> {  delay = 100ms; } --> toc.in;
        tic.in <-- {  delay = 100ms; } <-- toc.out;
}

cc文件

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

using namespace omnetpp;

/**
 * In the previous models, `tic' and `toc' immediately sent back the
 * received message. Here we'll add some timing: tic and toc will hold the
 * message for 1 simulated second before sending it back. In OMNeT++
 * such timing is achieved by the module sending a message to itself.
 * Such messages are called self-messages (but only because of the way they
 * are used, otherwise they are completely ordinary messages) or events.
 * Self-messages can be "sent" with the scheduleAt() function, and you can
 * specify when they should arrive back at the module.
 *
 * We leave out the counter, to keep the source code small.
 * 在前面的模型中,' tic'和' toc'立即将收到的消息发送回。这里我们将添加一些计时:tic和toc将在将消息发送回之前模拟地保持消息1秒。在omnet++中,这种计时是通过模块向自身发送消息来实现的。这样的消息称为自消息(但仅仅是因为它们的使用方式,否则它们就是完全普通的消息)或事件。可以使用scheduleAt()函数“发送”自消息,并且您可以指定它们应该在何时返回模块。
 */
class Txc6 : public cSimpleModule
{
  private:
    cMessage *event;  // pointer to the event object which we'll use for timing,指向我们将用于计时的事件对象的指针
    cMessage *tictocMsg;  // variable to remember the message until we send it back,变量来记住消息,直到我们将其发送回

  public:
    Txc6();
    virtual ~Txc6();

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

Define_Module(Txc6);

Txc6::Txc6()
{
    // Set the pointer to nullptr, so that the destructor won't crash
    // even if initialize() doesn't get called because of a runtime
    // error or user cancellation during the startup process.
    //将指针设置为nullptr,这样即使在启动过程中由于运行时错误或用户取消而没有调用initialize(),析构函数也不会崩溃。
    event = tictocMsg = nullptr;
}

Txc6::~Txc6()
{
    // Dispose of dynamically allocated the objects,处理动态分配的对象
    cancelAndDelete(event);
    delete tictocMsg;
}

void Txc6::initialize()
{
    // Create the event object we'll use for timing -- just any ordinary message.创建用于计时的事件对象——任何普通消息。
    event = new cMessage("event");

    // No tictoc message yet.
    tictocMsg = nullptr;

    if (strcmp("tic", getName()) == 0) {
        // We don't start right away, but instead send an message to ourselves
        // (a "self-message") -- we'll do the first sending when it arrives
        // back to us, at t=5.0s simulated time.我们不会立即开始,而是向自己发送一条信息(“自我信息”)——当它返回给我们时,我们会在模拟时间t=5.0时进行第一次发送。
        EV << "Scheduling first send to t=5.0s\n";
        tictocMsg = new cMessage("tictocMsg");
        scheduleAt(5.0, event);
    }
}

void Txc6::handleMessage(cMessage *msg)
{
    // There are several ways of distinguishing messages, for example by message
    // kind (an int attribute of cMessage) or by class using dynamic_cast
    // (provided you subclass from cMessage). In this code we just check if we
    // recognize the pointer, which (if feasible) is the easiest and fastest
    // method.
    //有几种方法来区分消息,例如通过消息类型(cMessage的int属性)或通过使用dynamic_cast的类(提供来自cMessage的子类)。在这段代码中,我们只是检查是否识别了指针,这(如果可行)是最简单和最快的方法。
    if (msg == event) {
        // The self-message arrived, so we can send out tictocMsg and nullptr out
        // its pointer so that it doesn't confuse us later. 自我消息到达了,所以我们可以发送tictocMsg和nullptr它的指针,这样以后就不会让我们感到困惑了。
        EV << "Wait period is over, sending back message\n";
        send(tictocMsg, "out");
        tictocMsg = nullptr;
    }
    else {
        // If the message we received is not our self-message, then it must
        // be the tic-toc message arriving from our partner. We remember its
        // pointer in the tictocMsg variable, then schedule our self-message
        // to come back to us in 1s simulated time.如果我们收到的信息不是我们的自我信息,那么它一定是我们的伴侣发来的一字合一的信息。我们记住它在tictocMsg变量中的指针,然后安排我们的自消息在模拟的1s时间内返回给我们。
        EV << "Message arrived, starting to wait 1 sec...\n";
        tictocMsg = msg;
        scheduleAt(simTime()+1.0, event);
    }
}

在这里插入图片描述

tictoc 7 节点等待时延随机,丢失包概率

  1. 这一步我们引入随机数。我们将延迟从1更改为一个可以从NED文件或omnetpp.ini中设置的随机值。此外,我们会以很小的概率“丢失”(删除)数据包。
  2. ini初始化中在等待自消息结束后,其中一个节点开始向对方发送消息
  3. 处理消息时候,如果是自消息事件,则继续发送消息出去。否则会有个丢失概率为0.1 的判断if (uniform(0, 1) < 0.1),可能会丢失消息
  4. delayTime"模块参数可以设置为"exponential(5)”(tictoc7。Ned, omnetpp.ini),然后在这里我们每次都会得到不同的延迟。

ini配置

[Config Tictoc7]
network = Tictoc7
# argument to exponential() is the mean; truncnormal() returns values from
#指数()的参数是平均值;Truncnormal()返回来自的值
# the normal distribution truncated to nonnegative values
#正态分布截断为非负值
Tictoc7.tic.delayTime = exponential(3s)
Tictoc7.toc.delayTime = truncnormal(3s,1s)

ned文件

simple Txc7
{
    parameters:
        volatile double delayTime @unit(s);   // delay before sending back message,发送回消息前的延迟
        @display("i=block/routing");
    gates:
        input in;
        output out;
}

network Tictoc7
{
    submodules:
        tic: Txc7 {
            parameters:
                @display("i=,cyan");
        }
        toc: Txc7 {
            parameters:
                @display("i=,gold");
        }
    connections:
        tic.out --> {  delay = 100ms; } --> toc.in;
        tic.in <-- {  delay = 100ms; } <-- toc.out;
}

cc文件

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

using namespace omnetpp;

/**
 * In this step we'll introduce random numbers. We change the delay from 1s
 * to a random value which can be set from the NED file or from omnetpp.ini.
 * In addition, we'll "lose" (delete) the packet with a small probability.
 * 这一步我们引入随机数。我们将延迟从1更改为一个可以从NED文件或omnetpp.ini中设置的随机值。此外,我们会以很小的概率“丢失”(删除)数据包。
 */
class Txc7 : public cSimpleModule
{
  private:
    cMessage *event;
    cMessage *tictocMsg;

  public:
    Txc7();
    virtual ~Txc7();

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

Define_Module(Txc7);

Txc7::Txc7()
{
    event = tictocMsg = nullptr;
}

Txc7::~Txc7()
{
    cancelAndDelete(event);
    delete tictocMsg;
}

void Txc7::initialize()
{
    event = new cMessage("event");
    tictocMsg = nullptr;

    if (strcmp("tic", getName()) == 0) {
        EV << "Scheduling first send to t=5.0s\n";
        scheduleAt(5.0, event);
        tictocMsg = new cMessage("tictocMsg");
    }
}

void Txc7::handleMessage(cMessage *msg)
{
    if (msg == event) {
        EV << "Wait period is over, sending back message\n";
        send(tictocMsg, "out");
        tictocMsg = nullptr;
    }
    else {
        // "Lose" the message with 0.1 probability:“丢失”信息的概率为0.1:
        if (uniform(0, 1) < 0.1) {
            EV << "\"Losing\" message\n";
            delete msg;
        }
        else {
            // The "delayTime" module parameter can be set to values like
            // "exponential(5)" (tictoc7.ned, omnetpp.ini), and then here
            // we'll get a different delay every time.
            //"delayTime"模块参数可以设置为"指数(5)"(tictoc7。Ned, omnetpp.ini),然后在这里我们每次都会得到不同的延迟。
            simtime_t delay = par("delayTime");

            EV << "Message arrived, starting to wait " << delay << " secs...\n";
            tictocMsg = msg;
            scheduleAt(simTime()+delay, event);
        }
    }
}

在这里插入图片描述

tictoc 8 两个节点分别定义两个类

  1. 让我们退一步,从代码中去除随机延迟。然而,我们会离开,以很小的可能性失去这个包。我们会做一些在电信网络中很常见的事情:如果数据包在一定时间内没有到达,我们就会假设它丢失了,并创建另一个。超时将使用(还有什么?)一条自消息来处理。
    ned文件,tic 和toc 分开各自定义
simple Tic8
{
    parameters:
        @display("i=block/routing");
    gates:
        input in;
        output out;
}

simple Toc8
{
    parameters:
        @display("i=block/process");
    gates:
        input in;
        output out;
}

network Tictoc8
{
    submodules:
        tic: Tic8 {
            parameters:
                @display("i=,cyan");
        }
        toc: Toc8 {
            parameters:
                @display("i=,gold");
        }
    connections:
        tic.out --> {  delay = 100ms; } --> toc.in;
        tic.in <-- {  delay = 100ms; } <-- toc.out;
}

cc文件

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

using namespace omnetpp;

/**
 * Let us take a step back, and remove random delaying from the code.
 * We'll leave in, however, losing the packet with a small probability.
 * And, we'll we do something very common in telecommunication networks:
 * if the packet doesn't arrive within a certain period, we'll assume it
 * was lost and create another one. The timeout will be handled using
 * (what else?) a self-message.
 * 让我们退一步,从代码中去除随机延迟。然而,我们会离开,以很小的可能性失去这个包。我们会做一些在电信网络中很常见的事情:如果数据包在一定时间内没有到达,我们就会假设它丢失了,并创建另一个。超时将使用(还有什么?)一条自消息来处理。
 */
class Tic8 : public cSimpleModule
{
  private:
    simtime_t timeout;  // timeout
    cMessage *timeoutEvent;  // holds pointer to the timeout self-message 保持指向超时自消息的指针

  public:
    Tic8();
    virtual ~Tic8();

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

Define_Module(Tic8);

Tic8::Tic8()
{
    timeoutEvent = nullptr;
}

Tic8::~Tic8()
{
    cancelAndDelete(timeoutEvent);
}

void Tic8::initialize()
{
    // Initialize variables.
    timeout = 1.0;
    timeoutEvent = new cMessage("timeoutEvent");

    // Generate and send initial message.
    EV << "Sending initial message\n";
    cMessage *msg = new cMessage("tictocMsg");
    send(msg, "out");
    scheduleAt(simTime()+timeout, timeoutEvent);
}

void Tic8::handleMessage(cMessage *msg)
{
    if (msg == timeoutEvent) {
        // If we receive the timeout event, that means the packet hasn't
        // arrived in time and we have to re-send it.
        EV << "Timeout expired, resending message and restarting timer\n";
        cMessage *newMsg = new cMessage("tictocMsg");
        send(newMsg, "out");
        scheduleAt(simTime()+timeout, timeoutEvent);
    }
    else {  // message arrived
            // Acknowledgement received -- delete the received message and cancel
            // the timeout event.
        EV << "Timer cancelled.\n";
        cancelEvent(timeoutEvent);
        delete msg;

        // Ready to send another one.
        cMessage *newMsg = new cMessage("tictocMsg");
        send(newMsg, "out");
        scheduleAt(simTime()+timeout, timeoutEvent);
    }
}

/**
 * Sends back an acknowledgement -- or not.
 */
class Toc8 : public cSimpleModule
{
  protected:
    virtual void handleMessage(cMessage *msg) override;
};

Define_Module(Toc8);

void Toc8::handleMessage(cMessage *msg)
{
    if (uniform(0, 1) < 0.1) {
        EV << "\"Losing\" message.\n";
        bubble("message lost");  // making animation more informative...使动画更加翔实..
        delete msg;
    }
    else {
        EV << "Sending back same message as acknowledgement.\n";
        send(msg, "out");
    }
}

在这里插入图片描述

tictoc 9 保留原始包副本,从而不需要重新构建包

  1. 在前面的模型中,如果需要重传,我们只创建另一个包。这是可以的,因为包包含的内容并不多,但在现实生活中,通常更实际的做法是保留原始包的副本,这样我们就可以重新发送它,而不需要重新构建它。
  2. 复制包:
void Tic9::sendCopyOf(cMessage *msg)
{
    // Duplicate message and send the copy.
    cMessage *copy = (cMessage *)msg->dup();
    send(copy, "out");
}

创建并返回此对象的精确副本,但消息ID除外(克隆被分配了一个新ID)。注意,消息的创建时间也会被复制,因此相同消息对象的克隆具有相同的创建时间。参见cObject了解更多细节。

/**
     * Creates and returns an exact copy of this object, except for the
     * message ID (the clone is assigned a new ID). Note that the message
     * creation time is also copied, so clones of the same message object
     * have the same creation time. See cObject for more details.
     * 创建并返回此对象的精确副本,但消息ID除外(克隆被分配了一个新ID)。
     * 注意,消息的创建时间也会被复制,因此相同消息对象的克隆具有相同的创建时间。
     * 参见cObject了解更多细节。
     */
    virtual cMessage *dup() const override  {return new cMessage(*this);}

ned文件

simple Tic9
{
    parameters:
        @display("i=block/routing");
    gates:
        input in;
        output out;
}

simple Toc9
{
    parameters:
        @display("i=block/process");
    gates:
        input in;
        output out;
}

//
// Same as Tictoc8.
//
network Tictoc9
{
    submodules:
        tic: Tic9 {
            parameters:
                @display("i=,cyan");
        }
        toc: Toc9 {
            parameters:
                @display("i=,gold");
        }
    connections:
        tic.out --> {  delay = 100ms; } --> toc.in;
        tic.in <-- {  delay = 100ms; } <-- toc.out;
}

cc文件

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

using namespace omnetpp;

/**
 * In the previous model we just created another packet if we needed to
 * retransmit. This is OK because the packet didn't contain much, but
 * in real life it's usually more practical to keep a copy of the original
 * packet so that we can re-send it without the need to build it again.
 * 在前面的模型中,如果需要重传,我们只创建另一个包。这是可以的,因为包包含的内容并不多,但在现实生活中,通常更实际的做法是保留原始包的副本,这样我们就可以重新发送它,而不需要重新构建它。
 */
class Tic9 : public cSimpleModule
{
  private:
    simtime_t timeout;  // timeout
    cMessage *timeoutEvent;  // holds pointer to the timeout self-message
    int seq;  // message sequence number
    cMessage *message;  // message that has to be re-sent on timeout

  public:
    Tic9();
    virtual ~Tic9();

  protected:
    virtual cMessage *generateNewMessage();
    virtual void sendCopyOf(cMessage *msg);
    virtual void initialize() override;
    virtual void handleMessage(cMessage *msg) override;
};

Define_Module(Tic9);

Tic9::Tic9()
{
    timeoutEvent = message = nullptr;
}

Tic9::~Tic9()
{
    cancelAndDelete(timeoutEvent);
    delete message;
}

void Tic9::initialize()
{
    // Initialize variables.
    seq = 0;
    timeout = 1.0;
    timeoutEvent = new cMessage("timeoutEvent");

    // Generate and send initial message.
    EV << "Sending initial message\n";
    message = generateNewMessage();
    sendCopyOf(message);//拷贝并发送
    scheduleAt(simTime()+timeout, timeoutEvent);
}

void Tic9::handleMessage(cMessage *msg)
{
    if (msg == timeoutEvent) {
        // If we receive the timeout event, that means the packet hasn't
        // arrived in time and we have to re-send it.
        EV << "Timeout expired, resending message and restarting timer\n";
        sendCopyOf(message);
        scheduleAt(simTime()+timeout, timeoutEvent);
    }
    else {  // message arrived
            // Acknowledgement received!
        EV << "Received: " << msg->getName() << "\n";
        delete msg;

        // Also delete the stored message and cancel the timeout event.
        EV << "Timer cancelled.\n";
        cancelEvent(timeoutEvent);
        delete message;

        // Ready to send another one.
        message = generateNewMessage();
        sendCopyOf(message);
        scheduleAt(simTime()+timeout, timeoutEvent);
    }
}

cMessage *Tic9::generateNewMessage()
{
    // Generate a message with a different name every time.
    char msgname[20];
    sprintf(msgname, "tic-%d", ++seq);
    cMessage *msg = new cMessage(msgname);
    return msg;
}

void Tic9::sendCopyOf(cMessage *msg)
{
    // Duplicate message and send the copy.
    cMessage *copy = (cMessage *)msg->dup();
    send(copy, "out");
}

/**
 * Sends back an acknowledgement -- or not.
 */
class Toc9 : public cSimpleModule
{
  protected:
    virtual void handleMessage(cMessage *msg) override;
};

Define_Module(Toc9);

void Toc9::handleMessage(cMessage *msg)
{
    if (uniform(0, 1) < 0.1) {
        EV << "\"Losing\" message " << msg << endl;
        bubble("message lost");
        delete msg;
    }
    else {
        EV << msg << " received, sending back an acknowledgement.\n";
        delete msg;
        send(new cMessage("ack"), "out");
    }
}

在这里插入图片描述

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

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

相关文章

高防CDN和融合CDN的区别

所有网站比较关心的一个问题就是如何解决南北用户能够稳定的加速访问&#xff0c;为此网站运营商通常用的CDN来解决这个问题。那么CDN是什么呢&#xff1f;CDN是属于一种内容分发网络。通过在现有的网络中增加一层新的网络架构的模式&#xff0c;使用户能够就近获取数据&#x…

利用综合微生物指数评估富营养化危险沿海湿地生态状况

河海大学环境学院李轶课题组近期在《Science of the Total Environment》期刊上(IF10.753)发表的“Eutrophication dangers the ecological status of coastal wetlands: A quantitative assessment by composite microbial index of biotic integrity.”研究论文中&#xff0c…

IP-Guard批量部署客户端的方法有哪些?

常用的批量部署客户端方式有以下几种&#xff1a; 1、通过IP-guard域脚本安装工具推送安装 概括步骤如下&#xff1a; 1&#xff09;打包好客户端安装包&#xff08;勾选静默安装&#xff09;&#xff0c;将安装包命名为OAgentInst.exe 2&#xff09;将客户端安装包OAgentInst.…

React路由

文章目录单页面应用spa路由路由是什么React路由原理点击页面选项路径改变路径改变页面变化React路由的使用实现点击页面选项路径改变——编写路由链接根据路径显示组件 ——注册路由组件的分类——普通组件和路由组件案例实现选中高亮效果——NavLinkNavLink的封装Switch的使用…

tda4vm mcu1_0应用程序开发系列之ADC采样

文章目录 1. 前言2. 开发过程1. 前言 上一篇我们介绍了如何在tda4vm上拉起MCU域的mcu1_0,感兴趣的小伙伴可以看一下tda4vm如何SPL方式加载MCU域的核?,从本篇开始介绍如何在mcu1_0上开发应用程序,本篇主要介绍mcu1_0上ADC采样应用程序的开发。 2. 开发过程 如果工作中接到…

职业资格证书查询与验证

一、接口介绍 可查询多种类型的职业资格证书&#xff0c;包含&#xff1a;证券从业资格证查询、计算机信息高新技术考试证书查询、计算机技术与软件专业技术资格、全国教师资格证书查询、普通话证书查询合格证明、中小学教师资格考试合格证明&#xff08;NTCE&#xff09;、全国…

隐藏文件夹怎么显示,只需1分钟,快速学会

很多人在工作的过程中&#xff0c;将一些文件给隐藏了起来&#xff0c;后来需要使用的时候&#xff0c;却找不到隐藏的文件夹了。win10如何调出隐藏文件夹&#xff1f;隐藏文件夹怎么显示&#xff1f;只需1分钟&#xff0c;快速学会显示隐藏文件夹&#xff01; 隐藏文件夹怎么显…

【Mysql】复合查询

文章目录**1.基本查询回顾****2.多表查询** (重要)多表查询步骤**3.自连接**4.子查询在from子句中使用子查询5.合并查询1.基本查询回顾 准备工作,创建一个雇员信息表:&#xff08;来自oracle 9i的经典测试表&#xff09; EMP员工表 DEPT部门表 SALGRADE工资等级表 案例1:查询…

SVN+Gitee配置版本控制库

软件 TortoiseSVN&#xff1a;Downloads TortoiseSVN Gitee&#xff1a;https://gitee.com/ 操作步骤 在Gitee中新建仓库&#xff0c;设置仓库名以及模板&#xff08;Readme文件&#xff09;&#xff1b; 启用SVN访问 在仓库的管理页面&#xff0c;选择“功能设置”中的“…

为自己量身打造一个 Rust 项目模板/脚手架

摘要 quick-start-rs(quick start a rust project)是用于快速创建一个 rust 项目的脚手架/模板。 标题&#xff1a;为自己量身打造一个 Rust 项目模板/脚手架深度参考 Rust Code Quick Start文章来自 suhanyujieTags: Rust, utils, quick start, project template&#xff0c;脚…

视频编解码 — 带宽预测

目录 一、带宽预测作用 二、基于延时的带宽预测算法&#xff1a; 1、算法流程 2、计算延时 3、Trendline Filter 4、网络状态判断 5、带宽调整更新 三、基于丢包的带宽预测算法 1、带宽调整 四、最大带宽探测算法 五、最终的预测选择 一、带宽预测作用 控制音视频发…

荧光AF染料477876-64-5,Alexa Fluor 532,AF532 NHS ester

●中文名&#xff1a;AF532 活性酯&#xff0c;AF5 532酯 ●英文名&#xff1a;AF532-NHS &#xff0c;AF532 NHS ester&#xff0c;Alexa Fluor 532 ●外观以及性质&#xff1a; 荧光AF染料是具有磺化基团的荧光物质。AF染料带负电荷&#xff0c;具有亲水性高、亮度高、光稳定…

软件和硬件中的调用

文章目录**1 概述****2.1 程序进程内的调用&#xff1a;函数调用****2.2 程序进程间的调用&#xff1a;IPC****2.3 远程程序调用&#xff1a;RPC****2.4 远程调用REST****3 硬件“调用”****3.1 综述****总线模型****3.2 片内的总线****3.3 Chiplet多DIE封装互联总线****3.4 板…

1.1 统计学习方法的定义与分类

统计学习方法的定义与分类统计学习的概念统计学习的定义统计学习运用到的领域统计学习的步骤统计学习的分类统计学习的概念 统计学习的定义 统计学习 (Statistical Machine Learning) 是关于计算机基于数据构建概率统计模型并运用模型对数据进行预测与分析的一门学科。 以计…

Python任务调度框架Rocketry

文章目录定时任务库对比简介与其余框架的区别安装初试调度器基础测试方法字符串格式具体时间间隔周期某时间段条件 API条件逻辑方法对比执行选项在主进程和线程中执行进程线程异步设置默认选项日志流水线在一个任务后执行输入作为输出会话级参数函数参数TODO&#xff1a;元参数…

为什么说继承是把双刃剑

为什么说继承是把双刃剑 继承其实是把双刃剑&#xff1a;一方面继承是非常强大的&#xff1b;另一方面继承的破坏力也是很强的。 继承广泛应用于各种Java API、框架和类库之中&#xff0c;一方面它们内部大量使用继承&#xff0c;另一方面它们设计了良好的框架结构&#xff0c…

20221130 RabbitMQ

MQ MQ&#xff08;Message Queue&#xff09;消息队列&#xff0c;是基础数据结构中“先进先出”的一种数据结构。一般用来解决应用解耦&#xff0c;异步消息&#xff0c;流量削峰等问题&#xff0c;实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性架构。 主要的…

【正点原子FPGA连载】第二十三章 DDS信号发生器实验摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十三章 DDS信…

web网页设计期末课程大作业__公司官网 (曼谷科技 1页)带psd文件

⛵ 源码获取 文末联系 ✈ Web前端开发技术 描述 网页设计题材&#xff0c;DIVCSS 布局制作,HTMLCSS网页设计期末课程大作业 | 家公司官网网站 | 企业官网 | 酒店官网 | 等网站的设计与制 | HTML期末大学生网页设计作业&#xff0c;Web大学生网页 HTML&#xff1a;结构 CSS&…

基于CCE Kubernetes网络与持久化存储实战

✅作者简介&#xff1a; CSDN内容合伙人&#xff0c;全栈领域新星创作者&#xff0c;阿里云专家博主&#xff0c;阿里云问答板块版主&#xff0c;华为云享专家博主&#xff0c;掘金后端评审团成员 &#x1f495;前言&#xff1a; 最近云原生领域热火朝天&#xff0c;那么云原生…