我正在尝试在Matlab中模拟14个节点和21个链接的网络流量。我有一个名为“New_Connection”的函数和另一个名为“Close_connection”的函数。
现在我使用'for'循环实现了流量。在每次迭代中称为“New_Connection”,其随机选择源节点,目标节点和随机持续时间(现在该值是整数)被执行。可以设置也可以不设置此连接(锁定)。
之后,称为“Close_connection”函数,它检查所有连接时间(存储在数组中),如果它们的值为0,则关闭连接。
最后,在循环结束之前,将一个临时单位减去最后建立的所有连接。
我想要的是使用实现时间(例如1分钟)的系统来执行此模拟,并且在任何时候,任何节点都建立新连接。例如:
t=0.000134 s ---- Node1 to Node8
t=0.003024 s ---- Node12 to Node11
t=0.003799 s ---- Node6 to Node3
.
.
.
t=59.341432 s ---- Node1 to Node4
“Close_Connection”函数会考虑这些时间来关闭连接。
我搜索过有关Simulink,SimEvents,并行计算,离散事件模拟的信息......但我无法真正了解其功能。
非常感谢你,并为我的英语道歉。
答案 0 :(得分:2)
您不需要使用像SIMEVENTS
这样的复杂框架。对于简单任务,您可以编写自己的事件队列。以下代码实现了一个简单的场景。创建新的连接T =统一(0,10)秒,删除10s后的连接
%max duration
SIMTIME=60;
T=0;
NODES=[1:20];
%Constructor for new events. 'Command' is a string, 'data' gives the parameters
MAKEEVENT=@(t,c,d)(struct('time',t,'command',c,'data',{d}));
%create event to end simulation
QUEUE(1)=MAKEEVENT(SIMTIME,'ENDSIM',[]);
%create initial event to create the first connection
QUEUE(end+1)=MAKEEVENT(0,'PRODUCECONNECTION',[]);
RUN=true;
while RUN
[nT,cevent]=min([QUEUE.time]);
assert(nT>=T,'event was created for the past')
T=nT;
EVENT=QUEUE(cevent);
QUEUE(cevent)=[];
fprintf('T=%f\n',T)
switch (EVENT.command)
case 'ENDSIM'
%maybe collect data here
RUN=false;
case 'PRODUCECONNECTION'
%standard producer pattern
%Create a connection between two random nodes every 10s
next=rand*10;
QUEUE(end+1)=MAKEEVENT(T+next,'PRODUCECONNECTION',[]);
R=randperm(size(NODES,2));
first=NODES(R(1));
second=NODES(R(2));
fprintf('CONNECT NODE %d and %d\n',first,second)
%connection will last for 20s
QUEUE(end+1)=MAKEEVENT(T+next,'RELEASECONNECTION',{first,second});
case 'RELEASECONNECTION'
first=EVENT.data{1};
second=EVENT.data{2};
fprintf('DISCONNNECT NODE %d and %d\n',first,second)
end
end