干貨 | 手把手教你用AnyLogic實現(xiàn)武漢疫情的高級模型
文案代碼 向柯瑋
”
審核校對 鄧發(fā)珩
前言
經(jīng)過上次AnyLogic的簡單介紹,大家都反應(yīng)還不夠,想看更高級的。
向來寵各位伙伴的小瑋當(dāng)然會滿足大家的要求,這次給大家?guī)砩洗挝錆h疫情的加強(qiáng)版本。
經(jīng)過本篇推文,你就可以做出上面的模型~

那么廢話不多說,我們進(jìn)入今天的主要內(nèi)容。
本次參數(shù)
本次模型的參數(shù)較多,在這里直接給出,數(shù)據(jù)并不嚴(yán)謹(jǐn)。
- 總?cè)丝冢?000000人
- 規(guī)避系數(shù):0.1
- 隔離率:0.1
- 接觸人數(shù):50人
- 患者接觸感染率:0.01
- 潛伏者接觸感染率:0.05
- 就診率:0.5
- 潛伏期:10天
- 患病周期:5天
- 院內(nèi)治愈率:0.95
- 院外治愈率:0.8
- 患者接觸人數(shù):接觸人數(shù)*(1-規(guī)避系數(shù))
- 初始感染者:2000
- 易感染者:總?cè)丝?2000
- 病毒攜帶者:1000
- 暴露人群:500
- 家庭隔離者:500
- 入院患者,院內(nèi)治愈者,院內(nèi)死亡者,院外治愈者,院外死亡者。
正式步驟
好了,參數(shù)部分我們已經(jīng)先明確了,下面我們開始今天的正式步驟。
主要分為三個部分:運(yùn)行狀態(tài)圖,初始化圖和再美化。
運(yùn)動狀態(tài)圖
首先,打開我們的AnyLogic,新建一個模型,選擇工具欄中的系統(tǒng)動力學(xué)。

拖動一個存量出來,然后按住Ctrl,用鼠標(biāo)左鍵拖動存量,生成9個存量,并命名。

存量的作用類似于一個容器,把水存在里面,接下來,我們會用到叫做流量的工具,它就類似于水管的作用。
它可以使不同存量之間建立起聯(lián)系?,F(xiàn)在我們拖動流量,讓存量連接起來。然后對每個流量進(jìn)行命名。
在這里我們暫時不要讓暴露人群和院外治愈,院外死亡聯(lián)系起來,因為不美觀!在后面我們介紹一種方法,讓連線更美觀。
然后,我們就需要添加我們的參數(shù)了。同樣是在系統(tǒng)動力學(xué)中,我們把參數(shù)拖出來,命名并且賦值。
命名和賦值已經(jīng)在之前介紹過了,這里就不多加介紹了。
下一步就是給我們的每個存量賦值,讓他們與參數(shù)進(jìn)行聯(lián)系起來。但是在此之前,我們要用到一個叫做動態(tài)變量的東西。
這個是什么意思呢?就是我們之前的參數(shù)是不是就是賦值一個固定的初始值?而動態(tài)變量就是一個變化的值,它是由我們的參數(shù)和一定的系數(shù)構(gòu)成。
本題中,我們的動態(tài)變量是患者接觸人數(shù),且為接觸人數(shù)*(1-規(guī)避系數(shù))。

