生命游戲與整理房間

引論

我自己的房間一直很混亂,偶爾清理整潔,不過幾天,便又回歸混亂。想來當(dāng)似熱力學(xué)中的「熵增原理」。

然而耗散系統(tǒng)卻可以自然的形成某種「形式」,赫爾曼·哈肯在《協(xié)同學(xué)》中介紹了一個(gè)現(xiàn)象:用適當(dāng)?shù)姆绞郊訜嵋后w,液體會(huì)形成穩(wěn)定的、周期性的形狀。即它自發(fā)的形成了某種秩序。

但整理房間、整理物件,最要緊的便是「簡單」,復(fù)雜的方法總難堅(jiān)持。而基于啟發(fā)式策略的「生命游戲」則足夠簡單,也可以形成某種秩序,可以試著用它來整理房間。

Game of Life

所謂「生命游戲」(Game of Life),就如下圖所示,是在一個(gè)棋盤之中,有黑色的點(diǎn),有白色的點(diǎn)。黑色代表這里有一個(gè)點(diǎn),通過簡單的規(guī)則,產(chǎn)生豐富的圖樣。

Game of Life
Game of Life

它的基本規(guī)則是:

  1. 當(dāng)一個(gè)點(diǎn)周圍的點(diǎn)的數(shù)量高于某數(shù)時(shí),它將因?yàn)樘珦頂D而死亡;
  2. 當(dāng)小于某數(shù)時(shí),將因?yàn)樘陋?dú)而死亡。
  3. 當(dāng)某空白點(diǎn)周圍的黑子數(shù)目符合某條件時(shí),將會(huì)產(chǎn)生出一個(gè)新的點(diǎn)。
Game of Life
Game of Life

通過這種簡單的過程,可以形成非常非常復(fù)雜而有序的結(jié)構(gòu),比如上圖,是一個(gè)周期結(jié)構(gòu),穩(wěn)定的放在那里。

這與我們收拾房間在某些方面是相似的

  1. 房間內(nèi)的物體不可以太過擁擠,太擁擠則難以取用;
  2. 房間內(nèi)的物體不可太過零散,太零散則雜亂無章;

基于上邊兩條「基本法」,可以構(gòu)建一個(gè)自動(dòng)機(jī)模型。不過這里與生命游戲有一點(diǎn)差別:

房間里的東西不會(huì)無故丟失,也不會(huì)無故產(chǎn)生

也就是說,過于擁擠、零散的點(diǎn)上的物體,要改換位置,這個(gè)變換的方式當(dāng)有所講究,即優(yōu)先放到與自己類型相同的物體旁邊。

注意到這個(gè)時(shí)候,我們所有的規(guī)則都是基于單個(gè)點(diǎn)的,這是這種策略的一個(gè)優(yōu)勢(shì):即我們?cè)谑帐胺块g的時(shí)候,只需要考慮有限的物體。

代碼模擬

我們使用Mathematica建模模擬,下面是對(duì)代碼的一些解釋:

建立隨機(jī)初始值:

代碼

這段代碼是用來初始化和建立地圖的,其中:

randM = map*
   Table[RandomChoice[{1, 1, 3} -> {1, 2, 0}], {i, 1, 40}, {j, 1, 
     40}];

map矩陣數(shù)乘隨機(jī)產(chǎn)生的矩陣,用來使其符合地圖之要求。

隨機(jī)選取點(diǎn)進(jìn)行處理,并依照一定規(guī)則移動(dòng)細(xì)胞:

PRandom[m_, mx_] :=(*根據(jù)mx矩陣的高斯卷積產(chǎn)生加權(quán)隨機(jī)數(shù),決定與之交換的點(diǎn)*)
 Module[{pm = GaussianFilter[m, 2], wlist = {}, elist = {}},
  pm = Table[
    If[mx[[i]][[j]] == 0 && map[[i]][[j]] == 1, pm[[i]][[j]], 0], {i, 
     1, Length[m]}, {j, 1, Length[m[[1]]]}];
  wlist = Flatten[pm];
  elist = 
   Flatten[Table[{x, y}, {x, 1, Length[m]}, {y, 1, Length[m[[1]]]}], 
    1];
  RandomChoice[wlist*wlist -> elist]
  ]

m是某顏色物體的矩陣,mx是各個(gè)顏色物體的矩陣,其中pm是對(duì)m的高斯核卷積,以此算出隨機(jī)座標(biāo)的權(quán)值。PRandom[]函數(shù)本身就是依照mmx矩陣給出一個(gè)隨機(jī)座標(biāo),從而決定當(dāng)前點(diǎn)移動(dòng)到哪一點(diǎn)。

PRandomN[m_, n_] :=
 (*對(duì)顏色為n的點(diǎn)進(jìn)行操作*)
 Module[{m2 = 
    Table[If[m[[i]][[j]] == n, 1, 0], {i, 1, Length[m]}, {j, 1, 
      Length[m[[1]]]}]}, PRandom[m2, m]]

PRandom則是依照顏色n給出隨機(jī)座標(biāo)。

