首页 > 其他分享 >全国大学生数学建模大赛模拟测试选拔题——移动机器人路径规划

全国大学生数学建模大赛模拟测试选拔题——移动机器人路径规划

时间:2024-08-27 08:57:33浏览次数:5  
标签:20 蚁群 路径 大赛 建模 移动机器人 网格 算法 grid

移动机器人路径规划是机器人学的一个重要研究领域。 它要求机器人依据某个或某些优化原则(如最小能量消耗、最 短行走路线、最短行走时间等),在其工作空间中找到一条从 起始状态到目标状态能避开障碍物的最优路径。

机器人路径规划问题可以建模为一个有约束的优化问 题,都要完成路径规划、定位和避障等任务。

如上图所示正方形地板边长为1*1,整体为20*20块

地板的地面上,深蓝色为障碍物无法通行,浅色为可通行 部分,从1*1入,从20*20出:

(1)选择合适算法计算出最优路径,论证路径的优越 性。(30分)

(2)利用绘图工具在地图上绘制所求得的最优路径。 (10分)

[提示词:矩阵、蚁群]

基于蚁群算法的最优路径规划在20x20网格地图的应用研究

摘  要

本文研究了移动机器人在具有障碍物的工作空间中的路径规划问题。针对一个20x20的正方形地板环境,其中深蓝色区域代表障碍物,浅色区域代表可通行区域,我们提出了一种基于蚁群算法(Ant Colony Optimization, ACO)的路径规划方法。该方法旨在找到一条从起点(1,1)到终点(20,20)的最优路径,同时满足避开所有障碍物的约束条件。通过仿真实验,我们验证了算法的有效性,并分析了所得路径的优越性。

  • 问题分析
    1. 问题背景

移动机器人路径规划是机器人学中的核心问题之一,它对于提高机器人的自主导航能力和工作效率具有重要意义。在复杂环境中,机器人需要能够快速、准确地规划出一条无碰撞的最优路径。本文采用蚁群算法来解决这一问题,该算法以其强大的全局搜索能力和鲁棒性在路径规划领域得到了广泛应用。

    1. 问题提出

将20x20的正方形地板划分为等大的网格,每个网格代表一个单位面积。深蓝色网格表示障碍物,机器人无法通行;浅色网格表示可通行区域。起点位于网格(1,1),终点位于网格(20,20)。

  • 模型假设与符号说明

2.1模型基本假设

  1. 假设地图环境是静态的,即障碍物位置固定不变,且机器人在移动过程中不会改变环境状态。
  2. 整个20x20的地图被均匀划分为400个网格,每个网格的大小相同,且只有两种状态:可通行(浅色)和不可通行(深蓝色,即障碍物)。

(3)假设只有一个移动机器人在地图中执行路径规划任务。

(4)机器人能够感知到其所在网格及其相邻网格的状态(是否可通行)。

(5)蚁群算法参数固定:在仿真实验中,蚁群算法的相关参数(如信息素蒸发率、信息素强度、蚂蚁数量等)保持固定,以便于结果的可比性和分析。

2.2符号说明

1 符号说明

符号

含义

备注

τij(t)

时刻t时从节点i到节点j的信息素浓度

Δτij​ 

所有机器人在路径ij上沉积的信息素总量

路径数量

Δτijk​ 

第k只机器人在路径ij上沉积的信息素量。

ρ

信息素蒸发率

(0<ρ<1)

Q

机器人释放的信息素总量

Pijk(t)

机器人k在时刻t从节点i转移到节点j的概率

allowedk​

机器人k当前可以访问的网格集合

Lk​ 

机器人k所走路径的长度

α 

控制信息素参数

β 

启发式信息参数

  • 问题一模型建立与求解

3.1求解思路

采用蚁群算法进行路径规划,主要思路是模拟蚂蚁觅食的行为,通过信息素的正反馈机制来引导蚂蚁找到从起点到终点的最优路径。每只蚂蚁在移动过程中会释放信息素,并倾向于选择信息素浓度较高的路径。同时,为了避免陷入局部最优解,引入信息素蒸发机制来降低旧路径上的信息素浓度。

