マッチ箱の脳 WEB ver『ÙÚú§CgCV· - ªñÎêXìñÌâ`qñ』のマッチ箱で作る初期の脳型人工知能モデル(Neural Network Model《以下NN》)#1/2・#2/2 をPythonでやってみた。
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])
- beforeテストで、AIが『False(間違い)』、『False(間違い)』、『True(正しい)』と判断している。
- teachingで、テスト以外の買い方を繰り返し教える。
- afterテストで、AIがbeforeテストと同じ教えていない買い方で全問正解。学習できた(・∀・)