牌語備忘録 -pygo

あくまでもメモです。なるべくオフィシャルの情報を参照してください。

牌語備忘録 -pygo

『マッチ箱の脳』初期の脳型人工知能モデルを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],
        ]

    def buy_lst(box_lst):
        return [n for n in box_lst if n != None]

    def ai_buy(box_lst):
        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)])
        answer = box_a[1] >= total
        return  answer

    def display(answer, ai_buy, comparison):
        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" % \
            (comparison, answer, ai_buy, box_str, box_a,
             learn[0], repeat_non_learn[0])
   
    def learning(box_lst):
        ans = check(box_lst)
        ai = ai_buy(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)
            ai = ai_buy(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テストと同じ教えていない買い方で全問正解。学習できた(・∀・)