【元胞自动机】基于matlab元胞自动机传染病传播模拟【含Matlab源码 1680期】
一、元胞自動(dòng)機(jī)簡(jiǎn)介
1 元胞自動(dòng)機(jī)發(fā)展歷程
最初的元胞自動(dòng)機(jī)是由馮 · 諾依曼在 1950 年代為模擬生物 細(xì)胞的自我復(fù)制而提出的. 但是并未受到學(xué)術(shù)界重視.
1970 年, 劍橋大學(xué)的約翰 · 何頓 · 康威設(shè)計(jì)了一個(gè)電腦游戲 “生命游戲” 后, 元胞自動(dòng)機(jī)才吸引了科學(xué)家們的注意.
1983 年 S.Wolfram 發(fā)表了一系列論文. 對(duì)初等元胞機(jī) 256 種 規(guī)則所產(chǎn)生的模型進(jìn)行了深入研究, 并用熵來(lái)描述其演化行 為, 將細(xì)胞自動(dòng)機(jī)分為平穩(wěn)型, 周期型, 混沌型和復(fù)雜型.
2 對(duì)元胞自動(dòng)機(jī)的初步認(rèn)識(shí)
元胞自動(dòng)機(jī)(CA)是一種用來(lái)仿真局部規(guī)則和局部聯(lián)系的方法。典型的元胞自動(dòng)機(jī)是定義在網(wǎng)格上的,每一個(gè)點(diǎn)上的網(wǎng)格代表一個(gè)元胞與一種有限的狀態(tài)。變化規(guī)則適用于每一個(gè)元胞并且同時(shí)進(jìn)行。典型的變化規(guī)則,決定于元胞的狀態(tài),以及其( 4 或 8 )鄰居的狀態(tài)。
3 元胞的變化規(guī)則&元胞狀態(tài)
典型的變化規(guī)則,決定于元胞的狀態(tài),以及其( 4 或 8 )鄰居的狀態(tài)。
4 元胞自動(dòng)機(jī)的應(yīng)用
元胞自動(dòng)機(jī)已被應(yīng)用于物理模擬,生物模擬等領(lǐng)域。
5 元胞自動(dòng)機(jī)的matlab編程
結(jié)合以上,我們可以理解元胞自動(dòng)機(jī)仿真需要理解三點(diǎn)。一是元胞,在matlab中可以理解為矩陣中的一點(diǎn)或多點(diǎn)組成的方形塊,一般我們用矩陣中的一點(diǎn)代表一個(gè)元胞。二是變化規(guī)則,元胞的變化規(guī)則決定元胞下一刻的狀態(tài)。三是元胞的狀態(tài),元胞的狀態(tài)是自定義的,通常是對(duì)立的狀態(tài),比如生物的存活狀態(tài)或死亡狀態(tài),紅燈或綠燈,該點(diǎn)有障礙物或者沒(méi)有障礙物等等。
6 一維元胞自動(dòng)機(jī)——交通規(guī)則
定義:
6.1 元胞分布于一維線(xiàn)性網(wǎng)格上.
6.2 元胞僅具有車(chē)和空兩種狀態(tài).
7 二維元胞自動(dòng)機(jī)——生命游戲
定義:
7.1 元胞分布于二維方型網(wǎng)格上.
7.2 元胞僅具有生和死兩種狀態(tài).
元胞狀態(tài)由周?chē)肃従記Q定.
規(guī)則:
骷髏:死亡;笑臉:生存
周?chē)腥齻€(gè)笑臉,則中間變?yōu)樾δ?br /> 少于兩個(gè)笑臉或者多于三個(gè),中間則變死亡。
8 什么是元胞自動(dòng)機(jī)
離散的系統(tǒng): 元胞是定義在有限的時(shí)間和空間上的, 并且元 胞的狀態(tài)是有限.
動(dòng)力學(xué)系統(tǒng): 元胞自動(dòng)機(jī)的舉止行為具有動(dòng)力學(xué)特征.
簡(jiǎn)單與復(fù)雜: 元胞自動(dòng)機(jī)用簡(jiǎn)單規(guī)則控制相互作用的元胞 模擬復(fù)雜世界.
9 構(gòu)成要素
(1)元胞 (Cell)
元胞是元胞自動(dòng)機(jī)基本單元:
狀態(tài): 每一個(gè)元胞都有記憶貯存狀態(tài)的功能.
離散: 簡(jiǎn)單情況下, 元胞只有兩種可能狀態(tài); 較復(fù)雜情況下, 元胞具有多種狀態(tài).
更新: 元胞的狀態(tài)都安照動(dòng)力規(guī)則不斷更新.
(2)網(wǎng)格 (Lattice)
不同維網(wǎng)格
常用二維網(wǎng)格
(3)鄰居 (Neighborhood)
(4)邊界 (Boundary)
反射型:以自己作為邊界的狀態(tài)
吸收型:不管邊界(車(chē)開(kāi)到邊界就消失)
(5)規(guī)則(狀態(tài)轉(zhuǎn)移函數(shù))
定義:根據(jù)元胞當(dāng)前狀態(tài)及其鄰居狀況確定下一時(shí)刻該元胞狀態(tài)的動(dòng)力學(xué)函數(shù), 簡(jiǎn)單講, 就是一個(gè)狀態(tài)轉(zhuǎn)移函數(shù).
分類(lèi) :
總和型: 某元胞下時(shí)刻的狀態(tài)取決于且僅取決于它所有鄰居 的當(dāng)前狀態(tài)以及自身的當(dāng)前狀態(tài).
合法型: 總和型規(guī)則屬于合法型規(guī)則. 但如果把元胞自動(dòng)機(jī) 的規(guī)則限制為總和型, 會(huì)使元胞自動(dòng)機(jī)具有局限性.
(6)森林火災(zāi)
綠色:樹(shù)木;紅色:火;黑色:空地。
三種狀態(tài)循環(huán)轉(zhuǎn)化:
樹(shù):周?chē)谢鸹蛘弑婚W電擊中就變成火。
空地:以概率p變?yōu)闃?shù)木
理性分析:紅為火;灰為空地;綠是樹(shù)
元胞三種狀態(tài)的密度和為1
火轉(zhuǎn)化為空地的密度等于空地轉(zhuǎn)換為樹(shù)的密度(新長(zhǎng)出來(lái)的樹(shù)等于燒沒(méi)的樹(shù))
f是閃電的概率:遠(yuǎn)遠(yuǎn)小于樹(shù)生成的概率;T s m a x T_{smax}T smax
?是一大群樹(shù)被火燒的時(shí)間尺度
程序?qū)崿F(xiàn)
周期性邊界條件
購(gòu)進(jìn)啊
其中的數(shù)字為編號(hào)
構(gòu)建鄰居矩陣
上面矩陣中的數(shù)字編號(hào),對(duì)應(yīng)原矩陣相同位置編號(hào)的上鄰居編號(hào),一 一對(duì)應(yīng)
同樣道理:
(7)交通概念
車(chē)距和密度
流量方程
守恒方程
時(shí)空軌跡(橫軸是空間縱軸為時(shí)間)
紅線(xiàn)橫線(xiàn)與藍(lán)色交點(diǎn)表示每個(gè)時(shí)間車(chē)的位置。
如果是豎線(xiàn)則表示車(chē)子在該位置對(duì)應(yīng)的時(shí)間
宏觀(guān)連續(xù)模型:
最常用的規(guī)則:
紅色條表示速度是滿(mǎn)的。
1 加速規(guī)則:不能超過(guò)v m a x ( 2 格 / s ) v_{max}(2格/s)v
max(2格/s)
2 防止碰撞:不能超過(guò)車(chē)距
理論分析:
結(jié)果分析: 密度與流量
第一個(gè)圖:橫坐標(biāo)是歸一化后的密度,縱坐標(biāo)是車(chē)流量。第二個(gè)圖:理論值與CA的結(jié)果
結(jié)果分析: 時(shí)空軌跡
中間的深色區(qū)域是交通堵塞的區(qū)域。
二、案例及部分源代碼
1 案例
figure 1:wolfram的184號(hào)規(guī)則
這個(gè)規(guī)則可以讓元胞模擬出交通流的感覺(jué),為什么說(shuō)是感覺(jué)呢,因?yàn)榇蠹液孟窨吹搅艘粋€(gè)方塊或者說(shuō)叫一個(gè)小車(chē),在向前行進(jìn),但是并沒(méi)有模擬出交通流中的很多現(xiàn)象。隨后就有NaSch規(guī)則被提出來(lái)了,這個(gè)規(guī)則可以說(shuō)是所有元胞交通流模型的鼻祖,后面很多規(guī)則都是從這個(gè)規(guī)則中進(jìn)化而來(lái)的。而我們今天討論的靠右行駛的雙車(chē)道模型也是根據(jù)NaSch模型改進(jìn)而來(lái)的,簡(jiǎn)單討論一下NaSch模型,然后進(jìn)一步引出本文要講解的靠右行駛模型。
NaSch規(guī)則:
(1)加速,
(2)減速,
(3)以概率p隨機(jī)慢化速度,
(4)行進(jìn),
可以看到,NaSch規(guī)則就僅僅只有簡(jiǎn)單的四條,但是卻模擬出了交通流的最基本的東西,從其時(shí)空?qǐng)D就可以看出來(lái):
figure 2:Density=0.15,Vmax=5
figure 2是元胞長(zhǎng)度為1000,時(shí)間步為500時(shí)候得出的時(shí)空?qǐng)D。這里還有相應(yīng)的包括流量密度圖和速度密度圖等基本圖也可以得出來(lái)。
接下來(lái)離我們的靠右行駛模型又進(jìn)了一步,在這之前,我們?cè)俳榻B一下基于NaSch的雙車(chē)道模型STNS,有了雙車(chē)道模型,靠右行駛模型便不再是難事。
STNS規(guī)則:
可以從STNS的規(guī)則中看到,為了實(shí)現(xiàn)雙車(chē)道的CA交通流模型,我們實(shí)質(zhì)對(duì)NaSch模型的改動(dòng)僅僅是添加了一條換道規(guī)則,而換道規(guī)則看起來(lái)又是那么容易理解和合乎現(xiàn)實(shí)條件。這就是CA的魅力,通過(guò)稍微改動(dòng)規(guī)則,就可以實(shí)現(xiàn)一些我們想要的結(jié)果,后面我們將用靠右行駛模型來(lái)詮釋這個(gè)。當(dāng)然規(guī)則也是CA的噩夢(mèng),我們通常情況下并不知道什么時(shí)候該用CA的什么規(guī)則。
現(xiàn)在我將再引進(jìn)一條規(guī)則,在此規(guī)則下CA就可以實(shí)現(xiàn)2014MCM比賽中靠右行駛規(guī)則,同時(shí)可以預(yù)料到,再修改一些規(guī)則,仍然可以完整實(shí)現(xiàn)2014MCM比賽A題中的任何一個(gè)問(wèn)題,但是這里對(duì)此不予以討論。
Keep-Right Rule:
至此,靠右行駛規(guī)則用元胞自動(dòng)機(jī)實(shí)現(xiàn)完畢。下面是用Matlab實(shí)現(xiàn)的仿真模擬圖:
二、案例及部分源代碼
1 案例
1.1 元胞狀態(tài)
0 :代表易感者
1 :代表潛伏者
2 :代表患病者
3 :代表免疫者
4 :代表死亡者
5 : 代表虛擬邊界
1.2 規(guī)則
易感者的下一狀態(tài)只能有兩種:易感者 潛伏者
潛伏者的下一狀態(tài)只能有三種:潛伏者 患病者 免疫者
患病者的下一狀態(tài)只能有兩種:患病者 死亡者 易感者(治療)
免疫者的下一狀態(tài)只能有一種:免疫者
死亡者的下一狀態(tài)只能有一種:死亡者
狀態(tài)轉(zhuǎn)移的兩種方式:
1.自我影響
2.影響鄰居(鄰居影響)
1.3 鄰居
采用八鄰居格式。
2 部分代碼
close;clear;clc %參數(shù)初始化 n = 250; chushiqianfuzhe = 5; % 鄰居采用 8鄰居式% 0 :代表易感者 % 1 :代表潛伏者 % 2 :代表患病者 % 3 :代表免疫者 % 4 :代表死亡者 % 5 : 代表虛擬值p01 = 0.1; %潛伏者對(duì)易感者的概率 p02 = 0.2; %患病者對(duì)易感者的概率 p10 = 0.005; %免疫率 p24 = 0.001; %死亡率 p20 = 0.04; %對(duì)患病者治愈率 人工影響 p_10 = 0.06; %對(duì)潛伏者治愈率 k = 1; %患病系數(shù) 越大越說(shuō)明病毒前期蟄伏越長(zhǎng)rand('state',sum(clock)); present = 5*ones(n+2); present(2:n+1,2:n+1) = 0; while chushiqianfuzhe ~= sum(sum(present(2:n+1,2:n+1)))present(2+floor(n*rand),2+floor(n*rand)) = 1; end %潛伏者時(shí)間序列 T = zeros(n+2);for i = 1:10000J = 5*ones(n+2);to_qianfuzhe = zeros(n+2);for r = 2:n+1for l = 2:n+1%以下為易感者if present(r,l) == 0 % 只受外部影響 故可省略J(r,l) = 0;elseif present(r,l) == 1 %自我影響 以及 影響外部temp = exp(-k*(12 - T(r,l))/T(r,l)); %該公式代表病毒前期潛伏時(shí)長(zhǎng)% 自我影響if temp > rand %變?yōu)椴』颊?span id="ozvdkddzhkzd" class="token function">J(r,l) = 2;T(r,l) = 0;elseif rand < p10 %變?yōu)槊庖哒?span id="ozvdkddzhkzd" class="token function">J(r,l) = 3;T(r,l) = 0;elseif rand < p_10 %變?yōu)橐赘姓?span id="ozvdkddzhkzd" class="token function">J(r,l) = 0;T(r,l) = 0;else J(r,l) = 1;end% 影響鄰居if present(r-1,l-1) == 0if rand < p01to_qianfuzhe(r-1,l-1) = 1;endendif present(r-1,l) == 0if rand < p01to_qianfuzhe(r-1,l) = 1;endendif present(r-1,l+1) == 0if rand < p01ro_qianfuzhe(r-1,l+1) = 1;endendif present(r,l+1) == 0if rand < p01to_qianfuzhe(r,l+1) = 1;endendif present(r+1,l+1) == 0if rand < p01to_qianfuzhe(r+1,l+1) = 1;endendif present(r+1,l) == 0if rand < p01to_qianfuzhe(r+1,l) = 1;endendif present(r+1,l-1) == 0if rand < p01 to_qianfuzhe(r+1,l-1) = 1;endend if present(r,l-1) == 0if rand < p01 to_qianfuzhe(r,l-1) = 1;endendelseif present(r,l) == 2 % 自我影響 以及 影響鄰居% 自我影響if p24 > rand %變?yōu)樗劳稣?span id="ozvdkddzhkzd" class="token function">J(r,l) = 4;elseif p20 > rand %變?yōu)橐赘姓?span id="ozvdkddzhkzd" class="token function">J(r,l) = 0;elseJ(r,l) = 2;end三、運(yùn)行結(jié)果
四、matlab版本及參考文獻(xiàn)
1 matlab版本
2014a
2 參考文獻(xiàn)
[1] 包子陽(yáng),余繼周,楊杉.智能優(yōu)化算法及其MATLAB實(shí)例(第2版)[M].電子工業(yè)出版社,2016.
[2]張巖,吳水根.MATLAB優(yōu)化算法源代碼[M].清華大學(xué)出版社,2017.
[3]【數(shù)學(xué)建模】元胞自動(dòng)機(jī).博主:二進(jìn)制 人工智能
總結(jié)
以上是生活随笔為你收集整理的【元胞自动机】基于matlab元胞自动机传染病传播模拟【含Matlab源码 1680期】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 关于财务BI系统-报表分析(全)
- 下一篇: 数据结构与算法--4.使用堆栈模拟队列