2022年MathorCup高校数学建模挑战赛—大数据竞赛A题58到家家政服务订单分配问题求解全过程文档及程序

2022年MathorCup高校数学建模挑战赛—大数据竞赛

A题 58到家家政服务订单分配问题

原题再现:

  “58 到家”是“58 同城”旗下高品质、高效率的上门家政服务平台,平台向用户提供家政保洁、保姆、月嫂、搬家、维修等众多生活领域的服务。在家政保洁场景中,用户在平台下单购买服务后,平台会将订单分配给一个保洁阿姨,阿姨接到订单后按照用户指定的服务时间上门,进行保洁服务。平台在将订单分配给一个保洁阿姨时,一方面,为了提高对顾客的服务质量,需要尽量分配服务分较高的阿姨,其中阿姨的服务分是基于阿姨历史订单的评价情况得到,取值为[0,1],值越大越好;另一方面,为了帮助阿姨提高接单量,需要尽量缩短阿姨相邻单之间的通行时间。
  每天通过平台进行分配的订单量是巨大的,当前平台实现了一套订单分配算法,本问题研究的是如何优化系统的分配算法,提高算法的求解能力,实现提升顾客体验、节省阿姨时间。
  数据说明:
  数据包含一天内、一个区域的所有订单和所有保洁阿姨。
在这里插入图片描述
在这里插入图片描述
  约束条件及假设:
  1. 所有订单都要分配一个且只有一个阿姨;
  2. 每个订单需要指定一个服务开始时间,这个时间的取值范围为 [最早时间,最晚时间],且是半点的整数倍;
  3. 一个阿姨同时只能服务一个订单;
  4. 阿姨需要在每个订单的服务开始时间之前到达客户位置;
  5. 阿姨每天开始任务时必须从初始点位置出发;
  6. 任意两点的距离为欧式距离;
  7. 保洁阿姨的行驶速度为 15 千米/小时。 优化目标:
  将每个订单匹配阿姨时,优化的目标是:
  1. 所有订单匹配的阿姨的服务分,其平均值 A 尽可能大;
  2. 最小化每单的平均通行距离 B。一个订单的通行距离指的是阿姨从上一个地点到本单地点的距离(欧式距离),其中阿姨第一个订单的通行距离等于从初始点到第一个订单位置的距离,单位是千米;
  3. 最小化阿姨服务订单的平均间隔时间 C。一个订单的间隔时间指的是,阿姨从上一个单服务结束时刻到本单服务开始时刻的时间间隔,单位是小时,其中阿姨第一个订单的间隔时间设定为 0.5 小时(阿姨首单需要做基本的准备工作,不考虑阿姨从初始点到第一个订单的通行时间);
  4. 总体目标是各个目标的加权和:αA-βB-γC,其中α=0.78、β=0.025、γ=0.195,得分四舍五入取 6 位小数。目标值越大越好。
  初赛问题
  问题 1:只考虑离线批量派单模式。附件 1 与附件 2 中分别给出的是一天的所有订单信息与阿姨信息。
  (a) 请设计最优的订单与阿姨匹配算法,将所有订单进行分配,并将求解结果填写到 result1.txt 中。(订单必须全部分配、阿姨不需要全部匹配订单)。
  (b) 基于(a)的算法,请对附件 1 中的前 50 个订单与附件 2 中前 20 个阿姨,重新运行算法,给出阿姨的执行任务列表,并画出阿姨的行动轨迹图。

在这里插入图片描述
  问题 2:线上批量派单模式。在实际业务场景中,通常采用固定的频率派单,每 30 分钟将该段时间内产生的新订单统一分配;分配时允许部分订单暂时不派单,称之为压单,但是压单订单必须满足服务开始时间的最早时 间 比 当 前 时 间 晚 于 2 个 小 时 ( 不 包 括 2 个 小 时 ) 也 即 满足:serviceFirstTime-currentTime>2h;请设计这种情况下的每批订单的最优分配算法。并将求解结果 1-最终决策结果填写到 result21.txt 中,结果 2-每次决策结果填写到 result22.txt 中。
