从零开始了解agent-based simulator
有关交通的simulator
上一篇:🔗 [2023-08-30 - Truxton's blog] https://truxton2blog.com/2023-08-30/ 看了一眼repast,但发现难度有点大,所以先学一学自己写一个简单的
因为发现repast的上手难度挺高,有的时候(对于简单的任务)可能还不如手写来得快,因为手写的代码全程都是自己的,自己能看懂,自己能调优。
所以本文从这里开始
(总结上一周学过的内容)
用OOP的思路去解释simulator,example:
程序会创建一个抽象的地图(以简单的无向图为例),这个地图是静态不变的;
程序会设计一个class Agent:里面包含了一个agent的属性,比如它的随机速度,它的随机刷新点,它的随机目标,它的一些其他属性
class Agent:
type # passanger, taxi, bus, etc
speed
spawn_position
destination
然后模拟器开始运行:
t=0,生成1000个class Agent的实例,这1000个Agents一出生就开始按自己的属性运动
class Agent:
# properties of an abstract Agent
agent_lst = []
for i in range(0, 1000):
agent_lst.append(Agent())
t=1,更新1000个Agent实例的状态(运动到了哪里,速度是多少)
t=2,继续更新1000个Agent实例的状态(运动到了哪里,速度是多少)
......
同时,一个上帝视角的观察者会观察:1. 整个地图的状态(比如拥堵状况) 2. 1000个Agent实例的状态(比如:有多少个实体处于活跃状态)
这就是整个模拟器要做的事。诸如红绿灯、stop sign这些东西也是可以一点一点加进来的,但目前只需要考虑一个简单的就可以。
然后就是有关模拟器的优化,目前大量的计算量主要来源于:
- 很多时候会一次性生成几万个Agent实例,每次更新时间t -> t+1的时候都要遍历这几万个Agent实例的状态属性
- 即使是同一份代码也要多跑很多遍才能稳定一些统计数据,因为有很多随机因素
- 接上面,可改/可尝试/可优化的参数太多,只要改一个参数就要重跑整个模型,而且目前看来很多思路就像炼丹,参数一多就更不好改了(这里优化了那里又掉性能了)
Last Modified in 2025-08-15