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

news2024/10/6 12:29:09

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.coloradmin.cn/o/1246616.html

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

相关文章

WPF面试题中级篇

WPF中级篇[17] 15. 描述下WPF对象完整的层次结构? Object&#xff1a;Object 是 .NET Framework 中所有类的根类。它提供了一些基本的方法和属性&#xff0c;如 Equals、GetHashCode 和 ToString。所有其他类都直接或间接地继承自 Object。Dispatcher&#xff1a;Dispatcher…

蒸蛋器上平台销售UL1026检测报告标准

蒸蛋器是一种采用发热盘通电后&#xff0c;使盘内产生高温蒸汽来快速把禽蛋蒸熟的一种生活小家电。蒸蛋器最大的特点就是快速、简单&#xff0c;并充满乐趣。 深圳ISO 17025实验室办理蒸蛋器亚马逊美国站UL报告办理UL1026测试标准。 UL1026标准是关于蒸蛋器的安全性要求&…

CMS指纹识别方式

一、手工识别 1.robots.txt文件 robots.txt文件我们写过爬虫的就知道,这个文件是告诉我们哪些目录是禁止爬取的。但是大部分的时候我们都能通过robots.txt文件来判断出cms的类型 如: 从wp路径可以看出这个是WordPress的cms 这个就比较明显了直接告诉我们是PageAdmin cms 也…

java堆文件排查

技术主题 在之前的开发的一个项目中&#xff0c;因为程序的一个bug&#xff0c;导致一些引用的对象一直没有回收&#xff0c;从而导致堆内存一直在增大&#xff0c;老年代一直在增大&#xff0c;老年代进行堆积&#xff0c;后来的排查思路是通过dump堆的文件&#xff0c;然后对…

易点易动固定资产管理系统:实现固定资产与财务系统的高效对接

在企业的日常运营中&#xff0c;固定资产的管理和财务账目的记录是两项不可或缺的任务。然而&#xff0c;由于传统的管理方式存在数据孤岛和信息不一致等问题&#xff0c;往往导致工作效率低下和管理混乱。为了解决这一问题&#xff0c;易点易动固定资产管理系统应运而生。该系…

每日一题 2824. 统计和小于目标的下标对数目(简单)

简单题&#xff0c;走流程 class Solution:def countPairs(self, nums: List[int], target: int) -> int:ans 0for i in range(len(nums)):for j in range(i 1, len(nums)):if nums[i] nums[j] < target:ans 1return ans

2023年ESG投资研究报告

第一章 ESG投资概况 1.1 定义 ESG投资&#xff0c;亦称负责任投资&#xff0c;是一种融合环境&#xff08;Environment&#xff09;、社会&#xff08;Social&#xff09;和治理&#xff08;Governance&#xff09;考量的投资方法&#xff0c;旨在通过综合这些因素来优化投资…

30㎡新中式大横厅|方寸之间,诉说东方写意生活。福州中宅装饰,福州装修

今天要分享的是一个新中式风格的客厅装修&#xff0c;它的开间是4.5米&#xff0c;进深是6.5米。设计中有许多亮点&#xff0c;让我们一起来看看。 1️⃣ 首先&#xff0c;这个客厅采用了双眼皮无主灯吊顶的设计&#xff0c;让整个空间看起来更加高挑宽敞。吊顶的边缘线条简洁明…

Jmeter基础和概念

JMeter 介绍&#xff1a; 一个非常优秀的开源的性能测试工具。 优点&#xff1a;你用着用着就会发现它的重多优点&#xff0c;当然不足点也会呈现出来。 从性能工具的原理划分&#xff1a; Jmeter工具和其他性能工具在原理上完全一致&#xff0c;工具包含4个部分&#xff1a; …

【广州华锐互动】利用VR体验环保低碳生活能带来哪些教育意义?

