如何在SUMO中固定文件名生成不同流量分配的随机车流?
在SUMO中生成同名但随机车流不同的.rou.xml文件
问题描述
使用duarouter工具生成随机车流并输出为同名.rou.xml文件时,发现只有修改输出文件名才能得到不同的流量分配。当前使用的代码如下:
import subprocess def run_duarouter(net_xml_file, input_file, output_file, add_xml): command = [ 'duarouter', '-n', net_xml_file, '--additional-files', add_xml, '--route-files', input_file, '--randomize-flows', '--output-file', output_file, ] subprocess.run(command, check=True)
期望在循环中重复调用该函数时,保持输出文件名不变但每次生成不同的流量分配:
for episode in range(num_episodes): run_duarouter(net_xml,input_file,output_file,add_xml)
问题原因
duarouter默认会基于输入参数和输出文件名缓存路由计算结果。当输出文件名相同时,工具会直接复用缓存的结果,而不会重新执行随机化流程,导致流量分配无变化。
解决方案
通过两个关键参数解决该问题:
--ignore-cache:强制禁用缓存,每次运行都重新计算路由和随机流量。--seed:指定不同的随机种子,确保每次随机化的结果可预测且不重复。
修改后的代码
更新run_duarouter函数,支持传入随机种子并添加禁用缓存的参数:
import subprocess def run_duarouter(net_xml_file, input_file, output_file, add_xml, seed=None): command = [ 'duarouter', '-n', net_xml_file, '--additional-files', add_xml, '--route-files', input_file, '--randomize-flows', '--output-file', output_file, '--ignore-cache' # 禁用缓存,强制重新计算 ] # 传入不同的随机种子,确保每次随机结果不同 if seed is not None: command.extend(['--seed', str(seed)]) subprocess.run(command, check=True)
循环调用示例
在循环中为每次调用传入不同的种子值:
num_episodes = 5 for episode in range(num_episodes): # 使用episode编号作为种子,确保每次种子唯一 run_duarouter(net_xml, input_file, output_file, add_xml, seed=episode + 1)
说明
--ignore-cache确保duarouter不会复用之前的缓存结果,必须重新执行计算。--seed参数控制随机化的初始值,相同种子会生成相同的流量分配,不同种子则生成不同结果,适合需要复现或控制随机过程的场景。
内容的提问来源于stack exchange,提问作者Le Xu
相关产品推荐
相关产品推荐

