我正在编写代码以自动模拟These修斯和Minoutaur的动作,如本逻辑游戏所示。 http://www.logicmazes.com/theseus.html
我为每个迷宫提供迷宫的位置,以及可用的位置,例如从位置0开始,下一个状态为1,2或保持在0。我运行QLearning实例化,计算which修斯逃离迷宫的最佳路径。假设没有牛头怪。然后介绍牛头怪。 us修斯使他的第一步朝着出口前进,不可避免地被抓住了,从而导致最佳路线的重新分配。在游戏中使用迷宫3作为测试,这种方法导致these修斯在中线上不确定地上下移动,因为这是唯一没有使它丧命的举动。
根据最近几天在这里收到的建议,我调整了代码以考虑状态在给定时间既是these的位置又是牛头怪的位置。当these修斯将移动时,该状态将被添加到“已访问状态”列表中。通过将建议的移动所产生的状态与访问状态列表进行比较,我能够确保these修斯不会进行移动,从而导致以前的状态。
问题是在某些情况下我需要能够重新访问。例如,以迷宫3为例,牛头怪每移动these修斯移动2倍。
us修斯移动4-> 5,状态已添加(t5,m1)。 mino移动1-> 5。 us修斯抓住了,复位了。 4-> 5是一个不好的举动,所以these修斯移动4-> 3,多米诺转弯。现在(t5,m1)和(t3 m1)都在访问列表中
发生的事情是将初始状态下的所有可能状态都添加到了Dont Visit列表中,这意味着我的代码会无限循环,无法提供解决方案。
public void move()
{
int randomness =10;
State tempState = new State();
boolean rejectMove = true;
int keepCurrent = currentPosition;
int keepMinotaur = minotaurPosition;
previousPosition = currentPosition;
do
{
minotaurPosition = keepMinotaur;
currentPosition = keepCurrent;
rejectMove = false;
if (states.size() > 10)
{
states.clear();
}
if(this.policy(currentPosition) == this.minotaurPosition )
{
randomness = 100;
}
if(Math.random()*100 <= randomness)
{
System.out.println("Random move");
int[] actionsFromState = actions[currentPosition];
int max = actionsFromState.length;
Random r = new Random();
int s = r.nextInt(max);
previousPosition = currentPosition;
currentPosition = actions[currentPosition][s];
}
else
{
previousPosition = currentPosition;
currentPosition = policy(currentPosition);
}
tempState.setAttributes(minotaurPosition, currentPosition);
randomness = 10;
for(int i=0; i<states.size(); i++)
{
if(states.get(i).getMinotaurPosition() == tempState.getMinotaurPosition() && states.get(i).theseusPosition == tempState.getTheseusPosition())
{
rejectMove = true;
changeReward(100);
}
}
}
while(rejectMove == true);
states.add(tempState);
}
以上是these修斯的移动方法;偶尔显示它暗示着随机移动
最佳答案
这里的问题是“从未访问过您以前所处的状态”方法与“强化学习”方法之间存在差异。当我建议“永远不要访问您以前所处的状态”时,我假设您正在使用回溯:一旦track修斯被抓到,您便会将堆栈松开到他做出非强制选择的最后一个位置,然后尝试其他选项。 (也就是说,我假设您使用的是状态空间的简单深度优先搜索。)通过这种方法,永远没有理由访问您之前访问过的状态。
对于您的“强化学习”方法,您每次遇到These修斯时都会完全重置迷宫,您需要对此进行更改。我想您可以将“从不访问您以前所处的状态”规则更改为两个规则:
永远不要访问您在迷宫奔跑期间所处的状态。 (这是为了防止无限循环。)
不喜欢拜访These修斯被困的迷宫中所处的州。 (这是“学习”部分:如果以前所做的选择效果不佳,则应减少选择的频率。)