お待たせしました。ようやくこの部分を書き終わりました。(8月23日記)金貨のゲームを公開されているPythonのプログラムがどう解くのか、その2回目である。今回対象とするのは真ん中の次の部分である。プログラム言語Pythonの解説が続いております。先生の論文の中にあるAIは擬似乱数が極意であることを腹落ちするための大事なステップですので、もう少しご辛抱ください。初めてご覧になる方は(その1)(その2)からお読みください。
前回のあらすじ
前回(その4)では前半の部分を見て来ました。instanceというお皿の上に12枚のコインを1列にした12通り(行)のコインの列(行列式では0と1と−1で合計24枚)が置くところまで準備ができています。
さて今回はその後半を見てゆこう。まずざっとプログラムを眺めてみる。
def checkRules(B):
for i in instance:
balance=""
for j in B:
if (i[j[0]]+i[j[1]]+i[j[2]]+i[j[3]])>(i[j[4]]+i[j[5]]+i[j[6]]+i[j[7]]):
balance += '>'
elif (i[j[0]]+i[j[1]]+i[j[2]]+i[j[3]])<(i[j[4]]+i[j[5]]+i[j[6]]+i[j[7]]):
balance += '<'
else: balance += '='
rules.append(balance)
balance=""
if len(set(rules))==24:
break
from random import sample,seed
import random
random.seed(8)
for i in instance:
print(i)
for i in range(1000):
b1=sample(coins,8)
b2=sample(coins,8)
b3=sample(coins,8)
B=[b1,b2,b3]
rules=[]
checkRules(B)
if len(set(rules))==24:
for J in B
j=[X+1 for x in J]
print(j)
print(rules',"¥n")
これを眺めただけでわかる人はこういう分野に土地勘のある方である。このブログは素人の勉強用のサブノートであるため、少し長くなるが解説をしてゆきたい。
このプログラムの処理を理解するための3つのポイント
1)添字 アルファベットの iと jの動きを理解する
2)ランダムに何をどのように持ってこようとしているかを理解する
3)どういう判定をしようとしているかを理解する
お皿の上をもう一度眺めてみよう。coinsという名前の袋に12枚のコインが入っている。
Instanceというお皿に、軽いコイン1枚の場合と重いコイン1枚の場合に分けて、24個のコインが置いてある。
プログラムは人間のように手や指がない。このお皿の中にあるそれぞれのコインの位置を指し示してやらないといけない。その役割を果たすのが添字である。
上のInstanceという名前のついたお皿の24行を示すのに小文字のiが使われる。
このプログラムでは1000になるまでランダムに抽出するとなっている。
さて、その次に、Bという名前の新たなお皿が3枚用意された。
それぞれをb1,b2,b3の名前がついている。
それぞれのお皿に、12個のコインの中からランダムに8個のコインを選んでそのお皿に載せる。
プログラムでは12個のコインを略してCoinsと書き、8個ランダムに選ぶことをSample(Coins,8)と書いている。
I(J(0)) は縦横の添字を使ってコインを指し示しており、ランダムに選ばれた8枚のコインを動かそうとしているわけである。(上の例はb1で選ばれた6,5,10,7,9,2,3,1 の8枚である)
8枚のコインは 最初の4枚と残りの4枚に分けられ、その大小が比較される訳である。重いか軽いかは すでに1かマイナス1で表現されているので、4枚づつを足し合わした合計を比較すればいいことになる。ここではballance関数が使われている。
さて、準備はできた。ここから重さを比較して行く。話を簡単にするため、以下は2のコインが軽かったとしてみよう。
b1,b2,b3の皿ごとに、左右に分けたコインの重さを比較し、あらかじめ用意された12の数値のボードに <=>のマークをつけて行く。
以下の①②③は論文の掲載の例をそのまま使用している
①②③をまとめてみると
最終的にこれを何回も繰り返すと、以下の結果がそれぞれの数値に記号化される。
この結果、どのコインが軽いか重いのパターンを把握して、炙り出せることになる。プログラムはこの表示までで終わっている。
わかったこと
(1)ここで例示されたプログラムでも、実は人間同様に先に人間が仕込んでいたロジックがあったことがわかった。それは12個のコインを3つに分けて、うち最初の4枚とあとの4枚を比較するという部分である。何枚を天秤にかければいいか まではこのロジックでは考えさせていない。
(2)乱数と行列式を駆使することで、より網羅的にデータを取り扱っている点である。
(3)最終的な回答が1000回の施行結果によるパターンの表示であったことである。(この点は次回でさらに触れる)
ここまでお読み頂きありがとうございます。pythonは今後社会人や学生があたり前に使いこなすツールになると思います。プログラム言語のロジックの説明ばかりでしたが、いよいよ次回はこの金貨のパズルの人間とAIの解き方の違いに焦点を当てて考えて見ます。
いやぁ、DEEPですねぇ。