F-coin - 架構即AI

F-Coin

圖說:F幣情境綜合題  

『前言』

 為了讓新進員工可以快速熟識 OOP 與 FP 之間的思維切換,以及編寫狀況,公司內部細心設計出的題目。其主旨是先從微積分題目出發,逐漸轉型成程式編寫的問題。我們稱之為 F-coin,一個與好友同時在線挖礦的應用題目來做說明。如果是玩遊戲比較多的讀者,比較熟識的會是點擊類型遊戲,又稱為 Incremental Game。 『背景介紹』 F-coin,是一個與好友一起挖礦的應用程式。當你打開 App 時,你可以努力點擊螢幕來賺取金錢,俗話說的好,獨樂樂不如眾樂樂,因此你也找了朋友一同參與挖礦行列。有了朋友的相伴,即使是在無聊的遊戲也會繽紛許多,邊緣人是不會懂這種感覺的。朋友上線時,你可以得到對應的夥伴獎勵,直到朋友下線之前,這獎勵會一直都在,你挖礦的效率會遠比一個人在線上時來的量多。 這大概就是整體情境了,現在我們要開始帶入數字好精準知道,自己到底可以有多少錢入帳。當 app 啟動時候,每一秒鐘可以增加 1 塊錢;當點擊螢幕時,挖礦金額會增加 10 塊錢;一個朋友在線上時候,我可以獲得 每秒增加 0.25 塊錢的獎勵值。 現在我們關注 30 秒鐘的時間長度,朋友在線狀況如下圖所示,我個人點擊的時間點也在圖上呈現,請問在第 30 秒鐘的時候,我總共有多少錢?再來問,如何使用程式來撰寫這個應用程式?
圖說:如何撰寫這個挖礦程式呢?  

『頗析問題』 

這個題目一頭栽進去勢必很難進入狀況,主因是情況頗為複雜,把狀況細分拆解過後就會簡單容易些,我們可以先從沒有朋友、朋友上線、朋友下線等,狀況逐一去分解與計算,先『歸納』出應該有的情形,再去『推演』複雜狀況,最後再用『反證』來做校正。 

情況ㄧ、只有自己的時間與點擊螢幕(對應自己)

這個情境下,狀況都是非常開心的,因為沒有其他人來干擾你,混淆你的計算,單純只有自己,因此,在只有自己與點擊螢幕的狀況下,獲取的金錢量可以輕鬆地被計算出,專注在點擊螢幕後,我們自己可以拿到的錢,距離點擊螢幕事件多長時間除上計算單位,再乘上點擊螢幕倍率,就可以得到總金額。圖上的案例,簡化到,距離點擊螢幕事件只經過1秒。
圖說:情境一,一切都簡單且美好

 情況二、自己+已上線朋友(對應甲朋友) 

這邊可以注意到我們自己的挖礦速度粗略的分成點擊螢幕前與點擊螢幕後,這個在情境一時我們已經學習到了,現在多放入朋友早就在線上的情況,別忘了,當我們有一個朋友在線上時,挖礦速度也是會持續增加,因此,針對情境二,我們一上線的時候,就會先行檢查有哪些朋友在線上了。一步一步來,先從檢查幾個朋友在線開始做起,在 t_{0} 時候,我們上線了,這邊記得檢查幾個朋友在線,這樣才多一點 Bonus,接著時間來到 t_{f} 了,我們自己進行一次螢幕點擊,也就是說獎勵機制被改變了,會了避免新的獎勵機制污染到我們原有的獎勵金,因此我們在 t_{f} 時間點先進行一次結算。也就是圖上當中的"點擊螢幕前"區塊。接著時間繼續跑到 t_{1} 時間點,我們要下線了,為此,我們需要結算目前為止的獎勵金,於是就有了圖上當中的"自己下線前"區塊。 分段出兩個時間區段中的獎勵至此,你可以看到我們有兩個區塊是重複出現的式子,顯然地,一個是針對在線朋友數這個事件,另一個則是針對點擊螢幕這個事件。總結,我們將這兩個事情化成事件進行描述整理在旁。這樣我們只需要關注事件發生與否就好,不用一直去關注到底有沒有"點擊螢幕"這個事件,隨時去問說有幾個朋友在線上。 我是屬於被動地接收通知,被動的接受事件發生,這恰如 Reactive programming 當中的精神一樣,我是針對我所關注的事件進行反應,而非一昧地去瞭解。這大概就像是你朋友在煮泡麵時,你每2秒鐘就過去問說「好沒?」「好沒?」「好沒?」與你朋友煮好泡麵再來通知你的差異吧。 更進一步來說,我們把事件整理起來放一旁,等等好用上,就先稱呼"朋友上線"為事件1,"點擊螢幕"為事件2。
圖說:歸納出事件1、事件2

