挑戦する
1人以上の敵に出会えるキャラクターを決定できるシステムを作成する必要があります。 システムは以下を認識している場合があります。
- 割合としてのキャラクターの健康;
- 銃の存在;
- 敵の数。
答えは次のいずれかのアクションの形式である必要があります。
- 攻撃する;
- 実行する;
- 非表示(突然の攻撃の場合);
- 何もしません。
トレーニングのために、「レッスン」の表を作成します。
健康 | 銃 | 敵 | アクション |
---|---|---|---|
50% | 1 | 1 | 攻撃する |
90% | 1 | 2 | 攻撃する |
80% | 0 | 1 | 攻撃する |
30% | 1 | 1 | 隠す |
60% | 1 | 2 | 隠す |
40% | 0 | 1 | 隠す |
90% | 1 | 7 | 実行するには |
60% | 1 | 4 | 実行するには |
10% | 0 | 1 | 実行するには |
60% | 1 | 0 | なし |
100% | 0 | 0 | なし |
準備する
最初に行うことは、 libfannをビルドしてインストールすることです 。
次に、 fannjとjnaをダウンロードします。
「レッスン」のセットを含むファイルを作成しましょう。
11 3 4 0.5 1 1 1 0 0 0 0.9 1 2 1 0 0 0 0.8 0 1 1 0 0 0 0.3 1 1 0 1 0 0 0.6 1 2 0 1 0 0 0.4 0 1 0 1 0 0 0.9 1 7 0 0 1 0 0.5 1 4 0 0 1 0 0.1 0 1 0 0 1 0 0.6 1 0 0 0 0 1 1.0 0 0 0 0 0 1
次に、ANNをトレーニングして、ファイルに保存します。
public static void main(String[] args) { // List<Layer> layerList = new ArrayList<Layer>(); layerList.add(Layer.create(3, ActivationFunction.FANN_SIGMOID_SYMMETRIC, 0.01f)); layerList.add(Layer.create(16, ActivationFunction.FANN_SIGMOID_SYMMETRIC, 0.01f)); layerList.add(Layer.create(4, ActivationFunction.FANN_SIGMOID_SYMMETRIC, 0.01f)); Fann fann = new Fann(layerList); // Trainer trainer = new Trainer(fann); trainer.setTrainingAlgorithm(TrainingAlgorithm.FANN_TRAIN_RPROP); /* , 100000, 100 0.0001 */ trainer.train(new File("train.data").getAbsolutePath(), 100000, 100, 0.0001f); fann.save("ann"); }
説明
レイヤー
ANNはニューロンの層で構成されています。 最初の層は、受容体ニューロンまたは入力データニューロンです。 出力ニューロンの最後の層。 残りはすべて非表示のレイヤーです。 この場合、最初の層には3つのニューロンがあります。
健康レベル(0.1-1.0);
武器の存在(1-yes、0-no);
敵の数。
ファン
Fannクラスのオブジェクトは、以前に作成されたレイヤーに基づいて作成されるニューラルネットワークです。
トレーナー
トレーナークラスのオブジェクトは、トレーナーの作成中に送信されるニューラルネットワークの学習アルゴリズムをカプセル化します。 トレーニング後、ファイルに保存することを忘れないでください。
結果を確認する
トレーニングをテストするには、次のコードを使用します。
public static void main(String[] args) { Fann fann = new Fann("ann"); float[][] tests = { {1.0f, 0, 1}, {0.9f, 1, 3}, {0.3f, 0, 8}, {1, 1, 8}, {0.1f, 0, 0}, }; for (float[] test:tests){ System.out.println(getAction(fann.run(test))); } } private static String getAction(float[] out){ int i = 0; for (int j = 1; j < 4; j++) { if(out[i]<out[j]){ i = j; } } switch (i){ case 0:return ""; case 1:return ""; case 2:return ""; case 3:return " "; } return ""; }
私は次の結果を得ました:
健康 | 銃 | 敵 | アクション |
---|---|---|---|
100% | いや | 1 | 攻撃する |
90% | あります | 3 | 隠す |
30% | いや | 8 | 実行するには |
100% | あります | 8 | 実行するには |
10% | いや | 0 | 何もしない |
建設的な批判を聞いてうれしいです。