一種利用資訊熵獎勵智能體構建方塊世界(Minecraft)的方法
===
## 評價資源
我們能夠直觀的以資源的稀有程度去抽象的衡量資源的價值;越稀有的資源越有價值,反之亦然。但是經濟學上的價值是透過供需市場產生的,並不能作為有明確定義的綱量。我們能獲得的是資源生成在地圖上的機率,但是僅有資源機率並不能夠適當直接作為 agent 的評價手段,需要一些額外的處理。
### 夏農熵與夏農資訊 (Shannon Entropy and Information)
夏農熵本質上是對我們司空見慣的「不確定現象」的數學化度量。[^信息熵]
$$
\mathrm H (X) = \mathrm{E}[\mathrm{I}(X)] = \mathrm{E}[-\ln(\mathrm{P}(X))]
$$
其中 $I$ 為夏農資訊,被定義為:
$$
I(X) = - \log_2 \mathrm{P}(X)
$$
我們可以注意到當中的 $-\log_2 p_i$ 所描述的意義為:「事件發生的機率越低,則當該事件發生時所夾帶的資訊越大」,因此夏農熵也是對不確定的夏農資訊的期望值,亦可寫作:
$$
\mathrm H (X) = - \sum_i p_i \log_2 p_i
$$
### 合成式 (Formular of Crafting)
為了方便描述合成或其他遊戲機制使資源 (items) 發生變化的過程,我借用了化學反應式的形式來表達:
$$
aX + bY \xrightarrow[P]{} cZ
$$
$a,b,c$:原料或產物的數量
$X,Y$:原料,合成過程會被消耗的物品
$Z$:產物
$P$:合成途徑,參與合成但是不會被消耗的物品。
### 資源的資訊量 (Information of Items)
Minecraft 世界在本質上就是一團數位資料,因此將其視作一串由方塊構成的資訊,並用夏農熵或夏農資訊去衡量其資訊量是十分合理的作法。對於一個不確定狀態的方塊來說,其值為:
$$
\mathrm H (X) = \mathrm{E} ( \mathrm{I}) = - \sum_i p_i \log_2 p_i
$$
其 中$p_i$ 為某種類型的方塊出現在地圖中的機率,換句話說我們可以得知特定種類方塊其資訊量為:
$$
I_x = -\log_2 p_x
$$
### 合成的資訊量 (Information of Crafting)
天然資源能夠以其在地圖生成的機率來計算熵,但是 Minecraft 中的大部分物品需透過合成途徑獲得,當我提到合成是指:「能夠被合成式所表示的所有遊戲機制」,這些非天然物品的熵需透過計算取得。
以一個合成為例:
$$
X + Y \xrightarrow[W]{} Z
$$
$X,Y,W$ 分別代表三種不同類型的方塊,我們可以視作三個隨機事件,而這三者出現在地圖的機率分別為 $p_X, p_Y, p_W$ 並且互為獨立事件,因此我們可以得知事件 $Z$ 發生的機率為三者的機率相乘,也就是三者資訊量的加總:
$$
\begin{align}
I_Z &= -\log_2(p_X p_Y p_W) \\
&= -\log_2 p_X -\log_2 p_Y -\log_2 p_W \\
&= I_X + I_Y + I_W
\end{align}
$$
#### 數量的變化 (The ratio between resource and product)
當原料與產物的比值不為 1 時,物品的總數量發生了變化。
$$
mX \xrightarrow[P]{} nY
$$
則:
$$
H_Y = \frac{m}{n}H_X
$$
#### 合成途徑 (Crafting Path)
作為合成途徑的物品不會被消耗,因此:
$$
\begin{array}{l}
X \xrightarrow[W]{} Y & \Delta I = I_W
\end{array}
$$
#### 多重途徑 (Multiple Crafting Path)
當一個物品有多種取得途徑時可以視作一個並聯系統 (parallel systems),因此該物品的資訊量可以寫作:
$$
I = -\log_2 [1 - \prod_i(1-p_i)]
$$
### 零資訊的資源 (The Items with Zero Entropy)
怪物掉落物仰賴怪物的生成,但是怪物生成的機率並不是與空間關聯,而是與時間關聯的,以空間機率考慮:
$$
H |_{\Delta t = 0}= -\lim_{p \rightarrow0^+} p\log p = 0
$$
若或是考慮其在無窮的時間中能夠被無限生成,事件發生的機率為 1,因此:
$$
H |_{t \rightarrow \infty} = -\log(1) = 0
$$
### 環境的資訊量 (Information of Environment)
當我們要量化系統的資訊量時,必須先界定所謂的「系統」。要定義一個系統,我們要給定一個範圍(空間大小)以及具體包含了多少方塊或物品。以下有三種定義應該是我們比較常用的系統類型:
1. 完整系統
- 在一劃定的範圍內,所包含的方塊、收納方塊內容物、掉落物與玩家物品欄(裝備欄)內容物。
3. 方塊系統
- 在一劃定的範圍內,所包含的方塊與收納方塊內容物。
5. 玩家系統
- 玩家物品欄(裝備欄)內容物。
透過到目前為止建立的規則,我們可以量化一個系統的熵,而該值能透過統計地圖中的方塊與實體取得。隨著 agent 在環境中活動,我們可以預期環境的熵會因此發生改變,這個變化量便可做為評量 agent 的指標之一。
## 資訊量表 (Table of Items Information)
以下的資訊量評估值僅供參考,過程並不嚴謹並且沒有對所有的物品進行計算。目的只是透過實做示範如何實踐本文建構的理論,有興趣的人可以自行用更嚴謹的方式建構完整的遊戲物件資訊量表。
### 天然資源 (Natual Resource)
使用 Cuberite 1.7.X-linux64[^Cuberite-release] 生成地圖並搭配插件[^statistics-plugin]統計方塊數量。總共抽樣 10 次,每次都會將地圖檔案刪除以生成新的種子。為了簡化數據,將紅花與黃花視為同樣的東西,並將流動水、流動岩漿、鵝卵石、火把、火焰、生怪磚、箱子與枯萎灌木移除並用空氣取代。統計資料如下表:
| 方塊 | 數量 | 生成機率 | 資訊量 | 熵 |
| ---------------- | --------- | --------- | ---------- | --------- |
| Air | 151464079 | 0.7506049 | 0.4138744 | 0.3106562 |
| Bedrock | 788224 | 0.0039062 | 8.0000287 | 0.0312495 |
| Brown Mushroom | 648 | 0.0000032 | 18.2484248 | 0.0000586 |
| Cactus | 11 | 0.0000001 | 24.1288432 | 0.0000013 |
| Clay | 8790 | 0.0000436 | 14.4866274 | 0.0006310 |
| Coal Ore | 345962 | 0.0017145 | 9.1880208 | 0.0157526 |
| Cobweb | 1998 | 0.0000099 | 16.6239340 | 0.0001646 |
| Diamond Ore | 19629 | 0.0000973 | 13.3275758 | 0.0012964 |
| Dirt | 2347857 | 0.0116352 | 6.4253617 | 0.0747603 |
| Double Plant | 14242 | 0.0000706 | 13.7904107 | 0.0009733 |
| Fence | 8543 | 0.0000423 | 14.5277478 | 0.0006151 |
| Flower | 4014 | 0.0000199 | 15.6174499 | 0.0003107 |
| Gold Ore | 43697 | 0.0002165 | 12.1730282 | 0.0026360 |
| Grass | 471646 | 0.0023373 | 8.7409299 | 0.0204303 |
| Gravel | 534501 | 0.0026488 | 8.5604417 | 0.0226750 |
| Iron Ore | 395336 | 0.0019592 | 8.9955550 | 0.0176237 |
| Lapis Lazuli Ore | 17690 | 0.0000877 | 13.4776284 | 0.0011815 |
| Leaves | 382779 | 0.0018969 | 9.0421227 | 0.0171522 |
| Lily Pad | 122 | 0.0000006 | 20.6575375 | 0.0000125 |
| Obsidian | 2390 | 0.0000118 | 16.3654799 | 0.0001938 |
| Rail | 2528 | 0.0000125 | 16.2844941 | 0.0002040 |
| Red Mushroom | 974 | 0.0000048 | 17.6604969 | 0.0000852 |
| Redstone Ore | 160117 | 0.0007935 | 10.2995079 | 0.0081725 |
| Sand | 272220 | 0.0013490 | 9.5338613 | 0.0128615 |
| Sandstone | 109888 | 0.0005446 | 10.8426005 | 0.0059045 |
| Snow | 3033 | 0.0000150 | 16.0217451 | 0.0002408 |
| Still Lava | 158088 | 0.0007834 | 10.3179065 | 0.0080834 |
| Still Water | 3281908 | 0.0162640 | 5.9421715 | 0.0966437 |
| Stone | 40812030 | 0.2022507 | 2.3057837 | 0.4663463 |
| Sugar Canes | 41 | 0.0000002 | 22.2307228 | 0.0000045 |
| Tallgrass | 66818 | 0.0003311 | 11.5603257 | 0.0038279 |
| Vines | 1179 | 0.0000058 | 17.3849268 | 0.0001016 |
| Wood Plank | 12762 | 0.0000632 | 13.9487080 | 0.0008822 |
| Wood | 55614 | 0.0002756 | 11.8251144 | 0.0032591 |
### 加工品 (Products)
#### 木板
$$
\text{Wood} \xrightarrow[]{} 4 \text{ Wood Plank}
$$
$$
\begin{align}
I_{WP} &= \frac1{4} I_{W} = 0.25 \cdot 11.8\\
&= 2.95
\end{align}
$$
#### 工作台
$$
4 \text{ Wood Plank} \xrightarrow[]{} \text{Crafting Table}
$$
$$
\begin{align}
I_{CT} &= 4 I_{WP} = 4 \cdot 2.95 \\
&= 11.8
\end{align}
$$
#### 木棒
$$
2 \text{ Wood Plank} \xrightarrow[]{} 4 \text{ Stick}
$$
$$
\begin{align}
I_{S} &= \frac{2}{4} I_{WP} = 0.5 \cdot 2.95 \\
&= 1.475
\end{align}
$$
#### 木鎬
$$
3 \text{ Wood Plank} + 2 \text{ Stick}
\xrightarrow[\text{Crafting Table}]{}
\text{ Wooden Pickaxe}
$$
$$
\begin{align}
I_{\text{WPickaxe}}
&= 3 I_{\text{WPlank}} + 2 I_{S} + I_{CT}\\
&= 3 \cdot 2.95 + 2 \cdot 1.475 + 11.8\\
&= 23.6
\end{align}
$$
#### 鵝卵石
為了簡化計算,下列過程不考慮其他材質的鎬挖掘的情況。
$$
\text{ Stone }
\xrightarrow[\text{Wooden Pickaxe}]{}
\text{ Cobblestone}
$$
$$
\begin{align}
I_{C}
&= I_{S} + I_{WP} \\
&= 2.31 + 23.6 \\
&= 25.91
\end{align}
$$
#### 熔爐
$$
8\text{ Cobblestone }
\xrightarrow[\text{Crafting Table}]{}
\text{ Furnace}
$$
$$
\begin{align}
I_{F}
&= 8I_{C} + I_{CT} \\
&= 8 \cdot 25.91 + 11.8 \\
&= 219.08
\end{align}
$$
#### 石鎬
$$
3 \text{ Cobblestone} + 2 \text{ Stick}
\xrightarrow[\text{Crafting Table}]{}
\text{ Stone Pickaxe}
$$
$$
\begin{align}
I_{\text{SP}}
&= 3 I_{\text{C}} + 2 I_{S} + I_{CT}\\
&= 3 \cdot 25.91 + 2 \cdot 1.475 + 11.8\\
&= 92.48
\end{align}
$$
#### 鐵礦
為了簡化計算,下列過程不考慮其他材質的鎬挖掘的情況。
$$
\text{ Iron Ore }
\xrightarrow[\text{Stone Pickaxe}]{}
\text{ Iron Ore Item}
$$
$$
\begin{align}
I_{IOI}
&= I_{IO} + I_{SP} \\
&= 9.00 + 92.48 \\
&= 101.48
\end{align}
$$
#### 煤
為了示範並聯系統的計算,以下僅考慮木鎬與石鎬的挖掘途徑。
$$
\text{ Coal Ore }
\xrightarrow[\text{Wooden(Stone) Pickaxe}]{}
\text{ Coal}
$$
$$
\begin{align}
I_{C1}
&= I_{CO} + I_{WP} \\
&= 9.18 + 23.6 \\
&= 32.78
\end{align}
$$
$$
\begin{align}
I_{C2}
&= I_{CO} + I_{SP} \\
&= 9.18 + 92.48 \\
&= 101.66
\end{align}
$$
$$
\begin{align}
p_1 = 2^{-I_1} = 2^{-32.78} = 1.35592835311 \cdot 10^{-10} \\
p_2 = 2^{-I_2} = 2^{-101.66} = 2.49626473127 \cdot 10^{-31} \\
p = 1 - (1-p_1)(1-p_2) = 1.355928702651 \cdot 10^{-10}
\end{align}
$$
$$
I_C = -\log_2 p = 32.78
$$
#### 鐵錠
$$
\text{ Iron Ore Item} + \frac1{8} \text{ Coal}
\xrightarrow[\text{Furnace}]{}
\text{ Iron Ingot}
$$
$$
\begin{align}
I_{II}
&= I_{IOI} + \frac1{8} I_{C} + I_{F} \\
&= 101.48 + 0.125 \cdot 32.78 + 219.08\\
&= 324.6575
\end{align}
$$
### 資訊量總表 (The Table)
正如我提過得,本文並沒有計算所有物品的資訊量,僅是將先前統計或計算得到的數值做個整理,因此這個表並不完整。
| 方塊/物品 | 資訊量 | 方塊/物品 | 資訊量 |
| -------------- | ------ | ---------------- | ------ |
| Iron Ingot | 324.66 | Lapis Lazuli Ore | 13.48 |
| Furnace | 219.08 | Diamond Ore | 13.33 |
| Iron Ore Item | 101.48 | Gold Ore | 12.17 |
| Stone Pickaxe | 92.48 | Wood | 11.83 |
| Coal | 32.78 | Crafting Table | 11.80 |
| Cobblestone | 25.91 | Tallgrass | 11.56 |
| Cactus | 24.13 | Sandstone | 10.84 |
| Wooden Pickaxe | 23.60 | Still Lava | 10.32 |
| Sugar Canes | 22.23 | Redstone Ore | 10.30 |
| Lily Pad | 20.66 | Sand | 9.53 |
| Brown Mushroom | 18.25 | Coal Ore | 9.19 |
| Red Mushroom | 17.66 | Leaves | 9.04 |
| Vines | 17.38 | Iron Ore | 9.00 |
| Cobweb | 16.62 | Grass | 8.74 |
| Obsidian | 16.37 | Gravel | 8.56 |
| Rail | 16.28 | Bedrock | 8.00 |
| Snow | 16.02 | Dirt | 6.43 |
| Flower | 15.62 | Still Water | 5.94 |
| Fence | 14.53 | Wood Plank | 2.95 |
| Clay | 14.49 | Stone | 2.31 |
| Wood Plank | 13.95 | Stick | 1.48 |
| Double Plant | 13.79 | Air | 0.41 |
## 結語
就如像詹姆斯·拉夫洛克(James Lovelock)所說的[^James-Lovelock]:
> I’d look for an entropy reduction, since this must be a general characteristic of life.
我們可以透過 agent 對環境進行改造從而造成的熵減量,作為衡量策略的方法:
$$
\Delta S_{\pi,t} = S_o - S_{\pi,t} \\
\pi^* = \arg \min_{\pi} \Delta S_{\pi,t}
$$
[^信息熵]: 信息熵是什么? - 知乎. (返朴). Retrieved 2020-05-31, from https://www.zhihu.com/question/22178202/answer/667876061
[^Cuberite-release]: Releases · cuberite/cuberite. (cuberite). Retrieved 2020-05-31, from https://github.com/cuberite/cuberite/releases/download/1.7EOL/Cuberite-linux64.tar.gz
[^statistics-plugin]: FlySkyPie/cuberite-block-counter: To make statistics of blocks. Retrieved 2020-05-31, from https://github.com/FlySkyPie/cuberite-block-counter
[^James-Lovelock]: Lovelock, James (1979). GAIA – A New Look at Life on Earth. Oxford University Press. ISBN 978-0-19-286218-1.
###### tags: `The Key Of Huanche`