好的,由于前面的问题,我被指出要使用强化学习。
到目前为止,我从随机网站上了解到的内容如下:
- 涉及到一个 Q(s,a) 函数
- 我可以假设我的神经网络 ~ Q(s,a)
- 我的模拟有一个状态(N 个输入变量)
- 我的演员可以执行 M 个可能的动作(M 个输出变量)
- 在模拟的每一步,我的演员只执行与
max(outputs)
- (在我的情况下,动作是增加或减少螺旋桨推力的 1/2/3 %。)
从这个网站我发现在某些时候我必须:
- 估计输出 Q[t](或所谓的 q 值)
- 估计下一个状态 Q[t+1] 的输出
- 让反向传播算法只对下一个状态执行的动作进行纠错。
最后三点对我来说根本不清楚,事实上我还没有下一个状态我要做的是:
- 估计先前的输出 Q[t-1]
- 估计电流输出 Q[t]
- 让反向传播仅修复最大 q 值的错误
实际上对于代码我只使用这个库,它很简单,可以让我理解里面发生了什么:
初始化神经网络(具有 N 个输入神经元、N+M 个隐藏神经元和 M 个输出神经元)非常简单:
Network network = new NeuralNetwork( N, N+M, M);
然后我想了解需要一个任意的奖励函数
public double R()
{
double distance = (currentPosition - targetPosition).VectorMagnitude();
if(distance<100)
return 100-distance; // the nearest the greatest the reward
return -1; // too far
}
那么我要做的是:
// init step
var previousInputs = ReadInputs();
UpdateInputs();
var currentInputs = ReadInputs();
//Estimate previous outputs Q[t-1]
previousOutputs = network.Query( previousInputs );
//Estimate current outputs Q[t]
currentOutputs = network.Query( currentInputs);
// compute modified max value
int maxIndex = 0;
double maxValue = double.MinValue;
SelectMax( currentOutputs, out maxValue, out maxIndex);
// apply the modified max value to PREVIOUS outputs
previousOutputs[maxIndex] = R() + discountValue* currentOutputs[maxIndex];
//Let backpropagation fix the error for max q value only
network.Train( previousInputs, previousOutputs);
// advance simulation by 1 step and see what happens
RunPhysicsSimulationStep(1/200.0);
DrawEverything();
但这似乎不是很好。我让模拟运行了一个多小时没有成功。可能我以错误的方式阅读算法。