# Rubyで簡単なAI(人工知能)を実装してみた(ニューラルネットワーク)
_published: 2007/11/12_ 
「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)―使える人工知能のお話」はスゲー。