元胞自动机在交通系统中的应用之一【元胞自动机的基础知识】

最近要写一篇有关元胞自动机的论文,但是之前的理解不够深刻,因此在网上找到了北交贾斌、高自友等老师写的《基于元胞自动机的交通系统建模与模拟》。

因此先把VRP放放,写点读书笔记,然后是基于MicroCity的元胞自动机实现。开始吧! 努力奋斗。

上篇: 元胞自动机的基础知识

元胞自动机应用广泛,所以先学习元胞自动机是啥吧。

第一章 绪论

1、Wolfram发起“科学革命”,用简单的电脑程序,也就是元胞自动机,取代数学方程。

2、元胞自动机(cellular automata or cellular automaton,CA)实质上是定义在一个具有离散、有限状态的元胞组成的元胞空间上,按照一定的局部规则,在离散的时间维度上演化的动力学系统。

3、Conway的生命游戏机(game of life)

      咱们这个游戏机可带劲了,世界是一个类似于棋盘的二维方形网格,每个格子代表一个元胞,元胞具备两种状态,活(实心)or死(空白),然后这个世界有三条规则:

  1. 生存:对一个活的元胞,如果它的邻居中有两个或三个元胞是活的,那么该元胞将继续生存下去;
  2. 死亡:对一个活的元胞,i.如果它的邻居中有四个或四个以上的元胞是活的,那么该元胞将由于拥挤而死去,ii.如果它的邻居中只有一个或没有活的元胞,那么该元胞将由于孤立无援而死去;
  3. 繁殖:对一个空的元胞,如果它的邻居中有3个活的元胞,则变成一个活元胞。

OK,咱们打开MicroCity开始编写。

  1. Grid:是MicroCity里的格子类型,也可看做一种数据结构类型,横坐标为X轴,纵坐标为Y轴,是离散的,坐标(0,0)的cell中心为(0,0),从-0,5到0.5,如果cellsize=1时。
  2. 创建Xmax=10,Xmin=0的格子,会有11个
  3. 还有其他的function,具体看代码
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的演化规则是局部规则,只需要考虑元胞的邻近元胞就行,因此定义邻居的方式不同,产生的结果也不同。

邻居的划分方式包括

边界条件

发布了11 篇原创文章 · 获赞 27 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/sinat_41644416/article/details/82785406