这个问题参考了在 Encog 存储库中获得的C#'s Lunar Lander Example 。如示例所示,我正在使用 NeuralSimulatedAnnealing 来训练我的多层前馈网络(50 个 epoch)
BasicNetwork network = CreateNetwork();
IMLTrain train;
train = new NeuralSimulatedAnnealing(network, new PilotScore(), 10, 2, 100);
_
public static BasicNetwork CreateNetwork() {
var pattern = new FeedForwardPattern {InputNeurons = 3};
pattern.AddHiddenLayer(50);
pattern.OutputNeurons = 1;
pattern.ActivationFunction = new ActivationTANH();
var network = (BasicNetwork) pattern.Generate();
network.Reset();
return network;
}
这个例子效果很好,神经飞行员准确地学习了如何在给定的条件下降落宇宙飞船,但是我想要更多的东西!
为此,我创建了一个如下所示的类全局变量,并在 LanderSimulator 类中修改了一行
namespace Encog.Examples.Lunar
{
class globals
{
public static int fuelConsumption { get; set; }
}
}
_
public void Turn(bool thrust){
Seconds++;
Velocity -= Gravity;
Altitude += Velocity;
if (thrust && Fuel > 0)
{
Fuel-= globals.fuelConsumption; //changed instead of Fuel--;
Velocity += Thrust;
}
Velocity = Math.Max(-TerminalVelocity, Velocity);
Velocity = Math.Min(TerminalVelocity, Velocity);
if (Altitude < 0)
Altitude = 0;
}
因此,现在取决于fuelConsumption变量,每次推力都会消耗燃料。然后我尝试了三个不同的燃料消耗值,以下是各个网络各自的最佳分数:
//NETWORK 1
globals.fuelConsumption = 1;
bestScore: 7986
//NETWORK 2
globals.fuelConsumption = 5;
bestScore: 7422
//NETWORK 3
globals.fuelConsumption = 10;
bestScore: 6921
当我在彼此上测试这些网络时,结果令人失望:
- 当fuelConsumed 分别为5 和10 时,网络1 的得分为-39591 和-39661。
- 当fuelConsumed 分别为1 和10 时,网络2 的得分为-8832 和-35671。
- 当fuelConsumed 分别为1 和5 时,网络3 的得分为-24510 和-19697。
因此,我尝试为所有三种场景训练一个网络,如下所示:
int epoch;
epoch = 1;
globals.fuelConsumption = 1;
for (int i = 0; i < 50; i++){
train.Iteration();
Console.WriteLine(@"Epoch #" + epoch + @" Score:" + train.Error);
epoch++;
}
Console.WriteLine("--------------------------------------");
epoch = 1;
globals.fuelConsumption = 5;
for (int i = 0; i < 50; i++){
train.Iteration();
Console.WriteLine(@"Epoch #" + epoch + @" Score:" + train.Error);
epoch++;
}
Console.WriteLine("--------------------------------------");
epoch = 1;
globals.fuelConsumption = 10;
for (int i = 0; i < 50; i++){
train.Iteration();
Console.WriteLine(@"Epoch #" + epoch + @" Score:" + train.Error);
epoch++;
}
Console.WriteLine(@"The score of experienced pilot is:");
network = (BasicNetwork) train.Method;
var pilot = new NeuralPilot(network, false);
globals.fuelConsumption = 1;
Console.WriteLine("@1: " + pilot.ScorePilot());
globals.fuelConsumption = 5;
Console.WriteLine("@5: " + pilot.ScorePilot());
globals.fuelConsumption = 10;
Console.WriteLine("@10: " + pilot.ScorePilot());
但结果还是一样
The score of experienced pilot is:
@1: -27485
@5: -27565
@10: 7448
如何创建一个神经飞行员,让我在所有三种情况下都能获得最高分?