# Rubyで簡単なAI(人工知能)を実装してみた(ニューラルネットワーク) _published: 2007/11/12_ ![alt](http://b.hatena.ne.jp/entry/image/http://d.hatena.ne.jp/shunsuk/20071112/1194859829) 「Rubyで簡単なAI(人工知能)を実装してみた(遺伝的アルゴリズム)」では、「遺伝的アルゴリズム」を実装しました。今回は「ニューラルネットワーク」です。参考書は前回に引き続き「「マッチ箱の脳(AI)―使える人工知能のお話」」です。 プログラムの目的は、3つのお菓子の組み合わせが、決められた金額以下かどうかを判断します。下の方の破線以降がUI部分になります。ここを修正するとイイカンジだと思います。あと、Patternsが決め打ちなので、この辺を改造するとよりイイカンジだと思います。 注意。 - 使っている英単語おかしくて、アレかもしれません。 - Rubyのコーディングルールに則っていなくて、アレかもしれません。 - あまりスマートでないコードもあって、アレかもしれません。 ```ruby class Unit def initialize(count=3) @cells = [] (count + 1).times { @cells << rand(9) } end def learn(patterns) while !ok ||= false ok = true result = [] patterns.values.each do |pattern| ans = answer(pattern) chk = patterns.check(pattern) if ans == chk result << 'OK' elsif ans && !chk result << 'NG' ok = false penalize(pattern, -1) elsif !ans && chk result << 'NG' ok = false penalize(pattern, 1) end end yield(ok, result, @cells) end end def answer(pattern) sum = 0 @cells.length.times { |i| sum += @cells[i + 1] if pattern[i] == 1 } @cells[0] <= sum end def penalize(pattern, direction) @cells[0] -= direction @cells.length.times { |i| @cells[i + 1] += direction if pattern[i] == 1 } end end class Patterns def initialize @limit = 500 @prices = [310,220,70] @values = [[0, 0, 0], [0, 0, 1], [0, 1, 0], [0, 1, 1], [1, 0, 0], [1, 0, 1], [1, 1, 0], [1, 1, 1]] end attr_reader :values def check(pattern) sum = 0 pattern.length.times { |i| sum += @prices[i] * pattern[i] } sum <= @limit end end #-------------------------------- unit = Unit.new pat = Patterns.new unit.learn(pat) do |ok, result, cells| p result break if gets =~ /x/ end ``` 簡単ですね。やっぱり「マッチ箱の脳(AI)―使える人工知能のお話」はスゲー。