我正在编写代码以自动模拟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修斯被困的迷宫中所处的州。 (这是“学习”部分:如果以前所做的选择效果不佳,则应减少选择的频率。)

07-28 11:59