2022电工杯数学建模B题解题思路(5G 网络环境下应急物资配送问题)

news2024/11/25 20:33:58

一、前言        

        本文是对2022年第十四届 “电工杯” 高校数学建模挑战赛B题:5G 网络环境下应急物资配送问题的解题思路,希望能够对正在学习数学建模或者研究该类问题的读者提供帮助。作者在当届的比赛中,获得了本科组三等奖的成绩,并且在这个的基础上进行了后期的思路改进,可以说这个思路还是具有一定的合理性的。

PS:当年的获奖证书到现在没发,不知道组委会在搞什么飞机。
喊话组委会:大哥们,23年的都快出成绩了,你们搞啥呢?

二、问题背景

        一些重特大突发事件往往会造成道路阻断、损坏、封闭等意想不到的情况,对人们的日常生活会造成一定的影响。为了保证人们的正常生活,将应急物资及时准确地配送到位尤为重要。伴随着科技水平的提升及 5G 网络的逐渐普及,无人机的应用越来越广泛,“配送车辆+无人机”的配送模式已经渐渐成为一种新的有效的配送方式。
        “配送车辆+无人机”的配送模式是指:在物资配送过程中,配送车辆对某地点进行配送的同时,无人机也可向周围可行的地点进行配送,并于配送完成后返回配送车辆重新装载物资、更换电池。这种配送模式可以大大提高应急物资的配送效率,也可以解决复杂路况下的物资配送,避免次生灾害对人员的二次伤害。
        在应急物资配送过程中,配送车辆可在某地点释放无人机,再前往其它地点配送。配送车辆可先于无人机到达某地点等待接收无人机,也可比无人机晚到某地点再回收无人机。无人机在一次飞行过程中可对一个地点进行配送,也可根据实际情况对多个地点进行配送。无人机完成一次飞行后可返回配送车辆换装电池,然后再次进行配送。配送车辆和无人机合作完成所有地点应急物资配送任务,返回到出发地点,此时称为完成一次整体配送。
        完成一次整体配送所需要的时间是配送人员主要考虑的因素,按照配送车辆和无人机从出发开始至全部返回到出发地点的时间来计算。在配送过程中,不考虑配送车辆及无人机装卸物资的时间,同时不考虑配送车辆和无人机在各个配送点的停留时间。

三、具体问题

        1.图 1 给出 14 个地点,其中实线代表各地点之间的路线情况。若目前所有应急物资集中在第 9 个地点,配送车辆的最大载重量为 1000 千克,采取配送车辆(无人机不参与)的配送模式。请结合附件 1,建立完成一次整体配送的数学模型,并给出最优方案。
        2.图 2 中实线代表车辆和无人机都可以走的路线,虚线代表只有无人机可以走的路线。应急物资仍然集中在第 9 个地点,配送车辆的最大载重量为 1000 千克,采取“配送车辆+无人机”的配送模式。请结合附件 2,建立完成一次整体配送的数学模型,并给出最优方案。
        3.若问题 2 中的配送车辆的最大载重量为 500 千克,其他条件不变。请结合附件 2,建立完成一次整体配送的数学模型,并给出最优方案。
        4.图 3 中有 30 个地点,计划设置两个应急物资集中地点,若配送车辆的最大载重量为 500 千克,采取“配送车辆+无人机”的配送模式。请结合附件 3,建立完成一次整体配送的数学模型,确定两个应急物资集中地点的最佳位置。

四、假设补充

        1.假设应急物资配送前 5G 网络能够覆盖整个配送区域。
        2.忽略无人机自身重量的影响,无人机的最大载重量为 50 千克;配送车辆行驶平均速度为 50 公里/小时,无人机飞行平均速度为 75 公里/小时;无人机单次最长飞行时间为 70 分钟。
        3.每个应急物资集中地点限一辆配送车辆,只能携带一架无人机。
        4.在论文附录中提供所有数学模型的可运行程序。

