一、课题任务概述

你运行一家外卖快递服务店,负责一个区域内的外卖订单接收和餐食快递。你有一笔启动资金,可以招募外卖骑手帮你送餐,来赚取快递费。但你也会面临风险,本区域的订单你都有义务接收,不能拒绝,若拒单就会被工商部门吊销营业执照;但如果接收多个订单后,因为骑手来不及送达,导致某个订单超时未送达,客户会投诉,你会被罚款。

因此,你的任务就是制定聪明的调度策略,避免拒单被吊销营业执照(人工调度在订单高峰期可能会来不及接收),避免因为罚款而破产,并且尽可能赚更多的钱。

二、规则

2.1 规则一:负责的区域约束1-1:你的区域必须是一个9*9的方格,每格是一个房间,既可以是下订单的食客家,也可以是接单的餐馆

约束1-2:方格之间的8*8条街道是骑手唯一可走的道路;骑手停在方格的上下左右街道,即算抵达

约束1-3:每个方格的宽高都一样,即骑手走过每个方格的距离一样,速度也一样,约定为骑手每走过一个方格花费1个时间单位,骑手从最左边直达最右边花费时间8个时间单位,即拐弯不花时间,经过路口不花时间。每个时间单位暂定为20秒,后续可能会统一修改

约束1-4:为了记录房间和骑手位置,坐标系定为17*17,约定左上角的房间逻辑坐标为(0, 0),右下角房间的逻辑坐标为(16, 16)。横纵坐标一奇一偶的都是路,坐标都是偶数的是房间,坐标都是奇数的是路口

2.2 规则二:外卖订单格式和输入方式约束2-1:你负责的外卖派送区域内,发起的任何订单都必须接收;如果订单发起后,3个时间单位内没有派单给现有骑手,则视为拒单,你将被吊销营业执照,运营终止

约束2-2:外卖订单的信息格式是一个四元组(n序号,t下单时间,餐馆坐标,食客坐标);具体格式规范如下,必须按此规范执行。(注:/表示前后数据分隔的含义,实际中不出现)。序号/分隔符空格 /下单时间/分隔符空格/餐馆坐标x/分隔符空格/餐馆坐标y/分隔符空格/食客坐标x/分隔符空格/食客坐标y/回车符/n。约束2-3:外卖订单的输入方式,要求一套程序支持以文本文件格式的输入方式,和鼠标操作的输入方式两种。两种方式不会同时生效。

文件输入方式:系统启动后检查当前目录下是否有标准文件名“sales.txt”,若有则自动进入订单强制文件输入方式。sales.txt文件必须遵从约束2-2规定的文件格式。

鼠标操作方式:系统启动后检查当前目录找不到标准文件“sales.txt”,则自动进入订单强制鼠标输入方式。系统运行期间,鼠标点中任意方格再拖拽至另一方格,即算完成从餐馆到食客的订单发起动作,系统必须实时记录并进行派单。

2.3 规则三:运营规则约束3-1:系统开始运营时,你有1000$作为运营资本

约束3-2:你必须有骑手才能接单,招聘一位骑手需投资300$; 只要你有钱,骑手数量不限;在系统运营的整个期间,你都可以随时招聘骑手,但必须有足够的钱,不能拖欠

约束3-3:招聘骑手的发起方式只能是两种方式,一种是你的调度程序自动发起,另一种是做成输入按钮,鼠标点击的方式发起。你可以只实现一种,也可以两种都实现,两种都实现的好处是人工调度比自动调度聪明

约束3-4:接单的方式只能是将其按顺序派给指定骑手。接单的操作可以是人工接单,也可以是程序按调度策略自动接单。人工接单的操作比较复杂,需要用鼠标逐个选中现有未处理订单,将其分配给某个骑手

约束3-5:所有骑手的初始位置必须是同一位置;但起始位置需要在你的程序中自行设定。骑手初始位置的设定可以在程序中写死,也可以在系统启动时修改设置,两种均可。注意:如果骑手初始在左上角,那么立刻接到一个(右下角>左上角)的订单时,可能超时

约束3-6:每个订单从下单时间开始,要求在30个时间点内完成服务(先后抵达餐馆和食客家),否则算超时。满30个时间点订单若没有完成结单,客户会投诉导致立刻罚款50$; 满60个时间点订单若没有完成结单,属于恶意废单立刻破产