在这里插入图片描述
在这里插入图片描述

整体求解过程概述(摘要)

  随着我国经济水平的发展和人民生活质量的提高,人们对家政服务的要求日益专业化、规范化、综合化,为增强客户体验及提高时间效率,探究家政服务公司订单分派系统的优化问题,我们通过贪心算法的思想,设计基于收益评估的阿姨与订单分配算法,来研究如何在离线批量派单时达到收益最大,接着引入下单时间对模型进行改进,建立多批次的分配模型,实现订单的多批次分配。
  针对问题一,首先根据题意定义决策变量,并将题中所给的约束条件、优化目标等转化为具体的数学规划模型。然后因为是离线派单模式,因此所有订单的信息都是已知的,考虑到问题的规模较大,我们根据数学规划模型设计基于收益评估的阿姨与订单分配算法。该算法首先通过贪心算法定义每个订单的服务优先级,然后将订单按照客户要求的最晚服务时间进行升序排序,若是最晚服务时间相同则按照优先级进行降序;再给每一个订单进行每个阿姨的预分配,依据贪心算法预测出每个符合条件的阿姨在分配给该订单的情况下的收益,然后根据具体的收益情况进行阿姨分配。最终通过上述算法建立基于收益评估的阿姨与订单分配模型,决策出各个订单的分派方案,并绘制所有订单分配最大收益的频数直方图和阿姨分派次数的统计图对结果进行可视化,发现最大收益集中分布在区间 [0.55,0.65] 上,且阿姨的重复分配率高,绝大部分阿姨未被分配,高达2110个,最终计算出该算法下的最优总体目标为0.611404。接着我们针对前50个订单与前20个阿姨进行分派,并计算出该数据集下的总体目标为0.477170,并绘制出分派过的阿姨的行动轨迹图。
  针对问题二,根据题意需要考虑下单时间这一因素,根据固定的频率将订单根据下单时间进行分批,每次只能在已知当前批次订单和被压单订单的情况下进行最优的阿姨分派。因此我们对问题一的模型进行改进,设计基于收益评估的多批次阿姨与订单分配模型。主要原理是组建当前批次订单并对当前批次订单进行阿姨预分配的收益预测,然后选出当前收益最大的分配情况和压单情况,再对下一批订单进行分配。因为在优先级机制的保障下,最先分配阿姨的订单一定是时间上较为紧急的订单,因此在处理后面几个订单时,如果符合压单且预分配收益小于事先定义的阈值,则对其进行压单。我们对阈值进行参数寻优,从而确定最优阈值为 0.67,接着通过上述模型决策出问题二各批次订单的分配结果和每次决策结果,并绘制所有订单分配最大收益的频数直方图和阿姨分派次数的统计图对结果进行可视化,发现问题二的直方图集中数据区间与问题一相似,但未被分派的阿姨数量减少,最终计算出该方案下的最优总体目标为 0.612838,总压单次数为 5494 次。
  最后我们编写 C++代码对模型进行检验,发现问题一和问题二的订单分派结果均通过检验,说明不存在一个阿姨同时服务多个订单或订单漏分配的情况,订单分派合理。

模型假设:

  1) 假设顾客不会随意取消订单。
  依据:当前订单的取消可能会导致需要对后续订单进行重新分配才能保证最优目标。
  2) 假设阿姨体力充足,无订单服务次数限制。
  依据:阿姨存在一天服务多个订单的情况。
  3) 假设阿姨每次通行和服务时无突发情况。
  依据:意外的发生会影响该阿姨后续订单的分派。