五、解题思路

        问题 1:可以采用贪心算法来解决。首先在初始状态下,选定出发点为第 9 个地点,并将所有应急物资集中在该点。然后按照图 1 的路线情况,从该点出发依次经过可达的未访问过的点,当载重达到 1000 千克时,返回第 9 个地点重新装载物资,并再次出发进行下一轮配送。重复该过程,直到所有点均被访问并完成一次整体配送。在此过程中,记录下各点访问次序以及每个配送轮次的时间消耗,最终得出完成一次整体配送的最优方案。

        问题 2 和 3:可以采用分支限界算法寻找最优解。首先设定状态空间树的根节点为出发点为第 9 个地点,由此展开子节点,对每一个节点进行处理,计算出在该节点时所有未访问过的点,满足载重不超过配送车辆最大载重的情况下,所能到达的最远距离。采用优先队列对子节点进行排序,得到当前最优解。以此方式层层展开子节点,直到得到整体配送的最优解。

        问题 4:也可以采用分支限界算法。首先设定状态空间树的根节点是两个应急物资集中地点任意选定一点。然后在状态空间树中依次展开子节点,对于每一个未访问过的点,先计算它与已选定的地点之间的距离,若距离都小于或等于配送车辆最大载重,就将其加入已访问的点的集合中,并计算出它们可以到达的最远距离。将这些点作为状态空间树中的子节点,以相同方式进行处理,直到经过所有点且回到已选定地点,得出整体配送的最优方案以及最佳位置。

六、附上几个典型代码

          这里是几个符合该问题背景的典型算法代码:

(一)贪心算法

          以问题一为例:

```
def greedy_algorithm(graph):
    n = len(graph)
    visited = set()
    max_load = 1000 # 配送车辆最大载重

    current = 8 # 初始状态下出发点为第9个地点
    visited.add(current)
    seq = [current]
    load = 0
    time = 0

    while len(visited) < n:
        next_node = -1
        max_distance = 0

        # 遍历未访问的所有点,选择距离当前点最远的可达点
        for i in range(n):
            if i not in visited and graph[current][i] > 0 and graph[current][i] + graph[i][8] <= max_load - load:
                if graph[current][i] > max_distance:
                    max_distance = graph[current][i]
                    next_node = i

        # 若没有可达点,则返回起始点重新装载物资
        if next_node == -1:
            load = 0
            time += graph[current][8]
            current = 8
            seq.append(current)
        else:
            visited.add(next_node)
            seq.append(next_node)
            load += graph[current][next_node]
            time += graph[current][next_node]
            current = next_node

    # 返回访问顺序和总时间
    return seq, time
```

        其中,变量 `graph` 表示图的邻接矩阵,`n` 表示总的点数,`visited` 保存已经访问过的点编号,`max_load` 表示配送车辆的最大载重量,`current` 表示当前所在点,`seq` 保存点的访问顺序,`load` 保存当前载重,`time` 保存完成一次整体配送的总时间。函数返回点的访问顺序和总时间。

(二)问题二的分支限界算法的典型代码

        以下是问题二的分支限界算法的典型代码实现:

```
import heapq

def branch_and_bound(graph, max_load):
    n = len(graph)
    visited = set()
    root = 8 # 初始状态下出发点为第9个地点

    # 初始化状态空间树的根节点
    heap = [(0, root, frozenset([root]), 0)]
    best_seq = None
    best_time = float('inf')

    while heap:
        _, current, visited_set, time = heapq.heappop(heap)

        # 判断该节点是否需要展开子节点
        if len(visited_set) == n:
            if time < best_time:
                best_time = time
                best_seq = tuple(visited_set)
        else:
            # 找到所有可达的未访问过的节点
            new_nodes = []
            for i in range(n):
                if i not in visited_set and graph[current][i] > 0:
                    if graph[current][i] + graph[i][8] <= max_load:
                        new_nodes.append(i)
                    else:
                        distance = graph[current][i] + graph[i][8] - max_load
                        h = distance / 5 # 假设无人机速度为5m/s
                        new_nodes.append((i, h))

            # 对可行节点和无人机情况进行排序
            new_nodes = sorted(new_nodes, key=lambda x: x[1] if isinstance(x, tuple) else 0)

            # 展开子节点,并加入优先队列中
            for node in new_nodes:
                if isinstance(node, tuple):
                    i = node[0]
                    h = node[1]
                    new_visited_set = visited_set | frozenset([i])
                    new_time = time + h
                    heapq.heappush(heap, (new_time, i, new_visited_set, time))
                else:
                    i = node
                    new_visited_set = visited_set | frozenset([i])
                    new_time = time + graph[current][i]
                    heapq.heappush(heap, (new_time, i, new_visited_set, new_time))

    # 将节点编号转换为点的访问顺序
    best_seq = [i for i in best_seq]
    best_seq.remove(root)
    best_seq.insert(0, root)

    # 返回点的访问顺序和总时间
    return best_seq, best_time
```

       其中,变量 `graph` 表示图的邻接矩阵,`max_load` 表示配送车辆的最大载重量,`n` 表示总的点数,`visited_set` 保存已经访问过的点编号的集合,`root` 表示初始状态下出发点为第 9 个地点,`heap` 是优先队列,用于保存待展开的子节点。函数返回点的访问顺序和总时间。