约束3-7:每完成一单且不超时,可收入10$

约束3-8:无须考虑骑手负载限制,一位骑手可以带无限外卖;但超时未达要按约束3-6条处罚

约束3-9:负债即破产!一旦破产,即刻停止运营,系统盘点每位骑手的接单数、完成数、超时数

约束3-10:系统运营期间,至少每个时间单位更新一次,显示当前钱数、每位骑手的位置、接单数、完成数、超时数

2.4 规则四:技术框架约束4-1:程序代码主体必须是C语言编写。

约束4-2:界面部分,允许使用C++的动画包。

约束4-3:主干代码不允许抄袭,无论是来自互联网或者其他设计人员

2.5 建议:派单的基础策略策略x-1:首先按下单时间顺序,将新订单放入待处理队列

策略x-2:根据骑手数量,将区域划分为几块,分给每个骑手,注意预先保留一个跨区域订单骑手

策略x-3:派单时,从待处理队列取出队首订单,判断属于哪个区域,就分给哪个骑手,分派后此单出待处理队列,加入对应骑手的待送达队列;餐馆和食客不在一个区域的订单,分给跨区域骑手

策略x-4:当跨区域骑手的待派送队列中元素超过预警值时(例如10个),再分出一个骑手作跨区域骑手,剩下骑手重新划分区域,更改仅对后续订单生效,已分配订单受影响。注意:预警值是你自己在程序中设定的,根据经验设置

策略x-5:所有单派完后,开始轮流对所有骑手的待派送队列进行优化。优化策略是:取出队首订单,作为当前目标点;计算骑手当前位置和当前目标点的区域范围,然后扫描队列后续订单中的所有可达目标点(见后续解释),筛选出属于此区域内的,设计出合理的行走路线,只要按此路线当前目标点不超时,即可插入到队首目标点之前。

为了完成上述优化策略,骑手的待派送队列要把每个订单拆成A、B两个任务,每个元素都包含订单号、A或B标志,坐标位置点,下单时间,是否可达,这五个数据。A任务没有约束条件,任何时间都属于可达目标点;B任务,默认不可达,只有在A任务完成时,扫描队列将A任务对应订单号的B任务改为可达。

策略x-5附加动作:当骑手的当前位置抵达待派送队列队首元素,队首元素出队,执行任务撤销处理,若是A任务,修改队列中对应B任务为可达; 若是B任务,计算是否超时,超时罚款,最后将该骑手的完成订单数+1

三、模块划分

3.1 输入模块接单(sales.txt)(按照订单中的时间匹配上clock()/CLOCKS_PER_SEC使用)

信息格式是一个四元组(n序号,t下单时间,餐馆坐标,食客坐标)

准备使用二元数组存储

3.2 控制模块分区:为每一位骑手划分指定的派送区域

分单:遍历订单,根据区域分给骑手(注:要分别设定本区预警值,和跨区预警值,达到预警值,返回第一步,重新分区)(还是需要一个时间预警值,比如超过2.5个时间单位,订单还没有被分配,需要优先被分配给订单少的骑手)(三个判断)

聘骑手:每聘请一名新的骑手,执行第一步分区(初始化是3个)(每多一个要分配一个数组)(但是要考虑预留一部分罚款金额:(n-2)*100)/*n为骑手数目*/

派单:需要考虑路线和时间,目标是不拒单,少罚款,路线设计上争取时间最短

3.3 输出模块

每个时间单位输出一次:骑手位置,接单数,完成数,超时数,钱。

模块调用关系

四、关键数据类型

订单:二元数组(目前想法10000*6)(非静态全局变量)

序号

时间

餐馆x

餐馆y

食客x

食客y

每一位骑手的派送区域:二元数组(例 0 5 0 5 表示派送区域0<=x<=5,0<=y<=5)

骑手序号

横坐标x范围

横坐标x范围

纵坐标y范围

纵坐标y范围

每一位骑手的订单:二维数组

序号

接单时间

餐馆坐标x

餐馆坐标y

食客坐标x

食客坐标y

骑手位置

骑手序号

骑手位置x

骑手位置y

待分配订单二元数组

序号

时间

餐馆x

餐馆y

食客x

食客y

五、关键全局变量接单数 task

完成数 finish

超时数 overtime

钱 money

时间单位数 time unit

骑手数 rider

六、关键常量订单预警值

时间预警值