3.2模型建立

通过蚁群算法建立模型,在每个迭代开始之前,所有路径上的信息素都会按照一定比例减少,以模拟信息素的自然消散。

当移动机器人完成一次路径构建后,它们会根据路径的长度或质量在路径上沉积一定量的信息素。

对于

第k次路径,其沉积的信息素量可以定义为:

移动机器人在选择下一个移动方向时,会根据当前位置的信息素浓度和启发式信息来计算选择概率:

3.3得出结果

通过多次迭代,蚁群算法会逐渐收敛到一条或几条较优的路径。在每次迭代后,可以记录当前找到的最短路径长度和对应的路径。当算法满足终止条件(如达到最大迭代次数、最短路径长度不再显著变化等)时,输出最终的最优路径。

生成对应的地图:

表一:模型结果

路径长度:

收敛速度(迭代次数)

计算时间

43

197

0.0010266304016113281 秒

图一:路径结果地图(左边不考虑斜线、右边考虑斜线)

  • 模型评价与推广
4.1 模型评价
本文提出的基于蚁群算法的最优路径规划方法在20x20网格地图中得到了有效验证。通过仿真实验,我们发现该算法能够快速找到从起点到终点的无碰撞最优路径,并且路径长度较短,满足了路径规划的基本要求。此外,蚁群算法的全局搜索能力和鲁棒性也使其在处理复杂环境时表现出色。
然而,该算法也存在一些不足之处。例如,算法参数的选择对结果影响较大,需要通过大量实验来优化;算法在初期可能收敛速度较慢,需要较多的迭代次数才能找到较优解。
4.2 推广
本文的研究成果可以进一步推广到更复杂的地图环境和更多的应用场景中。例如,可以将算法应用于三维空间中的路径规划问题;可以结合其他优化算法来提高算法的性能;还可以考虑加入动态障碍物和不确定性因素等复杂情况,使算法更加实用和可靠。

代码展示

import matplotlib.pyplot as plt
import numpy as np
from queue import PriorityQueue
import math
import time
from matplotlib import rcParams
rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体
rcParams['axes.unicode_minus'] = False  # 用来正常显示负号

#%%
# 创建网格 (0 = 空地, 1 = 障碍物)
grid = np.zeros((20, 20))
grid[1:3, 1:3] = 1  # 示例障碍物
grid[0:8, 6:9] = 1
grid[5:9, 1:4] = 1
grid[14:16, 0:4] = 1
grid[7:12, 10:14] = 1
grid[10:12, 7:10] = 1
grid[12:15, 11:14] = 1
grid[12:15, 15:19] = 1
grid[15:17, 6:12] = 1
grid[17:20, 10:12] = 1
grid[16:18, 17:19] = 1
grid[18:19, 14:15] = 1
#%%
# 定义起点和终点
start = (0, 0)
goal = (19, 19)
#%%
#考虑斜线
def a_star_search(start, goal, grid):
    def heuristic(a, b):
        return abs(a[0] - b[0]) + abs(a[1] - b[1])

    def reconstruct_path(came_from, current):
        path = []
        while current in came_from:
            path.append(current)
            current = came_from[current]
        path.append(start)
        path.reverse()
        return path

    rows, cols = len(grid), len(grid[0])
    open_set = PriorityQueue()
    open_set.put((0, start))
    came_from = {}
    g_score = {(r, c): float('inf') for r in range(rows) for c in range(cols)}
    g_score[start] = 0
    f_score = {(r, c): float('inf') for r in range(rows) for c in range(cols)}
    f_score[start] = heuristic(start, goal)
    
    iterations = 0

    while not open_set.empty():
        current = open_set.get()[1]
        iterations += 1

        if current == goal:
            return reconstruct_path(came_from, current), iterations

        for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1)]:
            neighbor = (current[0] + dx, current[1] + dy)
            if 0 <= neighbor[0] < rows and 0 <= neighbor[1] < cols and grid[neighbor[0]][neighbor[1]] == 0:
                tentative_g_score = g_score[current] + 1
                if tentative_g_score < g_score[neighbor]:
                    came_from[neighbor] = current
                    g_score[neighbor] = tentative_g_score
                    f_score[neighbor] = g_score[neighbor] + heuristic(neighbor, goal)
                    if neighbor not in [i[1] for i in open_set.queue]:
                        open_set.put((f_score[neighbor], neighbor))

    return None, iterations
