# 『マッチ箱の脳』初期の脳型人工知能モデルをPythonでやってみた

マッチ箱の脳 WEB ver『‚Ù‚Ú“úŠ§ƒCƒgƒCV•· - ‚ª‚ñ‚Î‚êXì‚­‚ñ‚Ìˆâ“`Žq‚­‚ñ』のマッチ箱で作る初期の脳型人工知能モデル（Neural Network Model《以下NN》）#1/2#2/2Pythonでやってみた。

#### python

• マッチ箱の判断 == AIの判断とする。
• 連続して10回以上学習しなかったとき処理を終了する。
• 最後に、テスト（before）・繰り返し教える（teaching）・またテスト（after）を表示
```#!/usr/local/bin/python
# *-# -*- coding: utf-8 -*-
# neural_network_model
# matchbox.py

def neural_network_model(num_price_lst_a, *num_price_lst):
box_a = num_price_lst_a
box = num_price_lst

learn = [0]
repeat_non_learn = [0]
rep_done_num = 10

exam_lst =[
[box[0], box[1], None],
[None, None, box[2]],
[None, None, None],
]

teach_lst = [
[box[0], box[1], box[2]],
[box[0], box[1], None],
[box[0], None, box[2]],
[None, box[1], box[2]],
[box[0], None, None],
]

return [n for n in box_lst if n != None]

if box_a[0] >= sum([n[0] for n in buy_lst(box_lst)]):
return True
return False

def check(box_lst):
total = sum([price for num, price in buy_lst(box_lst)])

box_str = ", ".join(["%s%s" % (chr(i + 66), lst) for i,
lst in enumerate(box)])
return "%s:(ans:%s, ai:%s) %s, A%s le=%d re=%d" % \
learn[0], repeat_non_learn[0])

def learning(box_lst):
ans = check(box_lst)
comp = ans  == ai
minus = int(ans) * 2 -1
if ans ^ ai:
for i, lst in enumerate(box_lst):
if lst != None:
if 0 < box[i][0]:
box[i][0] -= minus
if 0 < box_a[0]:
box_a[0] += minus
learn[0] += 1
repeat_non_learn[0] = 0
else:
repeat_non_learn[0] +=1
return display(ans, ai, comp)

def exam(str):
yield "\n%s" % str
for box_lst in exam_lst:
ans = check(box_lst)
comp = ans  == ai
yield "%s:(ans:%s, ai:%s) B(%s) + C(%s) + D(%s) <= A(%s)" % \
(comp, ans, ai, box_lst[0], box_lst[1], box_lst[2], box_a)

def teaching():
yield "\nteaching"
#for i in range(10):
while repeat_non_learn[0] < rep_done_num:
for box_lst in teach_lst:
yield learning(box_lst)
else:
yield "result: %s, A%s" % (", ".join(
["%s%s" % (chr(i + 66), lst) for i,lst in enumerate(box)]),
box_a)

yield "\n".join(exam("before"))
yield "\n".join(list(teaching()))
yield "\n".join(exam("after"))

if __name__ == "__main__":
nn = neural_network_model([6, 500], [1, 310], [3, 220], [8, 70])
print "\n".join(nn)
```
##### 実行結果
• AIの判断の合否:(ans=正解 ai=AIの判断、マッチ箱B[マッチ棒, 値段]、マッチ箱C[マッチ棒, 値段]、マッチ箱D[マッチ棒, 値段]、マッチ箱A[マッチ棒, 値段]
• leは学習回数、reは連続して学習しなかったときの回数
```>>>
before
False:(ans:False, ai:True) B([1, 310]) + C([3, 220]) + D(None) <= A([6, 500])
False:(ans:True, ai:False) B(None) + C(None) + D([8, 70]) <= A([6, 500])
True:(ans:True, ai:True) B(None) + C(None) + D(None) <= A([6, 500])