时间单位常量(0.05秒)

超时时间(30个时间单位)

拒单时间1(3个时间单位)

拒单时间2(60个时间单位)

七、关键算法

7.1 分区

对于3-10个骑手使用枚举算法:

3个人:左半边,右半边,以及一个跨区

4个人:左半边,右半边,两个跨区(随机分配)

5个人:左半边,右半边,三个跨区(随机分配)

6个人:三个区:左边,中间,右边,三个跨区(左和中,左和右,中和右)

7个人:三个区:左边,中间,右边,四个跨区(左和中,左和右,左和右,中和右)

8个人:三个区:左边,中间,右边,五个跨区(左和右,左和右,左和中,右和中,第五个要判断左和中,右和中那个订单压力大就分给哪个)

9个人:三个区:左边,中间,右边,六个跨区(左和右,左和右,左和中,左和中,右和中,右和中)

10个人:四个区:a和b, a和c, a和d, b和c, b和d, c和d, a和a,b和b, c和c, d和d

往后当骑手增加的时候,判断哪个区域订单压力最大,就分配到哪个区域。

7.2 分单

根据时间单位来读取订单进入待处理订单中,然后依次进行if判断,来确定该订单位于哪一个区域中,从而分配到对应骑手的派送订单中,在进行判断的同时,要用当前时间单位减去待处理订单中的所有订单来判断是否有订单要超时(预警值暂定为2.5个时间单位)(如果存在这样的订单,立刻对各个骑手的派送订单数做统计,将这个订单派给订单最少的骑手),将订单分给骑手的同时,要记录每个骑手的接单数,当接单数等于订单预警值,就要重新分区(区数减一,跨区骑手加一)。

7.3 聘骑手

骑手数加一,需要设定一个预留的罚款金额(要随骑手数目增加而线性增加),当骑手数目加一,则需要调用分区算法来决定新的分区。

7.4 派单

先取区域内所有的餐馆的餐(以横坐标为基准,用骑手的横坐标分别减去区域内各餐馆的横坐标,正值即餐馆在骑手左侧,负值即餐馆在骑手右侧;比较最大正值和最小负值的绝对值的大小,若正值更小,则骑手先往左侧取餐,若负值绝对值更小,则骑手先往右侧取餐,然后凑y值趋势。)(注:当某一列的餐馆与当前骑手位置的纵坐标差值>=6时,先放弃取餐,延后处理)。后送区域中所有食客的餐,(方法与送餐一样)并更新各订单状态(超时或送达),同时更新超时数,完成数,资金,并把送达的订单从配送队列中。

7.5 删除

当时间等于29个时间单位时,遍历一遍待配送队列是否有订单还未从餐馆取走,若有,则抛弃之后要送给食客的订单,回去取未取订单,再继续送给食客。

八、用户界面设计

左侧订单状态中第一栏是骑手编号和位置坐标,第二栏是订单中餐馆位置和食客位置,第三栏是每一个订单的完成状况:超时或完成。

初始界面

运行界面