接下來,我們就是對我們的存量下手了,賦值并與參數(shù)建立聯(lián)系。記住要使不同的存量之間建立起聯(lián)系,我們要對流量進(jìn)行賦值。其中的規(guī)則本模型設(shè)置如下:
- 感染=易感染者*(病毒攜帶者潛伏者接觸感染率接觸人數(shù)+暴露人群患者接觸感染率患者接觸人數(shù))/總?cè)丝?/li>
- 隔離=病毒攜帶者*隔離率
- 不隔離=病毒攜帶者*(1-隔離率)
- 去醫(yī)院=家庭隔離者*就診率/潛伏期
- 住院=暴露人群*就診率/潛伏期
- 院外死亡=家庭隔離者*(1-院外治愈率)/患病周期
- 院外治愈=家庭隔離者*院外治愈率/患病周期
- 院內(nèi)死亡=入院患者*(1-院內(nèi)治愈率)/患病周期
- 院內(nèi)治愈=入院患者*(院內(nèi)治愈率/患病周期

到現(xiàn)在這個位置,我們就可以來解決最開始遺留的問題,暴露人群中可能有院外治愈,和院外死亡啊,那怎么辦呢?
在這里AnyLogic給我們提供了一種叫做影子的東西,我們對影子的各種操作和對本身的操作是一樣的。
右鍵點擊存量就可以選擇影子了,拖到合適的地方,然后再拖動流量建立聯(lián)系即可。

但是我們會看到,在屏幕下方會爆出兩個錯誤。

不用著急,這是因為我們還需要進(jìn)行一個步驟。我們可以點開這個錯誤,然后雙擊,就會自動移動到錯誤的位置。

定位到這個位置以后,我們點擊紅色的X就可以看到,是因為我們沒有建立鏈接,單擊建立鏈接就可以了。
最終我們的運(yùn)動狀態(tài)圖其實已經(jīng)建立好了,如下。

點擊運(yùn)行,就可以看到效果圖了。

當(dāng)然啦,這還不夠酷,分析圖呢?分析圖去哪兒啦?找到左側(cè)工具欄的分析區(qū),把我們想要的樣表拖出來,把值附上就ok了。

現(xiàn)在給出我們的效果圖~
初始化圖
好了,第一個部分我們已經(jīng)圓滿完成了,接下來,我們想一想,我們是不是每次想用不同的參數(shù)值來運(yùn)行,都需要重新在Main函數(shù)中再一個接一個賦值?我們可不可以每次在程序run了以后的界面更改參數(shù)?
你的意思是說,像下面這樣?
答案是,當(dāng)然可以!

回到工程欄,選擇當(dāng)前模型欄中的Simulation:Main,點進(jìn)去。

在進(jìn)行接下來的操作之前,我們需要先了解一個小小的概念。
我們這樣設(shè)置了這個界面,其實就是設(shè)置了變量,我們通過更改變量,從而更改相應(yīng)的參數(shù)。那么本次我們的主要內(nèi)容肯定是圍繞變量展開的。
進(jìn)入Simulation的界面之后,我們先進(jìn)入智能體中拖出一個變量,然后進(jìn)入演示中拖出一個文本,最后進(jìn)入控件中拖出一個編輯框。

我們在這里舉一個例子,大家就知道之后的其他參數(shù)應(yīng)該怎么進(jìn)行操作了。
將文本和變量的名稱進(jìn)行修改,比如改成接觸人數(shù)。(不修改也可以,修改了便于識別。)

點擊鏈接按鈕,選擇我們剛剛拖出的變量。之后,點擊空白處,看到我們的主屬性區(qū)的參數(shù)。

在接觸人數(shù)后面,改成我們當(dāng)前拖出來這個變量的名稱,比如說我剛剛把變量名稱改成了接觸人數(shù),在這里我就應(yīng)該填上接觸人數(shù)。

如果我們成功地設(shè)置了,前面的參數(shù)名稱會變成深色。
當(dāng)然在這里如果我們想設(shè)置一個默認(rèn)初始值,以便于我們不用每次進(jìn)入程序都把所有參數(shù)都重新輸入一次,也是可以的。

在相應(yīng)變量的初始值處設(shè)置一個就可以了。好了,我們可以點擊一下運(yùn)行,看看成功了沒有。如果出現(xiàn)了下面的界面就說明成功了。

如果我們想要設(shè)置隨機(jī)值的話,我們可以在初始值這個位置填上uniform(x,y),即隨機(jī)在x-y之間生成一個隨機(jī)數(shù)。

這樣設(shè)置的話,只是在我們第一次運(yùn)行這個程序的時候生成一個隨機(jī)數(shù),而不是每次運(yùn)行都可以生成一個隨機(jī)數(shù),后面運(yùn)行時的初始值都是第一次的隨機(jī)數(shù),除非我們關(guān)閉整個軟件。
這里面是為什么,我就不在這里多解釋啦,有興趣的伙伴可以去查一下隨機(jī)數(shù)種子這個概念。
那么我們怎么讓程序每次運(yùn)行都有一個新的隨機(jī)數(shù)呢?

其實很簡單,我們來到simulation的界面。

在隨機(jī)性一欄中選擇隨機(jī)種子,在之后我們每一次運(yùn)行程序就可以有不同的隨機(jī)數(shù)了。
現(xiàn)在我們就可以依次把所有的參數(shù)都按照上面的方式進(jìn)行操作。(為了美觀,我們可以把變量拖到其他地方)

總結(jié)一下,就是拖出三個原件,改名,鏈接,就可以了。
再美化
看到現(xiàn)在我們做的模型,總感覺有些地方做的不夠好。比如說
- 初始化的位置背景不好看
- 在運(yùn)動狀態(tài)圖的時候,我們總是需要往下面拉,才可以看到分析圖
不用著急,接下來,我們對程序進(jìn)行進(jìn)一步美化。在演示框中,拖出圖像。

我們就可以選擇一張圖片了,設(shè)置適合的大小以后,我們會很失望--因為他覆蓋了原來的東西。

不用著急,右鍵單擊圖片,選擇次序中的置于底層就可以完美解決這個問題了。

那如果我們想給當(dāng)前界面加一個標(biāo)題呢?我們需要的工具的位置依然是在演示中,選擇矩形。

在我們的界面上方畫一個矩形,然后再右側(cè)欄選擇填充顏色。

就可以設(shè)置好這一個矩形了,然后依然是演示欄,選擇文本。

拖到矩形上,輸入字,就可以做一個很酷的標(biāo)題了。如果想要實現(xiàn)這種,應(yīng)該怎么辦呢?

誒,對!就是再拖一個矩形出來,然后右鍵單擊選擇次序就可以了。

我們現(xiàn)在解決了第一個問題,那么接下來就是處理第二個問題的時候了。現(xiàn)在我們需要用到的是演示欄中的視圖區(qū)域工具。

然后利用這個工具,將我們的界面進(jìn)行區(qū)域化。

但是我們還是沒有實現(xiàn)跳轉(zhuǎn)的目的,別急。接下來,我們還是拖動一個矩形出來,然后用文本輸入兩個界面的名稱。

然后再在文本的高級選項中的點擊時填上view+視圖區(qū)域的名稱.navigateTo();。

最后,把這一欄復(fù)制到另外一個界面就可以了。

點擊運(yùn)行就可以看到效果了。