七、总结

        本次解题思路的主要内容是基于应急物资的配送问题,涉及到贪心算法和分支限界算法的应用。对于问题一,采用贪心算法求解,依次遍历未访问的所有点,选择距离当前点最远的可达点,实现较为简单;对于问题二和问题三,采用分支限界算法求解,以图的状态空间树表示所有可能的配送方案,以找到最优解为目标,算法思路更加复杂;对于问题四,同样采用分支限界算法求解,将配送车辆最大载重量设为 500 千克,同时需要计算两个应急物资集中地点的最佳位置,思路相对于问题二和三更加复杂。总体来说,以上解题思路需要结合具体问题,分析问题背景,给出合适的模型和算法,找到最优配送方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/667868.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【新星计划·2023】Linux是什么?它与Windows有什么区别?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、Linux是什么&#xff1f; 二、Linux的应用领域 1、服务器领域 2、嵌入式领域 3、虚拟化 三、Linux的未来 1、云计算 2、大数…

Nmap中NSE数据文件分析

Nmap中NSE数据文件分析 1.Nmap中数据文件所在的位置2.暴力穷举时所使用的用户名和密码列表数据文件3.Web应用审计数据文件http-fingerprints.luahttp-sql-errors.lsthttp-web-files-extensions.lsthttp-devframework-fingerprints.luahttp-folders.txtvhosts-default.lstwp-plu…

S32K146入门 遇到 DefaultISR

S32K146入门 遇到 DefaultISR 1、芯片型号没有选对&#xff0c;pin管脚匹配不对 比如我使用的是S32K146HFMLQ&#xff0c;100pin&#xff0c;就要选择对应的型号 2、时钟配置不对 开发板是外部晶振8M&#xff0c;类型要选对。 我选择外部时钟给信号&#xff0c;导致一直出…

Linux使用NDK编译libtiff库并移植到Android平台

1.系统要求: ubuntu 20.04 LTS桌面版本 2.下载libtiff源码: 打开libtiff官方网站 ,打开libtiff源码仓库 http://www.simplesystems.org/libtiff/ 复制下载仓库地址: 克隆源码到本址: git clone --recursive https://gitlab.com/libtiff/libtiff.git 进入源码目录 3.安装…

软件测试需不需要懂代码?

无论是刚入测试行业的萌新&#xff0c;还是已经在测试行业闯荡了两三年的小司机们&#xff0c;都会琢磨一个问题&#xff1a;如果要持续发展下去&#xff0c;我要不要懂代码&#xff1f; 在软件测试初级阶段&#xff0c;不需要编程能力。但是任何一个职业&#xff0c;都会追求…

leetcode90. 子集 II(java)

子集II leetcode90. 子集 II题目描述解题思路代码演示 回溯算法专题 leetcode90. 子集 II 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;https://leetcode.cn/problems/subsets-ii 题目描述 给你一个整数数组 nums &#xff0c;其中可能包含重复元素…

00后确实卷,公司新来的卷王,我们这帮老油条还真干不过.....

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。 这不&#xff0c;前段时间我们公司来了个00后&#xff0c;工作都没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了…

Java集合Map接口的实现类(HashMap、LinkedHashMap等面试题)的结构