情況三、自己+中途朋友上線(對應乙朋友) 

現在我們已經知道重點在於關注事件是否觸發,才去進行動作本身,如同現實生活中,你不會每天去問一次朋友是否結婚了,而是等他送紅色炸彈來的那一刻,你才知道這個事情,也才會有後續去ATM包200塊給對方當賀禮的過程,有點離題了。延續前面的思想與策略,沿用事件1、事件2,來去計算各個時段之間該獲得的獎勵,推演同時,你也會發現一些之前沒有被視為是事件的事件,例如這邊,我把自己上線、自己下線分別使用事件3、事件4 做使用,因為自己下線時候也會結算一次目前獎勵,也是個事件,同理自己上線本身也是。
圖說:整理出更多事件了!

情況四、自己+中途朋友下線(對應丙朋友) 

以此類推,朋友下線時,也算是個事件,當然是讓對方來通知你,這時候你才去更新自己的朋友清單,這邊就不贅述太多。if you know, you know.  

『回到程式本身』

 既然如此,又要怎麼開始我們的程式碼呢?我們已經知道關注事件本身,被動接收通知,那怎麼開始?回到起點,城市要跑起來,勢必是要跟記憶體索取區塊方能執行動作。如同表演舞台一般,我們先把道具、人物、服裝準備好,才可以在舞台(stack)上進行表演與互動,一個士兵不夠,就去後面拿(new)回來,當然是跟某個士兵管理員拿,由他負責統籌與規劃士兵這個角色的管理,這是 Facade design pattern 的一種表現,更簡略的理解是 Factory Pattern。 程式本身有三個邏輯在處理,Constructor()、Init()、mapEventToState()。像是一隻乾扁扁的水蛭一樣,注入血液之後,才會回過來並針對其他事情做出反應,風的流向、獵物的出現等,其中 Constructor 就像是描述這隻水蛭該擁有哪些屬性,需要手腳、吸食用口器等,Init()則像是注入血液的動作,灌入之後,水蛭的各個器官因為血液而被驅動,mapEventToState()就可以針對外面世界的風吹草動進行反應了。這個結構目前被稱為 Bloc pattern(Business logic component)。 

『使用 BLoc pattern 實作 F-coin』

 按照前面的推演,我們需要定義三個函式Constructor()、Init()、mapEventToState()。針對 F-coin 我們可以整理出幾個常見的變數,例如朋友清單、當前獎勵值、增加速率等,這些放在 Constructor()中,Init()當中,我們則呼叫更新線上朋友數量的函示,以及調整當前獎勵值的函示,最後,mapEventToState() 當中寫入依照關注的事件本身所需要做出的反應。 

『結論』 

至此,你已經學習到如何使用稱為 BLoc pattern 的方式來實現 F-coin,並且了解到關注事件本身才做出反應的這件事情可以讓你省去許許多多的計算資源,希望你可以看得懂這邊要闡述的觀念與想法。

『進一步來說』 

每個 Bloc 中都會擁有的 state,依照事件來改變 state,也就是相當於某一個 function,得到什麼而吐出什麼,所以假設說我丟進去的是食物名稱,我可以得到對食物的喜好程度,其中喜好程度使用 0~1 來做表達,這樣不就可以說是 logistic regression 的表現了嗎?然後很多個 logistic regression 接在一起就形成一個 neural network,所以實作大型且多個 Bloc 就相當於在系統當中直接實作類神經網路了,如此一來,下一步就是實現 back propagation 以及 objective function,就可以建立一套人工智慧系統了。

留言

這個網誌中的熱門文章

Raspberry pi 樹莓派系列 :安裝瀏覽器

『如何說出好故事|故事架構介紹|輕鬆做出大師級故事架構』

『目標管理|SMART原則|最有效的目標管理原則』