随着科技的不断发展&#xff0c;虚拟现实&#xff08;VR&#xff09;技术已经逐渐走进了我们的生活。从游戏娱乐到教育培训&#xff0c;VR技术的应用范围越来越广泛。而在这个追求绿色、环保的时代&#xff0c;VR技术也为我们带来了一种全新的环保低碳生活方式。让我们一起走进…

Go 本地搭建playground

搭建go playground 的步骤 1、安装docker 如果你使用的Ubuntu&#xff0c;docker的安装步骤可以参见这里&#xff0c;这是我之前写的在Ubuntu18.04下安装fabric&#xff0c;其中有docker的安装步骤&#xff0c;这里就不再赘述了。 CentOS下安装docker的&#xff0c;可以参见…

Modbus RTU转Profinet网关连接PLC与变频器通讯在机床上应用案例

背景&#xff1a;以前在机床加工车间里&#xff0c;工人们忙碌地操作着各种机床设备。为了使整个生产过程更加高效、流畅&#xff0c;进行智能化改造。 方案&#xff1a;在机床上&#xff0c;PLC通过Modbus RTU转Profinet网关连接变频器进行通讯&#xff1a;PLC作为整个生产线…

Python用爬虫ip抓取数据为啥还被限制ip?

今天遇到一个奇怪的事情&#xff0c;使用python爬取一个网站&#xff0c;但是频繁出现网络请求错误&#xff0c;之后使用了爬虫ip&#xff0c;一样会显示错误代码。一筹莫展之下&#xff0c;我对现在的IP进行在线测试&#xff0c;发现IP质量很差。后来我总结了以下几点原因。 P…

流量分析-PhishingEmail_WriteUp

一、题目问题 问题1&#xff1a;黑客的email名称 问题2&#xff1a;黑客向几人发送了钓鱼邮件 问题3&#xff1a;黑客传输的木马文件名 问题4&#xff1a;下载并运行了木马文件的人的email名称和ip地址&#xff0c;用“-”连接 问题5&#xff1a;黑客用于反弹shell的主机i…

ubuntu22.04 arrch64版在线安装redis

脚本 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 40976EAF437D05B5 apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 3B4FE6ACC0B21F32 echo "deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse" >…

氮化镓的晶体学湿式化学蚀刻法

引言 目前&#xff0c;大多数III族氮化物的加工都是通过干法等离子体蚀刻完成的。干法蚀刻有几个缺点&#xff0c;包括产生离子诱导损伤和难以获得激光器所需的光滑蚀刻侧壁。干法蚀刻产生的侧壁典型均方根(rms)粗糙度约为50纳米&#xff0c;虽然已经发现KOH基溶液可以蚀刻AlN…

工厂模式之抽象工厂模式(常用)

抽象工厂模式 工厂方法模式中考虑的是一类产品的生产&#xff0c;如畜牧场只养动物、电视机厂只生产电视机、计算机软件学院只培养计算机软件专业的学生等。 同种类称为同等级&#xff0c;也就是说&#xff1a;工厂方法模式中只考虑生产同等级的产品&#xff0c;但是在现实生…

【译】Spring 6 入参数据校验: 综合指南

一、前言 在 Spring 6.1 中&#xff0c;有一个非常值得注意的重要改进——编程式验证器实现。Spring 长期以来一直通过注解支持声明式验证&#xff0c;而 Spring 6.1 则通过提供专用的编程式验证方法引入了这一强大的增强功能。 编程式验证允许开发人员对验证过程进行细粒度控…

【LeetCode:2824. 统计和小于目标的下标对数目 | 模拟+二分】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

opencv-背景减除

背景减除&#xff08;Background Subtraction&#xff09;是一种用于从视频序列中提取前景对象的计算机视觉技术。该技术的主要思想是通过建模和维护场景的背景&#xff0c;从而检测出在不同时间点出现的前景对象。 OpenCV 提供了一些用于背景减除的函数&#xff0c;其中最常用…