選取一點(diǎn)周圍的八個(gè)點(diǎn):

TakeAroundList[list_, p_] := Module[{len = Length[list]},
  Which[
   1 < p < len, list[[p - 1 ;; p + 1]],
   p == 1, {list[[len]]}~Join~list[[1 ;; 2]],
   p == len, list[[len - 1 ;; len]]~Join~{list[[1]]}
   ]
  ]

TakeAround[m_, {x_, y_}] := 
 Transpose@TakeAroundList[Transpose@TakeAroundList[m, x], y]

這兩段代碼比較簡單,不做詳細(xì)敘述,功能就是給出某一座標(biāo)x,y周圍的八個(gè)點(diǎn)(考慮了邊緣部分的問題)。

隨機(jī)增減物體:

PutInAndDelet[m_, {p1_, p2_}] := 
 Module[{m2 = m, pm = (1 - Sign /@ m)*map, wlist = {}, elist = {}, 
   x = 1, y = 1, maxColor = Max[m], pm2 = {}, xd = 1, yd = 1},
  pm2 = (1 - pm)*map;
  wlist = Flatten[pm];
  elist = 
   Flatten[Table[{x, y}, {x, 1, Length[m]}, {y, 1, Length[m[[1]]]}], 
    1];
  {x, y} = RandomChoice[wlist -> elist];
  {xd, yd} = RandomChoice[Flatten[pm2] -> elist];
  If[RandomReal[] < p1, m2[[x]][[y]] = RandomInteger[{1, maxColor}]];
  If[RandomReal[] < p1, m2[[xd]][[yd]] = 0];
  m2
  ]

隨機(jī)向內(nèi)撒入物體,隨機(jī)模式依照先前的PRandom[]思想。

迭代一次:

ChangeOne[m_] := 
 Module[{m2 = m, a = Length[m], b = Length[m[[1]]], 
   x = RandomInteger[{1, Length[m]}], 
   y = RandomInteger[{1, Length[m[[1]]]}], MRound = {}, MRound01 = {},
    n1 = 0, n2 = 0, p = 4, px = 0, py = 0},(*x,y隨機(jī)生成,作為迭代對(duì)象的座標(biāo)*)
  
  If[m[[x]][[y]] != 0,(*某點(diǎn)是物體的時(shí)候,執(zhí)行下述操作*)
   MRound = TakeAround[m, {x, y}];
   MRound[[2]][[2]] = 0;
   MRound01 = Sign /@ MRound;
   n1 = Total[Flatten[MRound01]];(*以上操作給出其周圍鄰居數(shù)量*)
   {px, py} = PRandomN[m, m[[x]][[y]]];(*隨機(jī)給出移動(dòng)方位*)
   
   
   If[
    n1 != p, m2[[px]][[py]] = m[[x]][[y]]; m2[[x]][[y]] = 0(*若不符合宜居條件,則移動(dòng)*)
    ]; m2,
   ChangeOne[m](*若此點(diǎn)為空,則遞歸直到此點(diǎn)非空*)
   ]
  
  ]

ChangeOne[]代表迭代一次,輸入為一矩陣,輸出亦為一矩陣。為了效率,地圖數(shù)據(jù)使用全局變量。注釋見代碼。

有了ChangeOne[]函數(shù)之后,便可以使用Nest[]NestList[]函數(shù)對(duì)其進(jìn)行迭代。

實(shí)際迭代實(shí)驗(yàn):

mxList = NestList[Nest[ChangeOne, #, 1000] &, randM, 5];

Table[ArrayPlot[mxList[[i]], ColorFunction -> "Rainbow", 
  Epilog -> {Polygon[{{0, 40}, {11, 40}, {11, 29}, {0, 29}}], 
    Polygon[{{18, 0}, {18, 12}, {40, 12}, {40, 0}}]}], {i, 1, 6}]

給出如下圖像:

迭代過程

可以看到其由隨機(jī)、混亂的狀態(tài)漸漸的變得有序。

我們還可以考察它的聚合度,聚合度定義為Count[Flatten[mr], mr[[2]][[2]]]/8,其越接近于1則越密集。下面是隨著系統(tǒng)演化,聚合度變化的過程:

聚合度

可以明顯的看到,其聚合度很快便上升到了約0.7左右(多次實(shí)驗(yàn)都穩(wěn)定在這個(gè)值)。并且這個(gè)圖是考慮了隨機(jī)增減物品后的圖像,其對(duì)隨機(jī)增加的物品的承受力比較強(qiáng)。

當(dāng)然,我自己也要在實(shí)際生活中實(shí)踐這個(gè)啟發(fā)式策略,看看是否能產(chǎn)生效用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評(píng)論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,538評(píng)論 3 417
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評(píng)論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評(píng)論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,761評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,207評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評(píng)論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,419評(píng)論 0 288
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,959評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,782評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評(píng)論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,222評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評(píng)論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,678評(píng)論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,978評(píng)論 2 374

推薦閱讀更多精彩內(nèi)容