2009-04-17 24 views
25

私は人工ニューラルネットワークを使ってTic-tac-toeを演奏したいです。ネットワークの構成は次のとおりです。 9つのフィールドのそれぞれについて、2つの入力ニューロンを使用します。だから私は18の入力ニューロンを持っています。すべてのフィールドについて、プレーヤー1のプレイヤー1と1のニューロンに1つの入力ニューロンがあります。それに加えて、現在のボード位置を評価する1つの出力ニューロンがあります。出力値が高いほど、プレイヤー1の位置が良好になります。低いほど、プレイヤー2の方が良好です。人工ニューラルネットワーク(Tic-tac-toe)のコーディング方法は?

しかし、私の問題は次のとおりです。私の考えは、入力ニューロンにArray [1-18]を使うことでした。この配列の値は入力ウェイトです。私はループを使って配列を歩き回りました。活性化されるべきニューロンがあるときはいつでも、出力値に重みを加える。だから、出力値が有効に入力ニューロンの重みの合計である:あなたは、このネットワークをプログラミングするための良い方法です

Output = SUM(ActivatedInputNeurons) 

と思いますか?より良いアイデアはありますか?

私があなたを助けてくれることを願っています。前もって感謝します!

+4

私の宿題のような匂い –

+14

@Binary:宿題であるという理由だけで、あなたがそれはStackOverflowで答えられないはずの質問です。これはSOFAQスレッドで大きく議論されました。取ることができる純粋なコードソリューションを提供することから余分な予防措置を取っておきたいかもしれませんが、あなたはOPを正しい経路に導くことによって答えを出すことができます。 – TheTXI

+3

@BinaryWorrier:いいえ、宿題ではありません。私は学校にコンピュータサイエンスを持っていません。 :p – caw

答えて

14

さて、入力層には18個のニューロンがあり、出力層には1個のニューロンがあります。それで大丈夫です。しかし、ニューラルネットに入力を関連付ける機会を与える必要があります。そのためには、少なくとも1つの中間層が必要です。私は、中間層に9つのニューロンを使用することを提案する。これらはそれぞれ各入力ニューロンに接続し、出力ニューロンは各中間体に接続する必要があります。このような接続のそれぞれには重みがあり、各ニューロンにはアクティブ化レベルがあります。

次に、一度にすべてのニューロン、1つのレイヤーを通過します。入力層はボードの状態でアクティブにされます。それ以降のすべてのニューロンでは、接続されたニューロンの活性化レベルと接続の重みの積に基づいて、すべての接続をすべて調べて合計します。最後に、この合計にシグモイド関数を適用してアクティブ化レベルを計算します。

これは動作原理です。今、あなたはよりよい結果を得るためにこのネットを訓練する必要があります。これにはいくつかのアルゴリズムがあります。グーグルや読書をしなければなりません。最後に、結果が十分に説得力がない場合にニューロンとレイヤーの数を調整することができます。たとえば、入力レイヤーを9ニューロンに減らし、Xの場合は+1、Oの場合は-1を使用してアクティブにすることができます。おそらく別の中間レイヤーを追加すると、結果が向上したり、レイヤーのニューロン数が増えたりします。

0

これはAIコーディングのための優れたスタータープロジェクトですが、完全な解決策を思いつくことは、SOの大きな答えになるでしょう。

ほとんどのソフトウェアと同様に、オブジェクト指向設計を使用することをお勧めします。例:入力、重み、および出力関数を持つNeuronクラスを定義します。次に、ネットワークを構築するために、これらのオブジェクトのいくつかを作成してください(Neuron)。

良い出発点については、artificial neural networksのwikipedia記事を参照してください。

コードで幸運を祈る!多くの楽しみのように聞こえる。

0

重みを加算した後、関数を使用して和を正規化する必要があります。負の数を許可するには、通常TANHを使用します。

編集:私は数年前に働いていた

Here is a java multilayer perceptron実装。これはチェッカーのために使われましたが、入力が少なくてもチェッカーのために使うことができます。

はまた、あなたはおそらく勝つためにそれを教える方法を把握する必要がありますが、thatsの別の問題

+0

リンクを更新する可能性はありますか?今どこにも行かないようです。 –

+0

私はMYリンクを更新できません。私はそのリポジトリを削除しました。一方、利用可能な実装の束があります。これは私によく見えます:http://code.google.com/p/digitrecog/source/browse/trunk/src/backproped/JavaMLP.java?spec=svn44&r=44 – mkoryak

0

は、それはあなたの質問に直接答えではありませんが、次のフレームワーク/ツールを見ている必要があります:SNNSまたはそのJava対応品JavaNNS。あなたの質問に対する答えが見つかるはずです。

+0

ありがとう!どちらも非常に良いリンクであるようです。残念ながら、私はC++もJavaも持っていません。私はDelphi/Pascalしか持っていません。 – caw

+0

あなたは物事の仕方に関する例を見つけることができるはずです。最後に、ANNを学んだり、スムーズにしたいので、言語は二次的ですね。 – paweloque

3

伝達関数を使って '伝統的な' feed-forward ANNを実装する必要があると思います。バックプロパゲーションを使用してトレーニングすることができます。私は特にあなたが一つの出力ニューロンの外板状況の意味の要約を得ることを期待どのように理解していない

SetupInputs(); 
for (l = 1 .. layers.count) 
    for (i = 0 .. layers[l].count) 
     sum = 0 
     for (j = 0 .. layers[l-1].count) 
      sum += layers[l-1][j] * weights[l-1][j] 
     layers[l][i] = TransferFunction(sum) 
+0

ありがとうございます。しかし、それは多層ニューラルネットワークのためのコードでしょうか? – caw

+0

はい。パーセプトロン(単層)だけで使用可能なスコアを計算することはできません。私は大学でも同じ問題を抱えていましたが、バックプロパゲーションを使用してチック・タック・トゥで複数のネットワークを訓練することはできませんでした。 – FryGuy

5

:これらのコードは、通常は、数行のコードであること、このような何かを終了します。私は、完全に接続されたネットワーク、すなわち81の重みで、

I I I    O O O 
    I I I  x  O O O 
    I I I    O O O 
9 input neurons 9 output neurons 

を見ています。次に、出力ニューロンをその位置で遊ぶことの相対的な欲求のために訓練する。

+1

フォローアップのビット:私は18の代わりに9つの入力ニューロンを使うことができると思います。なぜなら、「空き」に0を、「自己占有」に1を、「占有している」に-1を使用できるからです。 – chaos

+0

9つの入力....たぶん。いくつかの隠れたニューロンを使って、あなたは確かに必要な情報を抽出することができます。さもなければ、占領されていないフィールドは自分が占有している相手と占有している人の平均として扱われます。それにもかかわらず、このような些細なゲームでは、十分に良いかもしれません。 – maaartinus

0

あなたがFANNまたはNeurophなどのニューラルネットワークライブラリを使用する場合は、時間の節約になります。

入力を符号化する1つの方法は、9入力のニューロンです。出力は9ニューロンであることも良いです。私が他のリプレイで見ることができないのは、隠れたレイヤーのサイズです。私は伝統的な3つの層でMLPを使うつもりです。隠された層のサイズは常に謎です。私は10個の隠れたニューロンを試してみるだろう。

伝達関数は次のように入力をエンコードすることができるシグモイドの場合:

0.0 - Oプレーヤー。

1.0 - Xプレーヤー。

0.5 - 空。

ANNの出力は9つの実数になります。この場合、いくつかのセルがすでに占有されています。空のセルに対応する最高出力値を検索することができます。

関連する問題