#%%
# 查找路径
path = a_star_search(start, goal, grid)
#%%
# 运行A*算法并测量时间
start_time = time.time()
path, iterations = a_star_search(start, goal, grid)
end_time = time.time()

# 计算时间
calc_time = end_time - start_time

# 打印结果
if path:
    print(f"路径长度: {len(path)}")
else:
    print("未找到路径")
print(f"收敛速度(迭代次数): {iterations}")
print(f"计算时间: {calc_time} 秒")

# 绘制网格和路径
plt.imshow(grid, cmap='Greys', interpolation='none')
if path:
    path_x, path_y = zip(*path)
    plt.plot(path_y, path_x, 'r', linewidth=2)
plt.scatter([start[1], goal[1]], [start[0], goal[0]], c='blue')
plt.title('路径寻找')
plt.show()

def a_star_search2(start, goal, grid):
    def heuristic(a, b):
        # 曼哈顿距离启发式函数
        return abs(a[0] - b[0]) + abs(a[1] - b[1])

    def reconstruct_path(came_from, current):
        # 从目标节点回溯重建路径
        path = []
        while current in came_from:
            path.append(current)
            current = came_from[current]
        path.append(start)
        path.reverse()
        return path

    rows, cols = len(grid), len(grid[0])
    open_set = PriorityQueue()
    open_set.put((0, start))
    came_from = {}
    g_score = {(r, c): float('inf') for r in range(rows) for c in range(cols)}
    g_score[start] = 0
    f_score = {(r, c): float('inf') for r in range(rows) for c in range(cols)}
    f_score[start] = heuristic(start, goal)

    while not open_set.empty():
        current = open_set.get()[1]

        if current == goal:
            return reconstruct_path(came_from, current)

        for dx, dy in [(-1, 0), (1, 0), (0, -1), (0, 1), (-1, -1), (-1, 1), (1, -1), (1, 1)]:
            neighbor = (current[0] + dx, current[1] + dy)
            if 0 <= neighbor[0] < rows and 0 <= neighbor[1] < cols and grid[neighbor[0]][neighbor[1]] == 0:
                # 计算移动的代价,斜向移动代价更高
                tentative_g_score = g_score[current] + (math.sqrt(2) if dx != 0 and dy != 0 else 1)
                if tentative_g_score < g_score[neighbor]:
                    came_from[neighbor] = current
                    g_score[neighbor] = tentative_g_score
                    f_score[neighbor] = g_score[neighbor] + heuristic(neighbor, goal)
                    if neighbor not in [i[1] for i in open_set.queue]:
                        open_set.put((f_score[neighbor], neighbor))

    return None
#%%
# 查找路径
path = a_star_search2(start, goal, grid)

# # 运行A*算法并测量时间
# start_time = time.time()
# path, iterations = a_star_search(start, goal, grid)
# end_time = time.time()
# 
# # 计算时间
# calc_time = end_time - start_time
# 
# # 打印结果
# if path:
#     print(f"路径长度: {len(path)}")
# else:
#     print("未找到路径")
# print(f"收敛速度(迭代次数): {iterations}")
# print(f"计算时间: {calc_time} 秒")

# 绘制网格和路径
plt.imshow(grid, cmap='Greys', interpolation='none')
if path:
    path_x, path_y = zip(*path)
    plt.plot(path_y, path_x, 'r', linewidth=2)
plt.scatter([start[1], goal[1]], [start[0], goal[0]], c='blue')

# 设置坐标轴刻度
plt.xticks(np.arange(grid.shape[1]))
plt.yticks(np.arange(grid.shape[0]))

# 设置坐标轴标签
plt.title('路径寻找')

# plt.grid(True)
plt.grid(False)
plt.show()

标签:20,蚁群,路径,大赛,建模,移动机器人,网格,算法,grid
From: https://blog.csdn.net/weixin_66547608/article/details/141587655