问题分析:

  数据的预处理分析
  首先通过程序检测各个文件,发现各文件都不存在缺失值。然后通过编写 C++ 代码,将订单信息的时间戳转换为具体日期,发现所有订单中的服务时间都在一天内,为2022 年 9 月 10 日当天的 8:00 至 22:00,因此只需针对当天进行订单分派工作。
  问题一的分析
  针对问题一,首先根据题意定义决策变量,并将题中所给的约束条件、优化目标等转化为具体的数学规划模型。然后因为是离线派单模式,因此所有订单的信息都是已知的,考虑到问题的规模较大,我们设计基于收益评估的阿姨与订单分配算法:首先通过贪心算法3定义每个订单的服务优先级,将订单按照客户要求的最晚服务时间进行升序排序,若是最晚服务时间相同则按照优先级进行降序;再给每一个订单进行阿姨的预分配,预测出每个符合条件的阿姨分配给该订单的收益,然后根据收益情况进行具体的阿姨分配。最终通过上述算法建立基于收益评估的阿姨与订单分配模型,并给出问题一的计算结果和绘制前 50 个订单与前 20 个阿姨的行动轨迹图。
  问题二的分析
  针对问题二,根据题意我们需要引入下单时间这一因素,根据固定的频率将订单根据下单时间进行分批,每次只能在已知当前批次订单的情况下进行最优的阿姨分派。因此我们对问题一的模型进行进一步加工,将其设计成基于收益评估的多批次阿姨与订单分配模型,实现订单的在线调度4。次进行订单收益对当前批次订单进行阿姨预分配的收益预测,然后选出当前最高收益5的分配情况,再对下一批订单进行分配。针对符合压单情况的订单,因为我们在优先级的保障下,最先分配阿姨的订单一定是时间上较为紧急的订单,因此在处理后面几个订单的适合,如果符合压单且预分配收益小于阈值,则对其进行压单。最终我们通过上述模型计算出问题二的最终决策结果和每次决策结果。

模型的建立与求解整体论文缩略图

在这里插入图片描述
在这里插入图片描述

全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可

程序代码:

程序如下:
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <stack>
#include <queue>
using namespace std;void backTrack(vector<vector<double>>& num,vector<bool>&used, vector<int>& pre,vector<int>& cur,double curProfit, double&preProfit, int n, int pos)
{//如果pos == n 说明行数已经达到n行,所有的行都已经选完,是一种结果if (pos == n) {//全局找最大,判断是否出现更优解if (curProfit > preProfit)  {//更新当前最大的和preProfit = curProfit;//数组赋值,将这个最优解的数组赋值给pre,最后用来输出pre = cur; }return;}//枚举第pos行的每一列for (int i = 0; i < n; i++){//改行必须在之前没有被选择使用过,必须满足题意if (!used[i])  // 标记第 i列,下一次第i列就不能选择了{//代表本次选择pos行的i列元素,进行标记本次递归的选择位置//因为可能出现本次选择是最优的情况,所以需要保存cur[pos] = i;  // 记录每一个 pos行对应的列数i,下面的就是回溯过程//代表当前的评分和加上本次的选择//同理和cur一样都要保存curProfit += num[pos][i];//代表着第i例被使用过,下次不能在选择第i列used[i] = true;backTrack(num,used,pre,cur, curProfit, preProfit, n, pos + 1);//撤销选择curProfit -= num[pos][i];//撤销标记used[i] = false;}}
}int main()
{int n;while (cin >> n){vector<vector<double>> vvd(n, vector<double>(n));for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){cin >> vvd[i][j];}}vector<int> pre(n); //  记录最优解的每个值 所在的 列数vector<int> cur(n); //  列数加入数组vector<bool> used(n); // 标记数组, 因为一列只能选择一个double preProfit = INT_MIN; // 全局的最大值double curProfit = 0.0; // 当前的最大值int pos = 0;  // pos就是行数,pos到达一行,就选y值就可以了backTrack(vvd, used, pre, cur, curProfit, preProfit, n, pos); //打印结果printf("%4.2f\n",preProfit);//cout << preProfit << endl;for (int i = 0; i < pre.size(); i++){cout << i + 1 << " " << pre[i] + 1 << endl;}}
}
全部论文及程序请见下方“ 只会建模 QQ名片” 点击QQ名片即可

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

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

相关文章

欲更新浏览器的Mac用户请注意,AMOS又出一招新“骗术”

