LoginSignup
1
1

More than 5 years have passed since last update.

Pythonでコンピュータを作る#3 -単純な論理回路-

Last updated at Posted at 2018-05-24

最近買ったiPadに傷をつけてしまい,自分も凹んでいるMotmuuです.
今回は前回学んだパーセプトロンというアルゴリズムを用いて,ANDゲート・NANDゲート・NORゲートについて勉強していきます.
パーセプトロン?!?!という方はこちら

開発環境

以下の環境で勉強していきたいと思います.
・Python 3.6.5
・Mac OS X 10.13.2
・Atom 1.10.2

サンプルコードはこちら

ANDゲート

ANDゲートとは2入力1出力のゲートです.
ANDゲートの真理値表とは以下のようになります.

x1 x2 y
0 0 0
0 1 0
1 0 0
1 1 1

この条件を満たすようにパーセプトロンのパラメタを定めると,
(w1,w2,θ) = (0.5,0.5,0.6)
のようになります.(答えは1つではありません!)

ではこの条件を用いて,Pythonで実装してみましょう!

gates/AND.py

# ANDをクラスとして作成(今後組み合わせることを見越して..)
class AND():
    def __new__(self,x1,x2): #引数はnodeのx1とx2
        # パラメタの指定
        w1 = 0.5
        w2 = 0.5
        t = 0.6
        #パーセプトロン
        if x1*w1 + w2*x2 > t:
            return 1
        else:
            return 0

# 実際に真理値表のようになるか確かめてみました.

print(AND(0,0))
print(AND(0,1))
print(AND(1,0))
print(AND(1,1))

Terminalで実行してみると結果は以下のようになります.


******$ python and.py
0
0
0
1

これは真理値表のyと一致しています!
つまりANDゲートをパーセプトロンを用いて実装できました.
同様にNANDゲートとORゲートについても勉強していきたいと思います~.

NANDゲート

NANDゲートはANDゲートと逆のものを示します.
なので,真理値表は以下のようになります.

x1 x2 y
0 0 1
0 1 1
1 0 1
1 1 0

このように,x1もx2も1の時に出力が0になります.
それではこのような入出力を満たすパラメタを考えます.

うーん.
(w1,w2,θ) = (-0.5,-0.5,-0.6) とかですかね...(これも色々あります)

それではサクッと実装していきましょう!

gates/NAND.py

# NANDをクラスとして作成
class NAND():
    def __new__(self,x1,x2): #引数はnodeのx1とx2
        # パラメタの指定
        w1 = -0.5
        w2 = -0.5
        t = -0.6
        #パーセプトロン
        if x1*w1 + w2*x2 > t:
            return 1
        else:
            return 0

# 実際に真理値表のようになるか確かめてみる

print(NAND(0,0))
print(NAND(0,1))
print(NAND(1,0))
print(NAND(1,1))


またTerminalでの実行結果は以下のようになります.


********$ python nand.py
1
1
1
0


これも真理値表と一致していますね!
お気づきかもしれませんが,NANDゲートはANDゲートノパラメタの正負を入れ替えたものになっていますね!
このシンプルさがパーセプトロンの素晴らしさでもあります.

感嘆しながら,ORゲートも実装してみましょう.

ORゲート

例によってORゲートの真理値表は以下のようになります.

x1 x2 y
0 0 0
0 1 1
1 0 1
1 1 1

上のように,x1,x2のどちらかが1であれば出力は1になります.
これを満たすパーセプトロンのパラメタは,
(w1,w2,θ) = (0.5,0.5,0.4) とかですかね.

ではPythonで実装します!


# ORをクラスとして作成
gates/OR.py

class OR():
    def __new__(self,x1,x2): #引数はnodeのx1とx2
        # パラメタの指定
        w1 = 0.5
        w2 = 0.5
        t = 0.4
        #パーセプトロン
        if x1*w1 + w2*x2 > t:
            return 1
        else:
            return 0

# 実際に真理値表のようになるか確かめてみる

print(OR(0,0))
print(OR(0,1))
print(OR(1,0))
print(OR(1,1))


出力は以下の通りで真理値表と一致しています.

*******$ python or.py
0
1
1
1

振り返り

どうでしたか.
パーセプトロンを用いると簡単に論理ゲートが実装できました.
そしてこの論理ゲートこそがコンピュータをつくって行く魔法の部品です.
なんとなく0と1でコンピュータが構成できるのが現実的になってきましたね...! (そうでもないですか??笑)

それでは次回はパーセプトロンのできることできないことを勉強し,他の論理回路についても学習していきましょう!

次はこちら -> #4 XORゲート

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1