for node in [n1, n2, n3, n4]: NameError: name 'n1' is not defined
时间: 2023-10-29 19:28:39 浏览: 148
Error in mounted hook: "ReferenceError: AMap is not defined" fo
5星 · 资源好评率100%
抱歉,这是因为在计算数据包等待时延时,变量`n1、n2、n3、n4`没有定义。为了解决这个问题,我们需要将节点对象存储在一个列表中,并在计算数据包等待时延时遍历该列表。以下是修改后的代码,你可以参考一下:
```python
import simpy
import random
# 定义仿真参数
SIM_TIME = 100 # 仿真时间
LAMBDA = 1/1000 # 平均每毫秒生成一个包
PKT_SIZE_MIN = 1024 # 包的最小大小
PKT_SIZE_MAX = 10 * 1024 # 包的最大大小
BW = 10 * 1024 * 1024 # 带宽,单位bps
# 定义节点类
class Node:
def __init__(self, env, name, out_links):
self.env = env
self.name = name
self.out_links = out_links
self.queue = [] # 队列
self.busy = False # 是否忙碌
# 发送数据包
def send_pkt(self, pkt):
# 随机选择一个输出链接
link = random.choice(self.out_links)
# 传输时间
t_transmit = pkt.size * 8 / BW
# 等待传输完成
yield self.env.timeout(t_transmit)
# 发送数据包到对应的节点
link.recv_pkt(pkt)
# 接收数据包
def recv_pkt(self, pkt):
# 将数据包加入队列
self.queue.append(pkt)
# 如果节点当前空闲,开始处理数据包
if not self.busy:
self.busy = True
self.env.process(self.process_pkt())
# 处理数据包
def process_pkt(self):
while len(self.queue) > 0:
# 从队列中取出一个数据包
pkt = self.queue.pop(0)
# 等待处理完成
yield self.env.timeout(pkt.size * 8 / BW)
# 处理完成后,节点变为空闲状态
self.busy = False
# 定义数据包类
class Packet:
def __init__(self, env, size):
self.env = env
self.size = size
self.timestamp = env.now
# 定义网络拓扑结构
def create_topology(env):
# 创建节点
n1 = Node(env, 'N1', [])
n2 = Node(env, 'N2', [])
n3 = Node(env, 'N3', [])
n4 = Node(env, 'N4', [])
# 设置节点之间的链接关系
n1.out_links = [n2]
n2.out_links = [n3, n4]
# 开始生成数据包
while True:
# 生成一个数据包
pkt_size = random.randint(PKT_SIZE_MIN, PKT_SIZE_MAX)
pkt = Packet(env, pkt_size)
# 将数据包发送到N2节点
n2.queue.append(pkt)
# 根据70%的概率将数据包发送到N3节点,30%的概率将数据包发送到N4节点
if random.random() < 0.7:
n3.recv_pkt(pkt)
else:
n4.recv_pkt(pkt)
# 计算下一个数据包的生成时间
t = random.expovariate(LAMBDA)
yield env.timeout(t)
# 存储节点对象
nodes = [n1, n2, n3, n4]
# 运行仿真程序
env = simpy.Environment()
env.process(create_topology(env))
env.run(until=SIM_TIME)
# 统计数据包的等待时延
pkt_delays = []
for node in nodes:
for pkt in node.queue:
pkt_delays.append(env.now - pkt.timestamp)
if len(pkt_delays) > 0:
print('最大等待时延:{}ms'.format(max(pkt_delays)))
print('最小等待时延:{}ms'.format(min(pkt_delays)))
print('平均等待时延:{}ms'.format(sum(pkt_delays) / len(pkt_delays)))
else:
print('没有数据包等待')
```
希望这次能够顺利运行。
阅读全文