最近要写一篇有关元胞自动机的论文,但是之前的理解不够深刻,因此在网上找到了北交贾斌、高自友等老师写的《基于元胞自动机的交通系统建模与模拟》。
因此先把VRP放放,写点读书笔记,然后是基于MicroCity的元胞自动机实现。开始吧! 努力奋斗。
元胞自动机应用广泛,所以先学习元胞自动机是啥吧。
1、Wolfram发起“科学革命”,用简单的电脑程序,也就是元胞自动机,取代数学方程。
2、元胞自动机(cellular automata or cellular automaton,CA)实质上是定义在一个具有离散、有限状态的元胞组成的元胞空间上,按照一定的局部规则,在离散的时间维度上演化的动力学系统。
3、Conway的生命游戏机(game of life)
咱们这个游戏机可带劲了,世界是一个类似于棋盘的二维方形网格,每个格子代表一个元胞,元胞具备两种状态,活(实心)or死(空白),然后这个世界有三条规则:
OK,咱们打开MicroCity开始编写。
local MakeGrid = AddModule('Grid','CreateWorld')
local Sim = AddModule('Simulation','Start')
local world_sim = AddParameter(MakeGrid, nil, "node", "Simulation Parameters")
WORLDSIZE = AddParameter(MakeGrid, world_sim, "value", "Size of the Game World", 50)
local game_sim = AddParameter(Sim, nil, "node", "Simulation Parameters")
DENSITY = AddParameter(Sim, game_sim, "value", "Density of the World at Beginning %", 50)
SEED = AddParameter(Sim, game_sim, "string", "Seed of Random Number Generation", "os.time()")
UPDATEINTV = AddParameter(Sim, game_sim, "value", "Graphics Update Interval (in seconds)", 800)
function Grid()
local world = CreateGrid('Nature', 'int', WORLDSIZE+1, WORLDSIZE+1)
end
local function GetNeighbors(x, y)
local num = 0
for i=-1,1 do
for j=-1,1 do
num = GetValue(world, x+i, y+j)==1 and num+1 or num
end
end
return num - GetValue(world, x, y)
end
function Simulation()
math.randomseed(assert(loadstring('return' .. SEED)))
world = GetControl('grid.sgrd')
size = GetGridMaxXY(world) - 1
--initiate
local cellMap = {}
for i=1,size do
cellMap[i] = {}
for j=1,size do
cellMap[i][j] = 0
end
end
for i=1,math.ceil(size*size*DENSITY/100) do
local x,y = math.random(size), math.random(size)
SetValue(world, 1, x, y)
cellMap[x][y] = 1
end
---------main sim---------------
while GetReady() do
Update(world)
Sleep(UPDATEINTV)
----------rules---------------
for i=1,size do
for j=1,size do
local neighbors = GetNeighbors(i, j)
if GetValue(world, i, j)==1 then
cellMap[i][j] = neighbors>1 and neighbors<4 and 1 or 0
else
cellMap[i][j] = neighbors==3 and 1 or 0
end
end
end
for i=1,size do
for j=1,size do
SetValue(world, cellMap[i][j], i, j)
end
end
end
end
这是个练蛊的游戏,我只跑了一次,左下角那个电梯F很有意思。里面有blinker、bolck、beehive、boat等,感兴趣的同学可以自己写个,研究研究,书中有具体的分析。不过为了论文的进度,咱们不能只玩游戏了。
元胞自动机最基本的组成单位包括元胞、元胞空间、邻居及规则,以及元胞的状态。
由于CA的演化规则是局部规则,只需要考虑元胞的邻近元胞就行,因此定义邻居的方式不同,产生的结果也不同。
邻居的划分方式包括
边界条件