teaching
True:(ans:False, ai:False) B[1, 310], C[3, 220], D[8, 70], A[6, 500] le=0 re=1
False:(ans:False, ai:True) B[2, 310], C[4, 220], D[8, 70], A[4, 500] le=2 re=0
False:(ans:True, ai:False) B[1, 310], C[4, 220], D[7, 70], A[6, 500] le=4 re=0
False:(ans:True, ai:False) B[1, 310], C[3, 220], D[6, 70], A[8, 500] le=6 re=0
True:(ans:True, ai:True) B[1, 310], C[3, 220], D[6, 70], A[8, 500] le=6 re=1
True:(ans:False, ai:False) B[1, 310], C[3, 220], D[6, 70], A[8, 500] le=6 re=2
False:(ans:False, ai:True) B[2, 310], C[4, 220], D[6, 70], A[6, 500] le=8 re=0
False:(ans:True, ai:False) B[1, 310], C[4, 220], D[5, 70], A[8, 500] le=10 re=0
False:(ans:True, ai:False) B[1, 310], C[3, 220], D[4, 70], A[10, 500] le=12 re=0
True:(ans:True, ai:True) B[1, 310], C[3, 220], D[4, 70], A[10, 500] le=12 re=1
False:(ans:False, ai:True) B[2, 310], C[4, 220], D[5, 70], A[7, 500] le=15 re=0
False:(ans:False, ai:True) B[3, 310], C[5, 220], D[5, 70], A[5, 500] le=17 re=0
False:(ans:True, ai:False) B[2, 310], C[5, 220], D[4, 70], A[7, 500] le=19 re=0
False:(ans:True, ai:False) B[2, 310], C[4, 220], D[3, 70], A[9, 500] le=21 re=0
True:(ans:True, ai:True) B[2, 310], C[4, 220], D[3, 70], A[9, 500] le=21 re=1
False:(ans:False, ai:True) B[3, 310], C[5, 220], D[4, 70], A[6, 500] le=24 re=0
True:(ans:False, ai:False) B[3, 310], C[5, 220], D[4, 70], A[6, 500] le=24 re=1
False:(ans:True, ai:False) B[2, 310], C[5, 220], D[3, 70], A[8, 500] le=26 re=0
True:(ans:True, ai:True) B[2, 310], C[5, 220], D[3, 70], A[8, 500] le=26 re=1
True:(ans:True, ai:True) B[2, 310], C[5, 220], D[3, 70], A[8, 500] le=26 re=2
True:(ans:False, ai:False) B[2, 310], C[5, 220], D[3, 70], A[8, 500] le=26 re=3
False:(ans:False, ai:True) B[3, 310], C[6, 220], D[3, 70], A[6, 500] le=28 re=0
True:(ans:True, ai:True) B[3, 310], C[6, 220], D[3, 70], A[6, 500] le=28 re=1
False:(ans:True, ai:False) B[3, 310], C[5, 220], D[2, 70], A[8, 500] le=30 re=0
True:(ans:True, ai:True) B[3, 310], C[5, 220], D[2, 70], A[8, 500] le=30 re=1
True:(ans:False, ai:False) B[3, 310], C[5, 220], D[2, 70], A[8, 500] le=30 re=2
False:(ans:False, ai:True) B[4, 310], C[6, 220], D[2, 70], A[6, 500] le=32 re=0
True:(ans:True, ai:True) B[4, 310], C[6, 220], D[2, 70], A[6, 500] le=32 re=1
False:(ans:True, ai:False) B[4, 310], C[5, 220], D[1, 70], A[8, 500] le=34 re=0
True:(ans:True, ai:True) B[4, 310], C[5, 220], D[1, 70], A[8, 500] le=34 re=1
True:(ans:False, ai:False) B[4, 310], C[5, 220], D[1, 70], A[8, 500] le=34 re=2
True:(ans:False, ai:False) B[4, 310], C[5, 220], D[1, 70], A[8, 500] le=34 re=3
True:(ans:True, ai:True) B[4, 310], C[5, 220], D[1, 70], A[8, 500] le=34 re=4
True:(ans:True, ai:True) B[4, 310], C[5, 220], D[1, 70], A[8, 500] le=34 re=5
True:(ans:True, ai:True) B[4, 310], C[5, 220], D[1, 70], A[8, 500] le=34 re=6
True:(ans:False, ai:False) B[4, 310], C[5, 220], D[1, 70], A[8, 500] le=34 re=7
True:(ans:False, ai:False) B[4, 310], C[5, 220], D[1, 70], A[8, 500] le=34 re=8
True:(ans:True, ai:True) B[4, 310], C[5, 220], D[1, 70], A[8, 500] le=34 re=9
True:(ans:True, ai:True) B[4, 310], C[5, 220], D[1, 70], A[8, 500] le=34 re=10
True:(ans:True, ai:True) B[4, 310], C[5, 220], D[1, 70], A[8, 500] le=34 re=11
result: B[4, 310], C[5, 220], D[1, 70], A[8, 500]

after
True:(ans:False, ai:False) B([4, 310]) + C([5, 220]) + D(None) <= A([8, 500])
True:(ans:True, ai:True) B(None) + C(None) + D([1, 70]) <= A([8, 500])
True:(ans:True, ai:True) B(None) + C(None) + D(None) <= A([8, 500])
```
1. beforeテストで、AIが『False（間違い）』、『False（間違い）』、『True（正しい）』と判断している。
2. teachingで、テスト以外の買い方を繰り返し教える。
3. afterテストで、AIがbeforeテストと同じ教えていない買い方で全問正解。学習できた(・∀・)