寻宝问题

琼斯博士在寻宝的过程中,来到了一个平面图呈矩形的封闭房间。
矩形的宽度为w,高度为h。为方便描述,我们将矩形左上角坐标定为(0, 0),右下角坐标定为(w, h)。
房间的入口在矩形上沿的中点(即(w/2, 0)),出口在矩形下沿的中点(即(w/2, h))。狡猾的魔王还放置了许多红外探测器,一旦进入探测器的探测半径以内,将触发警报。

现在琼斯博士向您求助,他能否全身而退不惊动魔王?

输入:boolean escape(int w, int h, int n, double[] x, double[] y, double[] r)
w为矩形宽度,h为矩形高度,n为探测器总数。第i个探测器的坐标为(x[i],y[i]),探测半径为r[i]。

void dfs_visit(vector<vector<int >> &graph, vector<int> &visited, int u){
    for(int i=0;i<graph[u].size();i++){
        if(visited[graph[u][i]]==0){
            dfs_visit(graph, visited,graph[u][i]);
        }
    }
    visited[u]=1;
}
double distance(double x1, double y1, double x2, double y2){
    return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}

bool escape(int w, int h, int n, double x[], double y[], double r[]){
    /*check if the the enternce or exit is in a sensor circle*/
    for(int i=0;i<n;i++){
        if(distance(x[i],y[i],w/2,0)<=r[i] || distance(x[i],y[i],w/2,h)<=r[i])
        return false ;
    }
                
    vector< int> spoints;
    vector< int> epoints;
    for(int i=0;i<n;i++){
                                 /*the sensor which x is small than w/2 and intersect with the rectangle can be a start pointer*/
        if(x[i]<w/2){
            if(abs(y[i])<=r[i] || abs(x[i])<=r[i] || abs(h-y[i])<=r[i]){
                spoints.push_back(i);
            }
        }
        else{
                                                 /*the sensor which x is big than w/2 and intersect with the rectangle can be a end pointer*/
            if(abs(y[i])<=r[i] || abs(w-x[i])<=r[i] || abs(h-y[i])<=r[i]){
                epoints.push_back(i);
            }   
        }
    }
    vector<vector< int>> graph(n);
    vector< int> visited(n);
    if(spoints.size()!=0 && epoints.size()!=0){
                                 /*creat a graph. if the two sensors'circle intersect, add an edge in the graph */
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(distance(x[i],y[i],x[j],y[j])<=r[i]+r[j]){
                    graph[i].push_back(j);
                }
            }
        }
                                 /*depth first search the graph by the start pointers, record all the pointers searched in the visited array*/
        for(int i=0;i<spoints.size();i++){
            if(visited[spoints[i]]==0){
                dfs_visit(graph, visited,spoints[i]);
            }
        }
                                 /*check if any of the end pointers is in the visited array, if yes, return false*/
        for(int i=0;i<epoints.size();i++){
            if(visited[epoints[i]]==1){
                return false ;
            }
        }
        return true ;
    }
    else{
        return true ;
    }
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在强化学习中,迷宫问题是一个经典的示例,用于解释强化学习的基本原理。在实现深入浅出强化学习:原理入门中,作者在第35页介绍了如何构建一个简单的迷宫,并使用表格型方法来解决寻宝问题。 首先,我们需要构建一个迷宫环境。迷宫可以表示为一个方格矩阵,其中包含障碍物、奖励以及终点位置。通过定义迷宫的尺寸以及具体的障碍物、奖励和终点位置,我们可以创建一个迷宫环境。 接下来,我们可以使用表格型方法解决寻宝问题。在表格型方法中,我们使用一个表格来表示智能体的价值函数或者Q函数。每个表格项表示在某个状态下采取某个动作的预期回报。 在开始之前,我们需要初始化所有表格项的值为0或者任意随机值。然后可以通过迭代更新表格中的项来得到更准确的估计值。 在每个时间步中,智能体会根据当前状态选择一个动作,并执行它。执行动作后,智能体会观察到一个新的状态以及相应的奖励。根据观察到的奖励和下一个状态,智能体可以使用贝尔曼方程来更新表格中的值。 重复这个过程直到达到预定的终止条件。通过不断迭代更新表格中的值,智能体可以学习到最优策略,使得它能够在迷宫中找到最有利的路径以获取最大的总回报。 通过实现这个迷宫构建和利用表格型方法解决寻宝问题的过程,我们可以更好地理解强化学习的原理和应用。这个简单的示例可以作为学习和研究强化学习的起点,为进一步深入探索提供基础。 ### 回答2: 迷宫是强化学习中经常用来模拟环境的一种方式。通过构建迷宫,我们可以利用表格型方法解决寻宝问题,即使用简单的表格来存储环境、决策和奖励信息。 迷宫一般包括一个正方形的网格,其中有起点、终点和障碍物。我们可以使用数字表示不同的状态,例如起点为0,终点为9,障碍物为-1。除此之外,我们还需要定义动作的种类,例如上、下、左、右,用数字1、2、3、4分别表示。同时,我们需要为每个动作定义相应的奖励,例如到达终点的奖励为100,碰到障碍物的奖励为-10。 在解决迷宫问题时,我们可以利用表格方法中的Q-learning算法。Q-learning使用一个Q表格来存储每个状态下每个动作的Q值,其中Q值是根据当前状态和动作的奖励计算得出的。初始时,Q表格的值可以随机初始化。 在进行训练时,我们可以通过一系列的迭代过程来更新Q表格的值。每次迭代中,我们从起点开始,在每个状态下根据当前的Q表格选择相应的动作,并根据动作的奖励计算下一个状态的Q值。然后,将新的Q值更新到Q表格中。通过多次迭代,Q表格的值会逐渐趋于稳定。 在利用训练好的Q表格解决迷宫问题时,我们可以根据当前的状态查找Q表格中相应的最优动作,并执行该动作。这样,agent就能够根据学习到的知识在迷宫中寻宝。 利用表格型方法解决迷宫问题是强化学习中的一种经典方法,它可以帮助我们理解强化学习的基本原理。通过构建迷宫、定义奖励和动作,并使用Q-learning算法进行训练,我们能够获得一个可以解决寻宝问题的agent。 ### 回答3: 在深入浅出强化学习:原理入门这本书的第35页上,介绍了如何利用表格型方法解决迷宫寻宝问题。这个问题可以用一个迷宫来建模表示,迷宫由一个二维的矩阵组成,每个位置可以是一个墙壁、一个通道或者是一个宝藏。 为了解决这个问题,我们可以使用Q-learning算法。Q-learning是一种基于值函数的强化学习算法,它通过不断更新值函数的估计来实现智能体的决策。 首先,我们需要定义一个Q表格,它是一个二维矩阵,其中行表示智能体所处的位置,列表示可能的动作。初始时,Q表格的所有元素都初始化为0。 然后,我们需要定义一些参数,如学习率α、折扣因子γ和探索率ε。学习率决定了每次更新的幅度,折扣因子决定了对未来奖励的重视程度,探索率决定了智能体在探索和利用之间的权衡。 接下来,我们开始训练智能体。在每次训练中,智能体会观察当前的状态,并根据探索率决定是进行探索还是利用Q表格来选择动作。如果进行探索,智能体会随机选择一个动作;如果利用Q表格,智能体会选择具有最高Q值的动作。 然后,智能体执行选择的动作,并观察新的状态和奖励。根据Q-learning算法,智能体会根据当前状态、选择的动作、新的状态和奖励来更新Q表格的值。更新的方式是通过下面的公式进行计算: Q(s,a) = (1-α) * Q(s,a) + α * (r + γ * maxQ(s',a')) 其中,s表示当前状态,a表示选择的动作,r表示当前状态下的奖励,s'表示新的状态,maxQ(s',a')表示新的状态下的最大Q值。 智能体会不断地在迷宫中移动,直到找到宝藏或者超过最大迭代次数。在训练的过程中,智能体的Q表格会逐渐收敛,最终可以达到一种最佳策略,即通过Q表格可以选择出最优的动作来解决寻宝问题。 这就是如何利用表格型方法解决迷宫寻宝问题。通过不断地训练和更新Q表格,智能体可以逐渐学习到最优的策略,从而成功找到宝藏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值