1.背景
在前文已经有所提及,Agent-Based Modeling(简称ABM,代理基础建模)通过构建具体的模型以模拟个体代理及其组成的群体之间的互动,进而研究整体系统的行为与演化。而其中较为典型的例子便是通过特定环境条件下的流体模拟(人流车流等)而对应空间性质进行参考评估,如城市空间的公共性、商业性、可达性等一系列性质量化研究。
如上述项目就导入了地图及建筑等数据形成了相应的环境模型,并实现了人流、车流、污染源等的模拟。该项目由JavaScript语言编写,源代码包含载入环境,预设主体,输出图像,项目测试等文件,考虑了用户操作界面及交互,一定程度上实现了对道路疏通性、公共性、污染防治效果等领域的的模拟运用,在城市尺度的空间环境分析研究上仍具有发展潜力。
而同样基于ABM开发而成的Social Force项目则是聚焦代理点在抽象空间环境下相互作用的运动过程,相对于前者Social Force项目研究的维度更微观具体,同时该项目完整地纳入了障碍、吸引、排斥、边界等基本的作用力条件,基于ABM的研究更为详实科学,基础的底层框架使得项目整体呈现出更强的拓展性。
2.框架拆解
经笔者的拆解分析,可以看出项目整体构建了一个相对简洁且清晰的文件框架。主体由配置文件——项目入口——模拟器构成,通过相应完整的参数调配与赋值声明,能够实现任意数量代理群体在相应环境条件下的运动模拟。
3.重构及运行生成
3.1 初始化环境
模拟一组相遇并绕过障碍的运动轨迹:
from pathlib import Path
import numpy as np
import pysocialforce as psf
if __name__ == "__main__":
initial_state = np.array(
[
[0.0, 10, -0.5, -0.5, 0.0, 0.0],
[0.5, 10, -0.5, -0.5, 0.5, 0.0],
[0.0, 0.0, 0.0, 0.5, 1.0, 10.0],
]
)
# social groups informoation is represented as lists of indices of the state array
groups = [[1, 0], [2]]
obs = [[1, 2, 7, 8]]
s = psf.Simulator(
initial_state,
groups=groups,
obstacles=obs,
config_file=Path(__file__).resolve().parent.joinpath("example.toml"),
)
# update 50 steps
s.step(50)
# 使用 with 语句创建了一个 SceneVisualizer 实例 sv,并在代码块结束时自动关闭该实例
with psf.plot.SceneVisualizer(s, "images/exmaple") as sv:
sv.animate()
模拟一定数量群体往同一目标运动的进行轨迹:
from pathlib import Path
import numpy as np
import pysocialforce as psf
if __name__ == "__main__":
# initial states, each entry is the position, velocity and goal of a pedestrian in the form of (px, py, vx, vy, gx, gy)
min_position = 0
max_position = 3.0
min_velocity = -0.5
max_velocity = 1.5
min_goal = 8
max_goal = 10
num_pedestrians = 100
# 生成随机数据
initial_state = np.random.uniform(
[min_position, min_position, min_velocity, min_velocity, min_goal, min_goal],
[max_position, max_position, max_velocity, max_velocity, max_goal, max_goal],
size=(num_pedestrians, 6)
)
groups = None
obs = [[-1, -1, -3, 11], [5, 13, -3, 11]]
s = psf.Simulator(
initial_state,
groups=groups,
obstacles=obs,
config_file=Path(__file__).resolve().parent.joinpath("example.toml"),
)
# update 50 steps
s.step(50)
# 使用 with 语句创建了一个 SceneVisualizer 实例 sv,并在代码块结束时自动关闭该实例
with psf.plot.SceneVisualizer(s, "images/exmaple") as sv:
sv.animate()
可以看到代理点群体在相互作用下逐渐像目标区域趋近,在合理控制速度及位置的范围情况下,项目代理能够模拟近似人群运动的结果,抽象化的研究群体效应对具体空间的性能分析(公共性、疏散性、边界控制等)具有一定意义。
3.2 其他模拟结果
总体看来,项目在空间商业性分析、医疗建筑人流评估、景观路径等领域具有开发潜力,ABM作为一种空间分析维度能够进一步优化并完善设计,是一种更具实用价值的空间分析方法