c语言外卖程序,课内资源 - 基于C语言的外卖派单模拟系统相关推荐

  1. C语言家谱管理程序,课内资源 - 基于C语言实现的家谱管理系统

    一.项目简介 家谱是一种以表谱形式,记载一个以血缘关系为主体的家族世袭繁衍和重要任务事迹的特殊图书体裁.家谱是中国特有的文化遗产,是中华民族的三大文献(国史,地志,族谱)之一,属于珍贵的人文资料,对于 ...

  2. java实现一元多项式减法,课内资源 - 基于C语言实现的一元多项式的计算

    一.概述 通过C语言使用链式存储结构实现一元多项式加法.减法和乘法的运算.按指数降序排列. 二.需求分析 建立一元多项式并按照指数降序排列输出多项式,将一元多项式输入并存储在内存中,能够完成两个多项式 ...

  3. 数学金字塔C语言原函数,课内资源 - 基于C语言实现的金字塔问题(Pyramid Problem)...

    1 开发软件说明 Dev C++是一个 Windows 下的C 和C++程序的集成开发环境,是一款自由软件,遵守GPL 许可协议分发源代码.它使用MingW32/GCC 编译器,遵循 C/C++ 11 ...

  4. c语言机票座位预定系统_课内资源 - 基于C语言的飞机票预订系统

    1 解题思路 本题需要综合使用数据结构的知识.以此,将航班数据设计成链表形式即定义结构体,其中包含飞机序号,登机口作为数据域,next作为指针域,将此结构体称为Node.将乘客信息设计成特殊的结构体, ...

  5. C语言编程求解圆盘的汉诺塔,课内资源 - 基于80x86汇编的汉诺塔

    一.软件背景介绍 我们今天要陈述的应用叫做汉诺塔,大家可能小时候都接触过类似于鲁班锁,九连环的益智玩具,我们要说的汉诺塔其实也可以说是益智玩具的一种. 下面我们具体介绍一下汉诺塔.汉诺塔有三根杆子A, ...

  6. 餐厅管理程序c语言源代码,课内资源 - 基于C++的餐厅管理程序的设计与实现

    摘 要 随着计算机应用技术的快速发展和日益普及,网络也遍及到我们生活的每个角落,为我们的学习和工作带来极大的方便.很多人都使用过传统的文字,纸张管理手段,与之不同的另外一种管理方式就是利用电脑程序管理 ...

  7. c语言文字冒险类游戏,课内资源 - 基于C语言和easyx实现的巧虎划船大冒险游戏...

    1 需求分析 1.1 功能需求 游戏性:通过键盘方向键的←.→.↑.↓来控制巧虎(船)的移动,躲避暗礁,碰撞宝物(特殊宝物),来增加积分,在倒计时结束前(到达终点前)争取得到更多分数.为提高可玩性,宝 ...

  8. c语言全民飞机游戏代码,课内资源 - 基于VC++和OpenCV实现的全民飞机大战游戏

    摘要功能:利用C++语言完成了一个小游戏项目-全民飞机大战,该游戏首先能够给用户提供注册,登录功能:提供了菜单栏及两种游戏模式,一种是无尽模式,另一种是一般模式:一般模式中用户通过控制玩家飞机攻击敌方 ...

  9. 用c语言写扫雷游戏倒计时代码,课内资源 - 基于VS2013实现的扫雷小游戏

    1.任务概述 1.1 系统总体目标 本项目的目的在于开发一个扫雷软件,该软件面向游戏玩家用户,具有进行扫雷游戏的功能.游戏玩家将使用系统中的如下功能: 进行游戏 使用自定义游戏规格功能 使用计时器功能 ...

最新文章

  1. Django:数据库表的建立与增删查改(ForeignKey和ManytoMany)
  2. 设计模式-设计原则(Design Principle)
  3. 15 分钟带你入门 sklearn 与机器学习(分类算法篇)
  4. 理性预期学派(Rational Expectation School)
  5. 实录分享 | 计算未来轻沙龙:“法律+AI”前沿研讨会(PPT下载)
  6. Windows Phone 7 使用Canvas Grid StackPanel进行布局管理
  7. mysql拷贝文件安装_Mysql5.7.18的安装与主从复制图文详解
  8. B2C网站运营核心数据分析模型
  9. 关于Mac下mysql8.0的启动
  10. 如何在数据库中添加示例数据库Northwind
  11. JavaFX 2 Dialogs
  12. 神经元图片结构图,人脑神经元图片
  13. destoon php文件,Destoon 任意文件读取
  14. 深入浅入 ~ ConCurrentHashMap底层原理透析
  15. 这可能是网贷历史上最黑夜的一个月
  16. 中文字型设计新思路--人工智能与中文字型设计
  17. 群论基础速成(A crash course for group theory)(1)
  18. 三读《UNIX编程艺术》
  19. Debian9+openmediavault4搭建全纪录
  20. 你的NAS被勒索病毒攻击了怎么办?

热门文章

  1. MinGW的安装及配置
  2. 友讯达PLM项目启动
  3. EXCEL中与SUM相关的函数
  4. TIA Portal V16.0(博途/博图)安装教程(TIA Step7TIA WinCC Professional)
  5. 166万人被骗3000万元!最近全网刷屏的网红游戏翻车了?
  6. 9年,我从小白到大厂测开工程师,从单身汉到迎娶白富美···
  7. Python数据清洗小技巧——分组聚合
  8. LTE参考信号CRS、DRS、SRS、DMRS
  9. Ctrl Shift G被搜狗占用之封杀搜狗快捷方式
  10. 2022最新版超详细的Maven下载配置教程、IDEA中集成maven(包含图解过程)、以及导入项目时jar包下载不成功的问题解决