這一節的標題是
9.2 Why Use Genetic Algorithms?
因為方格子標題字數限制,所以沒完整顯現
為什麼要使用GA呢?要回答這個問題,先來看看「無限猴子定理」(infinite monkey theorem)是怎麼說的。
無限猴子定理
給一隻猴子一台打字機,讓牠可以不斷地亂敲鍵盤打出字來。假設給猴子無限長的時間,那牠最終一定可以打出任何我們想要的字句來;即便是莎士比亞全集也可以打出來。
這……可能嗎?英文字母加上標點符號的字數總數是固定的,儘管排列組合的數量再大,但莎士比亞全集終究只是其中一種排列組合,所以猴子打出莎士比亞全集的機率雖然非常非常的低,但也不是零。這件乍看之下挺荒謬的事,看來還真的可能會發生。不過,哪來的無限長時間給猴子啊?!這在現實面上是不可能的;不要說莎士比亞全集了,就連哈姆雷特也不可能。
猴子頂多活個幾十年,沒有無限長的時間打字,而且打字速度也不會快到哪去,打不出哈姆雷特是顯而易見的。那如果是電腦模擬的猴子呢?只要有適當的設備,電腦猴可以一直的運作下去,而且打字速度可以非常非常的快,那結果會不會有所不同?假設要電腦猴打出莎翁的名句「to be or not to be that is the question」好了,那會需要多少時間?打字機上頭的按鍵很多,不過這個句子裡頭去掉了標點符號,只有小寫的英文字母和空白鍵,所以,乾脆我們就縮小範圍,假設給電腦猴打字的打字機上頭只有這27個鍵,看看它需要多少時間才能打出這個句子。
打字機有27個按鍵,所以打出任何一個字元的機率是1/27。整個句子總共有39個字元,所以要打出這個句子的機率是(1/27)39。假設電腦猴每秒鐘可以打出一百萬個句子,而且有99%的機率最終會打出這句正確的句子,那根據原書的計算,它所需要的時間,還會遠遠大於宇宙至今的年齡。
所以啊,即便是電腦所模擬,打字飛快的猴子,想要亂打一通而可以打出短短的一句話,在現實面上是不太可能發生的;需要的時間太長了,不切實際。
從這個電腦猴打字的例子就可以知道,有些問題是不適合使用暴力法來解的;這時候,不妨就用GA來解。不過,可別誤會了,在這個例子中的答案是已知的,這並不代表GA只能用來找出已知的答案。事實上,GA可以在不知道正確答案的情況下,隨機地找個起點,然後透過模擬演化的方式,以遠比暴力法更快的速度找出正確的答案,是個可實際解決問題的好工具。
Exercise 9.1
# python version 3.10.9
import random
import time
# space、A-Z、a-z的ASCII值
ascii_values = [32] + [n for n in range(65, 91)] + [n for n in range(97, 123)]
string = ''
start = time.time()
while string != 'cat':
string = ''.join([chr(random.choice(ascii_values)) for _ in range(3)])
end = time.time()
print('elapsed time (sec):', end - start)