我正在编写代码来自动模拟忒修斯和牛头人的 Action ,如这个逻辑游戏所示; http://www.logicmazes.com/theseus.html
对于每个迷宫,我向其提供迷宫的位置,以及可用的位置,例如从位置 0 开始,下一个状态是 1,2 或保持在 0。我运行一个 QLearning 实例,它计算这些位置的最佳路径逃离迷宫假设没有牛头怪。然后介绍牛头怪。忒修斯向导出迈出了第一步,但不可避免地被捕获,导致最佳路径的权重重新调整。使用游戏中的迷宫 3 作为测试,这种方法导致忒修斯在中线无限地上下移动,因为这是唯一没有杀死它的移动。
根据过去几天收到的建议,我调整了代码,将状态视为给定时间的忒修斯和牛头怪的位置。当忒修斯移动时,该状态将被添加到“访问过的状态”列表中。通过将建议移动产生的状态与访问过的状态列表进行比较,我能够确保忒修斯不会做出会导致之前的状态。
问题是我需要能够在某些情况下重新访问。例如,以迷宫 3 为例,牛头怪每移动 2 次,忒修斯就会移动 2 次。 忒修斯移动 4 -> 5,添加状态(t5, m1)。米诺移动 1->5。忒修斯被捕获,重置。 4->5 是一个糟糕的举动,所以忒修斯移动 4->3,米诺 catch 了他的回合。现在(t5,m1)和(t3 m1)都在访问列表中
发生的情况是初始状态的所有可能状态都被添加到不访问列表中,这意味着我的代码无限循环并且无法提供解决方案。
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);
}
以上是theseus的move方法;偶尔显示它建议随机移动
最佳答案
这里的问题是“永远不要访问您以前所处的状态”方法和“强化学习”方法之间的差异。当我推荐“永远不要访问你以前去过的状态”方法时,我假设你正在使用回溯:一旦忒修斯被捕获,你就会将堆栈展开到他做出非强制选择的最后一个位置,然后尝试不同的选择。 (也就是说,我假设您正在使用状态空间的简单深度优先搜索。)在这种方法中,永远没有任何理由访问您以前访问过的状态。
对于你的“强化学习”方法,每次忒修斯被捕获时你都会完全重置迷宫,你需要改变它。我想你可以将“永远不要访问你以前去过的州”规则改为双管齐下的规则:
- 永远不要访问您在迷宫中经历过的状态。 (这是为了防止无限循环。)
- 不喜欢访问您在迷宫中行走时忒修斯被捕获的状态。 (这是“学习”部分:如果以前的选择效果不佳,则应该减少选择的频率。)
关于Java迷宫求解和强化学习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9862176/