Java迷宫求解和强化学习

标签 java maze

我正在编写代码来自动模拟忒修斯和牛头人的 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/

相关文章:

java - 如何使用 primefaces 的 ajax 刷新 jSTL 测试?

java - 如何告诉 Gradle 使用特定的 JDK 版本?

C++堆栈迷宫求解程序

python - 迷宫不是随机的

c - 如何打印迷宫中从源到目标的 BFS 路径(或者如何获得第一步)?

python - 如何使用 tkinter python 创建迷宫类型界面?

没有死角的迷宫生成算法?

java - 使用套接字 ID 的套接字详细信息

java - 请帮助我发现我的错误。我得到一个空队列,但我希望它的项目数量是原始队列的一半

java - 为什么我的程序不能正确找到主类?