近日&#xff0c;Malwarebytes发现有一种专门针对Mac操作系统&#xff08;OS&#xff09;的数据窃取程序正通过伪造的网页浏览器更新程序进行分发。Malwarebytes称这与其通常的技术、战术和程序大不相同&#xff0c;该恶意软件可以模仿 Safari 和谷歌 Chrome 浏览器。 网络安全…

【C++心愿便利店】No.13---C++之探索vector底层原理

文章目录 前言一、STL简介1.1 什么是STL1.2 STL的六大组件 二、vector的介绍及使用2.1 vector的介绍2.2 vector的使用2.2.1 vector的定义2.2.2 vector iterator 的使用2.2.3 vector 空间增长问题2.2.4 vector 增删查改 三、vector模拟实现3.1 成员变量3.2 成员函数3.2.1 构造函…

2、分布式锁实现原理与最佳实践(二)

常见分布式锁的原理 4.1 Redisson Redis 2.6之后才可以执行lua脚本&#xff0c;比起管道而言&#xff0c;这是原子性的&#xff0c;模拟一个商品减库存的原子操作&#xff1a; //lua脚本命令执行方式&#xff1a;redis-cli --eval /tmp/test.lua , 10 jedis.set("produ…

python opencv 放射变换和图像缩放-实现图像平移旋转缩放

python opencv 放射变换和图像缩放-实现图像平移旋转缩放 我们实现这次实验主要用到cv2.resize和cv2.warpAffine cv2.warpAffine主要是传入一个图像矩阵&#xff0c;一个M矩阵&#xff0c;输出一个dst结果矩阵&#xff0c;计算公式如下&#xff1a; cv2.resize则主要使用fx&…

精益生产中的周转箱优势:提升效率与质量的得力利器

在当今竞争激烈的制造业中&#xff0c;企业追求高效生产和卓越质量是至关重要的。精益生产理念提供了一套有效的工具和方法&#xff0c;其中周转箱作为一个关键的组成部分&#xff0c;在优化生产流程、提高效率和质量方面发挥着重要作用。下面谈谈精益生产中的周转箱优势&#…

C++:内存管理

内存分布&#xff1a; 首先我们需要了解的是C/C中内存区域的划分&#xff1a; 1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等&#xff0c;栈是向下增长的&#xff1a;先调用的地址比后调用的地址大。 2. 内存映射段是高效的I/O映射方式&#xff0c;用于装载一个共享的动…

百度文心一言(千帆大模型)聊天API使用指导

开篇不得不吐槽下百度&#xff0c;百度智能云平台首页跳转千帆大模型平台的按钮太多了&#xff0c;不同按钮跳转不同的子页面&#xff0c;不熟悉的&#xff0c;能把人找懵。入口太多&#xff0c;就导致用户不知道从何开始。本文就从一个前端开发人员的角度&#xff0c;教大家快…

【深度学习】基于深度学习的超分辨率图像技术一览

超分辨率(Super-Resolution)即通过硬件或软件的方法提高原有图像的分辨率&#xff0c;图像超分辨率是计算机视觉和图像处理领域一个非常重要的研究问题&#xff0c;在医疗图像分析、生物特征识别、视频监控与安全等实际场景中有着广泛的应用。 SR取得了显著进步。一般可以将现有…

为什么,word文件在只读模式下,仍然能编辑?

Word文档设置了只读模式&#xff0c;是可以编辑的&#xff0c;但是当我们进行保存的时候就会发现&#xff0c;word提示需要重命名并选择新路径才能够保存。 这种操作&#xff0c;即使可以编辑文字&#xff0c;但是原文件是不会受到影响的&#xff0c;编辑之后的word文件会保存到…

20231124给RK3399的挖掘机开发板在Andorid10下加鼠标右键返回

20231124给RK3399的挖掘机开发板在Andorid10下加鼠标右键返回 2023/11/24 12:19 百度&#xff1a;RK3399 Android10 右键返回 https://blog.csdn.net/danhu/article/details/122467256 android9/android10 鼠标右键返回(已验证) danhu 于 2022-01-13 09:46:42 发布 android10 …