相关文章

  • 数据仓库系列6:数据仓库建模的主要步骤是什么?
    你是否曾经面对海量的数据感到无所适从?你是否想知道那些运转良好的数据仓库背后究竟有什么秘密?今天,让我们一起揭开数据仓库建模的神秘面纱,探索那些能够将杂乱无章的数据转化为有价值洞察的关键步骤!目录引言:数据仓库建模的重要性第一步:需求分析与规划为什么需求分......
  • UVM中的TLM(事务级建模)通信(2)
    上一篇介绍了UVM中利用TLM进行的一对一通信:UVM中的TLM(事务级建模)通信(1)-CSDN博客,除此之外,UVM还有两种特殊的端口:analysis_port和analysis_export,用于完成一对多的通信。1.analysis端口    这两种端口同样也是用于传递transaction,他们与put,get的区别是:   ......
  • 2024年云南省职业院校技能大赛中职组 “移动应用与开发”赛项竞赛样卷
    2024年云南省职业院校技能大赛中职组“移动应用与开发”赛项竞赛样卷移动应用开发交流进步裙:958892296文章目录2024年云南省职业院校技能大赛中职组“移动应用与开发”赛项竞赛样卷模块A:移动应用界面设计模块B:移动应用前端开发模块C:移动应用测试与交付一、......
  • 2024年云南省职业院校技能大赛中职组“网络搭建与应用”赛项竞赛样卷
    2024年云南省职业院校技能大赛中职组“网络搭建与应用”赛项竞赛样卷文章目录2024年云南省职业院校技能大赛中职组“网络搭建与应用”赛项竞赛样卷第一部分:网络理论测试(100分)第二部分:网络建设与调试(400分)第三部分:服务搭建与运维(500分)竞赛说明一、竞赛内容分布......
  • 2024年云南省职业院校技能大赛中职组“大数据应用与服务”赛项竞赛样卷
    2024年云南省职业院校技能大赛中职组“大数据应用与服务”赛项竞赛样卷文章目录2024年云南省职业院校技能大赛中职组“大数据应用与服务”赛项竞赛样卷模块一:平台搭建与运维模块二:数据获取与处理模块三:业务分析与可视化大数据相关资源参考链接:https://blog.csdn.ne......
  • 【数学建模】层次分析法
    在数学建模问题求解中什么时候用到层次分析法在数学建模问题求解中,层次分析法(AnalyticHierarchyProcess,AHP)通常用于解决评价类问题,特别是在需要从多个备选方案中选择最佳方案时。以下是一些典型的应用场景:方案选择:当需要从多个备选方案中选择最佳方案时,可以使用层次分......
  • 250+ AI新创意!百度黑客马拉松大赛“专攻”智能体
    250+AI新创意!百度黑客马拉松大赛“专攻”智能体博主默语带您GotoNewWorld.✍个人主页——默语的博客......
  • 2024数学建模国赛准备中!!!(2——非线性规划)
    第三章 非线性规划§1非线性规划非线性规划的实例与定义如果目标函数或约束条件中包含非线性函数,就称这种规划问题为非线性规划问题。一般说来,解非线性规划要比解线性规划问题困难得多。而且,也不象线性规划有单纯形法这一通用方法,非线性规划目前还没有适于各种问题的一......
  • 数学建模之Matlab快速入门--全
    前言:本文是之前学Matlab时候做的笔记,很适合快速入门数学建模中matlab和python是最常用的两个软件,现在本人更喜欢python去做数学建模文章目录界面介绍与操作快捷操作数据类型数值型整型浮点型复型逻辑型字符型struct数组cell数组函数句柄日期和时间型数据标准变量储存......
  • 【国赛速成系列】建模手三天速成计划
    内容来自https://www.bilibili.com/video/BV14M4m1y77t目录一、第一天1、常见模型分类2、两大学习神器(1)SPSSPRO (2)ChatGPT二、第二天三、第三天一、第一天建模手在最开始需要了解模型分类及国赛常见模型的用法1、常见模型分类(1)机理分析类     来源于实......