wordle
一个小游戏,你的目标是要猜中某一个五个字母组成的单词,你有六次机会来猜,每次猜完之后你会得到一些关于你的猜单词与正确单词的一些相关信息。
举个例子,如果我第一次猜的是 e a r t h earth earth,那么我可能会得到一个这样的字符串 e a r t h \textcolor{forestgreen}{e}\textcolor{goldenrod}{a}r\textcolor{goldenrod}{t}h earth
也就是说目标单词中间有 e , a , t e, a, t e,a,t 这三个字母,且 e e e 的位置是正确的, a a a 和 t t t 的位置不正确。
规则大概就是这样。
引入
显然,我们每次猜测的词语能给到我们的信息量是不一样的,现在我们需要找到一种方法来定量的求出猜测某一个单词反馈给我们的信息量,当然我们希望这个词的信息量越大越好。
显然我么们可以假设所有目标单词 T T T 再某一局游戏中出现的概率是相同的,所以某一个 T T T 作为这一句游戏的目标单词的概率 p ( T ) = 1 ∣ N ∣ p(T) = \frac 1{|N|} p(T)=∣N∣1, N N N 就是所有 5 5 5 位英文单词的集合。
显然,我们可以这样考虑,对于输入的某一个单词 S S S,对于一个目标单词 T T T,它会得到一种颜色的方案 k k k,并且对于不同的 T T T 得到的 k k k 有可能是相同的,所以我们记录 p ( k ) p(k) p(k) 表示输入 S S S 得到颜色方案 k k k 的概率,他就等于 n u m ( k ) ∣ N ∣ \frac{num(k)}{|N|} ∣N∣num(k),其中 n u m ( k ) num(k) num(k) 就是输入 S S S 之后能使出现 k k k 的 T T T 的个数。
现在我们要计算的是一个 S S S 能给我们提供多少的价值,那么很显然,我们可以把这个问题转化成一个数学期望问题,也就是:
E ( S ) = ∑ k p ( k ) × I ( k ) E(S) = \sum_{k}p(k) \times I(k) E(S)=k∑p(k)×I(k)
这里的 E ( S ) E(S) E(S) 就是 S S S 能给我们提供的价值的期望,而 I ( k ) I(k) I(k) 就是我们对于这个 k k k 能获得的信息量,现在我们就要考虑怎样量化这个 k k k 提供给我们的信息量。
信息
我们考虑一个 k k k,我们发现 k k k 其实是对于 T T T 的一个约束条件,目标单词肯定是符合这个约束条件的某一个 T T T,所以我们记 Y ( k ) Y(k) Y(k) 表示 颜色方案 k k k 对答案的约束,那么每出现一个 k k k 答案的范围就会缩小到这样的一个集合中:
G ( k ) = { T ∈ N ∣ T s . t . Y ( k ) } G(k) = \{ T \in N \mid T \;\; s.t.Y(k) \} G(k)={T∈N∣Ts.t.Y(k)}
那么显然 ∣ G ( k ) ∣ |G(k)| ∣G(k)∣ 越小,这个 k k k 提供的信息量 I ( k ) I(k) I(k) 就越大。
那么在信息论中,我们这样定义一个 k k k 的信息量,如果一个 k k k 的 Y ( k ) Y(k) Y(k) 所形成的 G ( k ) G(k) G(k) 有 ∣ G ( k ) ∣ = 1 2 ∣ N ∣ |G(k)| = \frac 12 |N| ∣G(k)∣=21∣N∣,那么我们称 I ( k ) = 1 bit I(k) = 1 \text{bit} I(k)=1bit,同理,如果 ∣ G ( k ) ∣ = 1 2 x ∣ N ∣ |G(k)| = \frac{1}{2^x}|N| ∣G(k)∣=2x1∣N∣,那么这个 k k k 的 I ( k ) = x bit I(k) = x \text{bit} I(k)=xbit。
总结一下就是 ∣ G ( k ) ∣ = 1 2 I ( k ) ∣ N ∣ |G(k)| = \frac{1}{2^{I(k)}}|N| ∣G(k)∣=2I(k)1∣N∣
同时我们发现, p ( k ) p(k) p(k) 其实就等于 ∣ G ( k ) ∣ ∣ N ∣ \frac{|G(k)|}{|N|} ∣N∣∣G(k)∣,那么就可以得到这样一个简洁的式子:
I ( k ) = − log 2 p ( k ) I(k) = -\log_2p(k) I(k)=−log2p(k)
这样定义有一个好处,就是对于两个约束条件,一个给你了 a bit a\text{bit} abit 的信息,另一个给你了 b bit b\text{bit} bbit 的信息,你就可以把这两个信息量直接相加,得到 a + b bit a + b \text{bit} a+bbit 的信息。这在数学上和感性上都很好理解。
信息熵
那么回到我们之前的问题上来,我们要求的 E ( S ) E(S) E(S) 就可以变成这样:
E ( S ) = ∑ k p ( k ) I ( k ) = − ∑ k p ( k ) log 2 p ( k ) E(S) = \sum_{k}p(k)I(k) = -\sum_{k}p(k)\log_2p(k) E(S)=k∑p(k)I(k)=−k∑p(k)log2p(k)
这里,算出的这个信息量的期望值在信息论中就被叫做 “熵”,也就是:
H ( x ) = − ∑ x ∈ X p ( x ) log 2 p ( x ) H(x) = -\sum_{x \in X}p(x)\log_2p(x) H(x)=−x∈X∑p(x)log2p(x)
这样一来,我们就可以写一个程序暴力的求出所有的 S S S 的 H ( S ) H(S) H(S),然后贪心的按照 H ( S ) H(S) H(S) 来选择填什么单词进去,有人写过代码实测下来平均 4 4 4 次就能猜中目标单词。