HashMap /** 一、Map的实现类的结构&#xff1a;* |----Map:双列数据&#xff0c;存储key-value对的数据 ---类似于高中的函数&#xff1a;y f(x)* |----HashMap:作为Map的主要实现类&#xff1b;线程不安全的&#xff0c;效率高&#xff1b;存储null的key和value|…

AIGC之文本内容生成概述(上)

由于本文内容稍微长了一点点&#xff0c;所以分成了上下两篇文章来介绍&#xff0c;本文是上篇&#xff0c;下篇将会在后续发布。关于自然语言的生成方面&#xff0c;这一块的内容太多了&#xff0c;本文也只是穿针引线&#xff0c;帮大家理清学习路线而已&#xff0c;更多的内…

关于ROS/ROS2 bag包的名称修改问题

1 问题的提出 在ROS/ROS2中&#xff0c;ROS 的 bag包的名称通常会包含录制的具体时间&#xff1a;YYYY-MM-DD-小时-分钟-秒钟&#xff0c;但是这样可读性不强&#xff0c;而且过一段时间&#xff0c;就不知道这个包是关于什么内容的了。如果需要修改bag包的名称&#xff0c;该…

从0开始,手写MySQL事务

说在前面&#xff1a;从0开始&#xff0c;手写MySQL的学习价值 尼恩曾经指导过的一个7年经验小伙&#xff0c;凭借精通Mysql, 搞定月薪40K。 从0开始&#xff0c;手写一个MySQL的学习价值在于&#xff1a; 可以深入地理解MySQL的内部机制和原理&#xff0c;Mysql可谓是面试的…

渲染机制不仅在Android系设计到,Flutter中也有设计

前言 本文将介绍 Android 的渲染机制。主要是带着大家了解 Android 是如何绘制并显示一帧图像的&#xff0c;同时会涉及 Skia底层渲染的使用&#xff0c;以及关联到flutter的UI体系设计&#xff0c;感兴趣的可以在阅读的同时使用 Skia自己搭建一套flutter UI体系 进行尝试。在…

# Linux 学习记录37(C高级篇)

Linux 学习记录37(C高级篇) 本文目录 Linux 学习记录37(C高级篇)一、常见的shell解析器二、变量1. shell脚本外部传参2. 输入输出(1. 输出(2. 输入 3. 命令置换符4. shell中的数组 三、shell中的算数运算1. (())运算2. $[ ]运算3. let运算4. expr指令(1.数据运算(3. 字符运算 四…

Flink 学习一 Flink 简介

Flink 学习一 https://flink.apache.org/ 1.快速认识Flink 1.1 离线批计算与实时流式计算 批计算&#xff1a;有界流 流式计算&#xff1a;无界流 批计算&#xff1a;针对有界流&#xff0c;在计算结果前可以看到整个数据集&#xff1b;流计算&#xff1a;针对无界流&…

Nacos的安装和部署

接下来的时间&#xff0c;我会将Nacos的安装部署&#xff0c;以及在微服务中将其作为配置中心&#xff0c;注册中心&#xff0c;以及它的高级应用会一一为大家分享&#xff0c;今天为大家分享的是Nacos的安装和部署&#xff0c;以windows为例。 1. 下载安装包 官网下载地址&a…

LaTeX在双栏文章里面放单栏或双栏图片【有图有代码】

LaTeX在双栏文章里面放单栏或双栏图片【有图有代码】 双栏文章双栏文章放单栏图片双栏文章放单栏图片 双栏文章 在需要双栏的地方加入\begin{multicols}{2}…\end{multicols} 一般我们可能会希望摘要部分是单栏的。 其余部分设置为双栏&#xff0c;如下&#xff1a; \begin{m…

wxPython 矩形选择框 测试

如下图&#xff0c;这种矩形选择框在图形软件里是必备操作&#xff0c;用python怎么实现&#xff1f;我用wxpython 做了一个例子。 代码如下&#xff1a; #!/usr/bin/env python # -*- coding: utf-8 -*-# Project: test # File : SelectRectang.py # Author : Long.Xu <…

违禁词管理

目录 一、添加违禁词 1.添加一个违禁词 2.批量添加违禁词 二、违禁词实时检测 三、查看违禁词 四、删除违禁词 1.删除一个违禁词 2.批量删除违禁词 五、清空违禁词 一、添加违禁词 1.添加一个违禁词 添加违禁词 ?([\s\S]*) b:$读 违禁词/%群号% a []$ 如果:%括号1% 请…

Java设计模式——策略模式

1. 策略模式简介 策略模式: 策略模式是一种行为型模式, 它将对象和行为分开, 将行为定义为一个行为接口和具体行为的实现 策略模式最大的特点是行为的变化, 行为之间可以相互替换 每个if判断都可以理解为一个策略. 本模式是的算法可独立于使用它的用户而变化 2. 模式结构 策略…