Echarts 大屏注册自定义地图解析文件流报错问题解决

效果图: 1、首先通过后台接口获取到SVG图片的文件流,postman能够正确解析出文件流,前端调用api时需要设置返回的响应格式为image/svg+xml格式,否则解析失败 拿到文件流后是这样的 <?xml version="1.0" encoding="utf-8"?> <!-- Generator: …

AI制作的《大多数普通女孩的一生》——公开教程和工作流

内容来源&#xff1a;JiamigouCn ​这周由AI制作的《大多数普通女孩的一生》&#xff0c;在抖音爆火&#xff0c;获得新华网转发。到目前为止&#xff0c;全网还没有公开教程和工作流&#xff0c;需要花费800-2000购买。 本着AI社区共享原则&#xff0c;我委托公众号“楚思智能…

小学生古诗文大会复赛在线模拟新增刷题版和闯关版,帮助孩子冲刺

小学生古诗文大会明天就要开始了&#xff0c;刚刚古诗文大会主办方也正式发布了通知&#xff0c;总体安排、操作指引和我之前发布的一样&#xff1a;2023年11月25日小学生古诗文大会复选&#xff08;复赛&#xff09;答题操作手册 为了帮助参加复选&#xff08;复赛&#xff09…

NFC技术简介

NFC简介 NFC(近场通信&#xff0c;Near Field Communication&#xff09;是一种短距高频的无线电技术&#xff0c;由非接触式射频识别(RFID)演变而来。 NFC工作频率为13.56Hz&#xff0c;通常只有在距离不超过4厘米时才能启动连接&#xff0c;其传输速度有106 Kbit/秒、212 Kb…

从文本生成到数据增强:探索 AI 前沿的开源套件 | 开源专题 No.44

Significant-Gravitas/AutoGPT Stars: 150.4k License: MIT AutoGPT 是开源 AI 代理生态系统的核心工具包。它采用模块化和可扩展的框架&#xff0c;使您能够专注于以下方面&#xff1a; 构建 - 为惊人之作打下基础。测试 - 将您的代理调整到完美状态。查看 - 观察进展成果呈…

HandBrake 1.7 近日发布

导读HandBrake 1.7 近日发布&#xff0c;作为这个开源、免费和跨平台视频转码器应用程序的重大更新&#xff0c;适用于 GNU/Linux、macOS 和 Windows 系统。 在 HandBrake 1.6 发布近一年后&#xff0c;HandBrake 1.7 版本为 Linux 用户提供了许多好处&#xff0c;包括视频摘要…

ubuntu22.04 arrch64版在线安装maven

脚本 if type -p mvn; thenecho "maven has been installed."elsecd /home/zenglgwget https://dlcdn.apache.org/maven/maven-3/3.9.5/binaries/apache-maven-3.9.5-bin.tar.gz --no-check-certificatetar vxf apache-maven-3.9.5-bin.tar.gz rm -rf /usr/local/mav…

springboot+vue基本微信小程序的剧本杀游戏设计与实现

项目介绍 首先,论文一开始便是清楚的论述了小程序的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了小程序的需求基础上需要进一步地设计系统,主要包罗软件架构模式、整体功能模块、数…

通过内网穿透本地MariaDB数据库,实现在公网环境下使用navicat图形化工具

公网远程连接MariaDB数据库【cpolar内网穿透】 文章目录 公网远程连接MariaDB数据库【cpolar内网穿透】1. 配置MariaDB数据库1.1 安装MariaDB数据库1.2 测试局域网内远程连接 2. 内网穿透2.1 创建隧道映射2.2 测试随机地址公网远程访问3. 配置固定TCP端口地址3.1 保留一个固定的…

小程序:project.config.json / project.private.config.json / 项目配置文件 /拉取代码产生冲突 / 如何解决

一、理解project.config.json / project.private.config.json project.config.json 文件是项目的配置文件&#xff0c;它包含了关于小程序的一些基本信息&#xff0c;例如小程序的名称、App ID、开发者信息以及页面路径等。这个文件一般不会被提交到版本控制系统中&#xff0c;…