• 继续向peersim的event-driven模式开火!(新手勿喷)


    昨天学习了peersim的cycle模式,今天开始继续悟事件模式。

    总的来说,我个人认为事件模式是周期模式的升级版,或者说,周期模式只是事件模式的一个子功能。

    事件模式是基于时间和事件的(没打错),每次实验的开始会设定结束时间和若干要处理的事件,当时间结束,或者事件全部做完,实验就结束,而在结束之前,也是可以周期性的执行一些事件,所以说周期模式只是事件模式的一个子功能。

    学习方法还是直接看代码,看不懂的地方直接去找对应的源文件,一层层从子类往上看。

    贴上样例代码,功能和周期模式一样,首先是对网络中的每个节点赋初始值(这里使用线性分布),接着每个节点和相邻节点求平均值

    样例代码:

      1 /*
      2  * Copyright (c) 2003 The BISON Project
      3  *
      4  * This program is free software; you can redistribute it and/or modify
      5  * it under the terms of the GNU Lesser General Public License version 2 as
      6  * published by the Free Software Foundation.
      7  *
      8  * This program is distributed in the hope that it will be useful,
      9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     11  * GNU Lesser General Public License for more details.
     12  *
     13  * You should have received a copy of the GNU Lesser General Public License
     14  * along with this program; if not, write to the Free Software
     15  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
     16  *
     17  */
     18 
     19 package example.edaggregation;
     20 
     21 import peersim.vector.SingleValueHolder;
     22 import peersim.config.*;
     23 import peersim.core.*;
     24 import peersim.transport.Transport;
     25 import peersim.cdsim.CDProtocol;
     26 import peersim.edsim.EDProtocol;
     27 
     28 /**
     29 * Event driven version of epidemic averaging.
     30 */
     31 public class AverageED extends SingleValueHolder
     32 implements CDProtocol, EDProtocol {                     //这里除了ED协议,还实现了CD协议,正是因为在实验中会周期性的执行一些事件,所以要实现CD协议             
     33 
     34 //--------------------------------------------------------------------------
     35 // Initialization
     36 //--------------------------------------------------------------------------
     37 
     38 /**
     39  * @param prefix string prefix for config properties
     40  */
     41 public AverageED(String prefix) { super(prefix); }
     42 
     43 
     44 //--------------------------------------------------------------------------
     45 // methods
     46 //--------------------------------------------------------------------------
     47 
     48 /**
     49  * This is the standard method the define periodic activity.
     50  * The frequency of execution of this method is defined by a
     51  * {@link peersim.edsim.CDScheduler} component in the configuration.
     52  */
     53 public void nextCycle( Node node, int pid )        //这里就是周期模式的核心代码部分,定义了周期性的行为
     54 {
     55     Linkable linkable = 
     56         (Linkable) node.getProtocol( FastConfig.getLinkable(pid) );    
     57     if (linkable.degree() > 0)
     58     {
     59         Node peern = linkable.getNeighbor(
     60                 CommonState.r.nextInt(linkable.degree()));          //这部分的功能是得到本地节点的一个邻居节点,而不是所有相邻节点
     61         
     62         // XXX quick and dirty handling of failures
     63         // (message would be lost anyway, we save time)
     64         if(!peern.isUp()) return;
     65         
     66         ((Transport)node.getProtocol(FastConfig.getTransport(pid))).     //这里涉及到了传输层,功能是像邻居节点发送信息,把本地的值发过去
     67             send(
     68                 node,
     69                 peern,
     70                 new AverageMessage(value,node),
     71                 pid);
     72     }
     73 }
     74 
     75 //--------------------------------------------------------------------------
     76 
     77 /**
     78 * This is the standard method to define to process incoming messages.
     79 */
     80 public void processEvent( Node node, int pid, Object event ) {        //这里是ED模式的核心代码部分,用来处理事件
     81         
     82     AverageMessage aem = (AverageMessage)event;                       //从邻居节点那里接受到的信息
     83     
     84     if( aem.sender!=null )                                           //如果邻居节点的发送者不为空,说明本节点并不是目的节点,所以继续帮他转发
     85         ((Transport)node.getProtocol(FastConfig.getTransport(pid))).
     86             send(
     87                 node,
     88                 aem.sender,
     89                 new AverageMessage(value,null),
     90                 pid);
     91                 
     92     value = (value + aem.value) / 2;                             //如果为空,则说明本节点就是目的节点,所以把对方的值和本地的平均值替换本地值
     93 }
     94 
     95 }
     96 
     97 //--------------------------------------------------------------------------
     98 //--------------------------------------------------------------------------
     99 
    100 /**
    101 * The type of a message. It contains a value of type double and the
    102 * sender node of type {@link peersim.core.Node}.
    103 */
    104 class AverageMessage {                                   //信息类,非常简单,只有一个value和sender
    105 
    106     final double value;
    107     /** If not null,
    108     this has to be answered, otherwise this is the answer. */
    109     final Node sender;
    110     public AverageMessage( double value, Node sender )
    111     {
    112         this.value = value;
    113         this.sender = sender;
    114     }
    115 }

    以上就是ed模式下的一个简单的样例,功能也很简单,对比下周期模式,我觉得他是这么工作的:在每个定义的周期内向邻居发送节点,当节点接受到发送来的信息后,则会处理(求平均值),其中内部部分是通过一个堆来管理这些事件(send()方法本身就是把事件添加到堆当中)

    然而难点并不是这,而是配置文件部分。。。shit :(

    贴代码

     1 # network size                             #首先是类似宏定义的一样定义了几个值,方便一会使用,果然换了ED模式连这里都高级起来了
     2 SIZE 1000
     3 
     4 # parameters of periodic execution
     5 CYCLES 100
     6 CYCLE SIZE*10000                     
     7 
     8 # parameters of message transfer
     9 # delay values here are relative to cycle length, in percentage,
    10 # eg 50 means half the cycle length, 200 twice the cycle length, etc.
    11 MINDELAY 0
    12 MAXDELAY 0
    13 # drop is a probability, 0<=DROP<=1
    14 DROP 0
    15 
    16 random.seed 1234567890
    17 network.size SIZE
    18 simulation.endtime CYCLE*CYCLES
    19 simulation.logtime CYCLE
    20 
    21 ################### protocols ===========================   #这部分比较麻烦,全是新的玩意
    22 
    23 protocol.link peersim.core.IdleProtocol          #网络还是选的之前的一样
    24 
    25 protocol.avg example.edaggregation.AverageED
    26 protocol.avg.linkable link
    27 protocol.avg.step CYCLE          #这里的step类似于周期的概念
    28 protocol.avg.transport tr        #这里的tr在下面有定义
    29 
    30 protocol.urt UniformRandomTransport       #这里是具体的传输层协议,功能是以随机的延迟(随机范围在下面定义)发送消息,发送的实质是向事件的堆中添加事件
    31 protocol.urt.mindelay (CYCLE*MINDELAY)/100
    32 protocol.urt.maxdelay (CYCLE*MAXDELAY)/100
    33 
    34 protocol.tr UnreliableTransport          #一个不稳定的传输层协议,以下面的drop的值随机丢包,实际传输还是用的上面urt
    35 protocol.tr.transport urt
    36 protocol.tr.drop DROP
    37 
    38 ################### initialization ======================
    39 
    40 init.rndlink WireKOut                    #网络布局,节点以k出度相连
    41 init.rndlink.k 20
    42 init.rndlink.protocol link
    43 
    44 init.vals LinearDistribution            #给每个节点的赋初值,线性分布,具体分布方法是定义step= (max.doubleValue()-min.doubleValue())/(Network.size()-1);   setter.set(i,Math.round(i*step)+min.longValue()); 详细见源文件
    45 init.vals.protocol avg 46 init.vals.max SIZE 47 init.vals.min 1 48 49 init.sch CDScheduler #这里很关键,定义了一个周期调度管理器,会在每个周期的开始随机打乱节点的部分,每隔一个cycle值就打乱一次 50 init.sch.protocol avg 51 init.sch.randstart 52 53 ################ control ============================== 54 55 control.0 SingleValueObserver #这里的step指定了周期值,使得监测者也会在每个指定的周期调用一次,否则control则会想周期模式一样调度 56 control.0.protocol avg 57 control.0.step CYCLE

    最后贴上实验结果:


    EDSimulator: resetting
    Network: no node defined, using GeneralNode
    EDSimulator: running initializers
    - Running initializer init.rndlink: class peersim.dynamics.WireKOut
    - Running initializer init.sch: class peersim.edsim.CDScheduler
    - Running initializer init.vals: class peersim.vector.LinearDistribution
    EDSimulator: loaded controls [control.0]
    Current time: 0
    control.0: 1.0 1000.0 1000 500.5 83416.66666666667 1 1
    Current time: 10000000
    control.0: 37.5 919.0 1000 500.5 25724.159091250687 1 1
    Current time: 20000000
    control.0: 206.7109375 767.890625 1000 500.5 8096.807036889389 1 1
    Current time: 30000000
    control.0: 352.373046875 695.453125 1000 500.5 2578.022573176135 1 1
    Current time: 40000000
    control.0: 412.430419921875 625.474609375 1000 500.5 801.1082179446831 1 1
    Current time: 50000000
    control.0: 436.43787479400635 570.459858417511 1000 500.5 243.53994072762902 1 1
    Current time: 60000000
    control.0: 470.7608990445733 527.0359845032217 1000 500.49999999999994 74.13788674564383 1 2
    Current time: 70000000
    control.0: 483.6040476858616 518.0301055684686 1000 500.49999999999903 23.428974301677556 1 1
    Current time: 80000000
    control.0: 490.5196089811798 512.0301471857779 1000 500.4999999999993 7.285566419597019 1 1
    Current time: 90000000
    control.0: 494.97216907397836 506.0375954180854 1000 500.4999999999999 2.1798299307442246 1 1
    Current time: 100000000
    control.0: 497.18190345272336 503.5837144460532 1000 500.5000000000001 0.6073148838336206 1 1
    Current time: 110000000
    control.0: 498.54320551492475 502.3533156558903 1000 500.5 0.1786794435445898 1 2
    Current time: 120000000
    control.0: 499.4023441821402 501.4962048486104 1000 500.49999999999966 0.055257607540637785 1 1
    Current time: 130000000
    control.0: 500.0032071191514 501.09832936709677 1000 500.4999999999995 0.017914865984002482 1 1
    Current time: 140000000
    control.0: 500.2115701087355 500.83018846682955 1000 500.5000000000003 0.005681541785868155 1 1
    Current time: 150000000
    control.0: 500.34130672550015 500.6817038675913 1000 500.49999999999983 0.0018027434356275712 1 1
    Current time: 160000000
    control.0: 500.4099993828274 500.593872603867 1000 500.50000000000006 5.362825330674977E-4 1 1
    Current time: 170000000
    control.0: 500.45257293353984 500.54348273631905 1000 500.50000000000057 1.540724446790086E-4 1 1
    Current time: 180000000
    control.0: 500.4730336913324 500.5308245606462 1000 500.49999999999983 4.870521656989873E-5 2 1
    Current time: 190000000
    control.0: 500.48375224793585 500.5157654498322 1000 500.4999999999995 1.6009524787167412E-5 1 1
    Current time: 200000000
    control.0: 500.48865909872677 500.50651976294216 1000 500.50000000000017 5.077729859315717E-6 1 1
    Current time: 210000000
    control.0: 500.4951192430326 500.5047676794802 1000 500.5000000000002 1.6155684864646324E-6 1 1
    Current time: 220000000
    control.0: 500.4974085478983 500.502935896735 1000 500.50000000000045 5.105843169016166E-7 1 1
    Current time: 230000000
    control.0: 500.4987222960319 500.5016402188968 1000 500.5000000000002 1.6512563666543207E-7 1 1
    Current time: 240000000
    control.0: 500.49903235648463 500.50092451432386 1000 500.49999999999994 5.299286046125987E-8 1 1
    Current time: 250000000
    control.0: 500.49958979342233 500.50059026547086 1000 500.5000000000001 1.5440470612681545E-8 1 1
    Current time: 260000000
    control.0: 500.4996881991682 500.500274943262 1000 500.5000000000001 4.8652048911656945E-9 1 1
    Current time: 270000000
    control.0: 500.49977403242923 500.5001382754437 1000 500.4999999999995 2.0101744759906163E-9 1 1
    Current time: 280000000
    control.0: 500.49987495360983 500.50007640960587 1000 500.5 1.7479778052092316E-10 1 1
    Current time: 290000000
    control.0: 500.49994445650935 500.5000501190701 1000 500.5000000000004 0.0 1 1
    Current time: 300000000
    control.0: 500.4999661034419 500.50002345424616 1000 500.49999999999994 3.2046259762169247E-10 1 1
    Current time: 310000000
    control.0: 500.4999712575856 500.50001450012803 1000 500.5000000000001 0.0 1 1
    Current time: 320000000
    control.0: 500.49998996075124 500.50001003198986 1000 500.5000000000003 0.0 1 1
    Current time: 330000000
    control.0: 500.4999953242251 500.5000043994592 1000 500.50000000000045 0.0 1 1
    Current time: 340000000
    control.0: 500.4999966553132 500.5000031137919 1000 500.49999999999994 5.826592684030772E-11 2 1
    Current time: 350000000
    control.0: 500.49999822203824 500.50000161478096 1000 500.49999999999994 2.6219667078138473E-10 1 1
    Current time: 360000000
    control.0: 500.4999990494662 500.5000007140138 1000 500.4999999999997 4.0786148788215407E-10 1 1
    Current time: 370000000
    control.0: 500.49999953087456 500.5000003780667 1000 500.50000000000057 0.0 1 1
    Current time: 380000000
    control.0: 500.4999997027671 500.5000002330102 1000 500.50000000000006 0.0 1 1
    Current time: 390000000
    control.0: 500.49999980445176 500.5000001249846 1000 500.5000000000003 0.0 1 1
    Current time: 400000000
    control.0: 500.4999998909826 500.5000000637969 1000 500.50000000000017 0.0 2 1
    Current time: 410000000
    control.0: 500.4999999491945 500.50000003001117 1000 500.50000000000006 2.330637073612309E-10 1 1
    Current time: 420000000
    control.0: 500.49999997587577 500.500000020472 1000 500.5000000000005 0.0 1 1
    Current time: 430000000
    control.0: 500.4999999853711 500.5000000123341 1000 500.49999999999966 1.456648171007693E-10 1 1
    Current time: 440000000
    control.0: 500.4999999932832 500.500000006375 1000 500.5 0.0 1 1
    Current time: 450000000
    control.0: 500.4999999963538 500.50000000440656 1000 500.5000000000004 0.0 1 1
    Current time: 460000000
    control.0: 500.4999999981322 500.50000000189016 1000 500.4999999999998 4.952603781426156E-10 1 1
    Current time: 470000000
    control.0: 500.49999999882857 500.50000000100374 1000 500.5000000000001 2.913296342015386E-11 1 1
    Current time: 480000000
    control.0: 500.4999999993252 500.5000000005659 1000 500.49999999999983 8.739889026046158E-11 1 1
    Current time: 490000000
    control.0: 500.49999999949034 500.500000000275 1000 500.50000000000006 5.826592684030772E-11 1 1
    Current time: 500000000
    control.0: 500.49999999982185 500.500000000164 1000 500.50000000000006 2.6219667078138473E-10 1 1
    Current time: 510000000
    control.0: 500.4999999998772 500.5000000001006 1000 500.49999999999983 3.7872852446200017E-10 1 1
    Current time: 520000000
    control.0: 500.4999999999419 500.50000000005065 1000 500.4999999999994 7.574570489240003E-10 1 1
    Current time: 530000000
    control.0: 500.4999999999752 500.5000000000325 1000 500.5000000000001 0.0 1 2
    Current time: 540000000
    control.0: 500.49999999998687 500.5000000000167 1000 500.50000000000006 0.0 1 1
    Current time: 550000000
    control.0: 500.4999999999914 500.50000000000847 1000 500.5 5.826592684030772E-11 1 1
    Current time: 560000000
    control.0: 500.4999999999958 500.5000000000048 1000 500.5 0.0 1 2
    Current time: 570000000
    control.0: 500.49999999999693 500.50000000000296 1000 500.5 0.0 1 1
    Current time: 580000000
    control.0: 500.4999999999983 500.50000000000153 1000 500.5 0.0 1 1
    Current time: 590000000
    control.0: 500.49999999999886 500.5000000000009 1000 500.5 0.0 1 1
    Current time: 600000000
    control.0: 500.4999999999992 500.50000000000045 1000 500.5 0.0 1 3
    Current time: 610000000
    control.0: 500.49999999999966 500.5000000000003 1000 500.5 0.0 1 2
    Current time: 620000000
    control.0: 500.49999999999983 500.50000000000017 1000 500.5 0.0 4 1
    Current time: 630000000
    control.0: 500.4999999999999 500.5000000000001 1000 500.5 0.0 9 2
    Current time: 640000000
    control.0: 500.49999999999994 500.5 1000 500.5 0.0 10 990
    Current time: 650000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 660000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 670000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 680000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 690000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 700000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 710000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 720000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 730000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 740000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 750000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 760000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 770000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 780000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 790000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 800000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 810000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 820000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 830000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 840000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 850000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 860000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 870000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 880000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 890000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 900000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 910000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 920000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 930000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 940000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 950000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 960000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 970000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 980000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    Current time: 990000000
    control.0: 500.5 500.5 1000 500.5 0.0 1000 1000
    EDSimulator: queue is empty, quitting at time 999980413

  • 相关阅读:
    openJudge计算概论-谁考了第k名
    OpenJudge计算概论-求平均年龄
    OpenJudge计算概论-能被3,5,7整除的数
    OpenJudge计算概论-计算书费
    OpenJudge计算概论-计算三角形面积【海伦公式】
    OpenWrt 中安装配置Transmission
    OpenWrt中wifidog的配置及各节点页面参数
    Linux中后台执行任务
    通过ionice和nice降低shell脚本运行的优先级
    OpenWrt中对USB文件系统的操作, 以及读写性能测试
  • 原文地址:https://www.cnblogs.com/btlcmr/p/5369999.html
Copyright © 2020-2023  润新知