概要设计书

1.0 编码规范

变量名

  1. 变量名使用下划线命名方法
  2. 变量定义后,写上该变量的作用及其含义
  3. 变量不得使用i,j,k,a,b,c,包括循环变量
  4. 循环变了使用iter_i,iter_j这种命名方法
int iter_i; // 循环
for(iter_i = 0;iter_i<10;iter_i++){.....
}

常量名

  1. 常量名使用大写,且常量只能使用const关键字定义,使用宏定义即#define是不被允许的。
  2. 使用下划线命名方法。
const int THIS_IS_A_CONST;

函数名

  1. 函数名使用驼峰命名法
  2. 函数定义后,需要使用注释写清楚,函数的输入类型,返回值类型
  3. 当返回值多余一个时,使用指针传参
int maxOfThree(int num1,int num2,int num3){// 返回三个数的最大值return max(max(num1,num2),num3);
}

文件名

  1. 文件名使用驼峰命名法

  2. 文件名格式为name.model.c/cpp

    例如 rider.data.c

目录说明

├── main.c      程序入口
├── README.md   项目说明文件
├── lib         自己编写的库文件
├── res         资源文件,包括图像,声音等
└── vendor      第三方资源文件

1.1 输入、输出设计

文件方式

输入格式 < sales.txt

序号 下单时间 餐馆坐标x 餐馆坐标y 食客坐标x 食客坐标y

输出格式 > output.txt

时间单位
账户余额
接单数
完成数
超时数
每位骑手的位置

命令行方式

1.2 算法设计

分区

路程设计

1.3 高层数据结构定义

全局常量定义

START_UP_MONEY 初始金额
HIRE_MONEY     招募一个人需要的资金
DEAD_TIME      超过DEAD_TIME时间单位后,被视为拒单
FINE_DELIVER_TIME 超时时间,第一次超时罚款
FINE_MONEY        第一次超时罚款金额
DEAD_DELIVER_TIME 超时时间,第二次超时倒闭
MONEY_PER_ONE     完成一单获得的钱
MAP_X             地图X大小
MAP_Y             地图Y大小

全局变量定义

RIDER_COUNT       骑手当前数量
TIME              当前时间

全局数据结构定义

地图数据结构

struct MapNode{int x,y,type; // type:代表此节点为路或者房子
}

订单数据结构

struct Bill{int id;             // 订单idint start_time;     // 订单开始时间int restaurant_x;   // 餐馆位置int restaurant_y;int target_x;       // 目的位置int target_y;
}
struct ListBill{         // 订单链表 这里使用双链表,便于查询,实现起来应该是队列ListBill* pre_bill;  // 上一个订单Bill* cur_bill;      // 当前订单ListBill* next_bill; // 下一个订单
}

骑手数据结构

struct Rider{int id;             // 骑手idint position_x;     // 骑手当前位置int position_y;     Bill* current_bill; // 骑手当前订单ListBill* bag;       // 骑手背包数据
}
struct ListRider{ListRider* pre_rider; // 前一个骑手Rider cur_rider;      // 当前骑手ListRider* next_rider;// 下一个骑手
}

1.4系统模块划分

main.c 程序入口,包括对全局对象(变量)初始化;

void init(); // 初始化

baseFunction/Rider.c

Bill getRiderCurrentBill(int rider_id); // 返回骑手当前bill
BillList getRiderBag(int rider_id);     // 返回骑手背包数据
void getRiderPosition(int rider_id,int *x,int *y) // 返回骑手当前位置,指针传参
int buyRider(); // 买骑手,返回骑手id
void riderWalk(int rider_id,int x,int y) // 移动骑手

baseFunction/Bill.c

int getBillCostTime(int bill_id); // 获得从发出订单到现在的时间
int getBillStatus(int bill_id);   // 获得订单状态
int getBillRider(int bill_id);    // 获得订单骑手编号
void assignBill(int bill_id,int rider_id);// 派单

IO/Input.c

Bill readBill(); // 读入一个Bill

IO/output.c

void printStatus(); // 输出参数
void printMap();    // 输出地图数据

baseStructure/Rider.c

void listRiderAppend(ListRider *List,Rider rider); // 骑手链表加入骑手

baseStructure/Bill.c

void listBillAppend(ListBill *List,Bill bill) // 订单列表添加

algorithm/Assign.c

int getProperRider(int bill_id); // 获取应当的骑手

algorithm/Path.c

void getNextMove(int rider_id,int *x,int *y); // 获取骑手下一步位置

高层算法设计

0x00 算法分析

  1. 因为当前未知以后的状态,我们肯定只考虑当前订单以及之前的订单数据所产生的影响,而对未来并不需要预期。

  2. 由于在此地图上两点之间到最短距离便于计算,即曼哈顿距离,因此我们只需考虑所走路径和在原有路径上进行微调即可

0x01 基本约定

  1. 考虑到现实状况,我们可以将骑手划分,给每个骑手分派区域,这样是比较方便的
  2. 算法的核心问题是,如何判定是否顺路的问题,判断当前订单加入背包后可以在当前订单不超时的情况下完成配送。

0x02 贪心算法–解决订单分配任务

  1. 由于先前影响已经表现在当前骑手位置,以及骑手背包中,我们可以根据当前的骑手的状态判断最佳分配方案
  2. 首先遍历骑手,将此订单加入每个骑手的背包,通过计算得到当前骑手当前背包送完时间,和超时状态
  3. 通过判断送完时间的最小值,以及超时状态。得到当前局部最优解,并将订单分配

0x03 遗传算法-解决订单路径问题

  1. 我们可以参考TSP问题,将当前配送员的配送顺序当作基因编码,然后通过生成算法,生成最优路径

♻️ 资源

大小: 27.5MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87415722

基于C语言实现(控制台)外卖派单模拟系统【100010620】相关推荐

  1. c语言外卖程序,课内资源 - 基于C语言的外卖派单模拟系统

    一.课题任务概述 你运行一家外卖快递服务店,负责一个区域内的外卖订单接收和餐食快递.你有一笔启动资金,可以招募外卖骑手帮你送餐,来赚取快递费.但你也会面临风险,本区域的订单你都有义务接收,不能拒绝,若 ...

  2. 外卖派单模拟系统C语言代码,GitHub - Sndav/SuperDeliver: 外卖派单模拟系统大作业

    概要设计书 [TOC] 1.0 编码规范 变量名 变量名使用下划线命名方法 变量定义后,写上该变量的作用及其含义 变量不得使用i,j,k,a,b,c,包括循环变量 循环变了使用iter_i,iter_ ...

  3. 智能城市dqn算法交通信号灯调度_博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型...

    原标题:博客 | 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型 国际数据挖掘领域的顶级会议 KDD 2018 在伦敦举行,今年 KDD 吸引了全球范围内共 1480 篇论文投递,共 ...

  4. java实现手动派单,一种无分区外卖派单系统的回程单派单方法与流程

    本发明属于即时物流技术领域,具体涉及一种无分区外卖派单系统的回程单派单方法. 背景技术: 随着本地生活服务的发展,本地外卖的网络订单量也日渐增多,如何最快速度最高效率的进行配送,是每个外卖商家和外卖平 ...

  5. 滴滴 KDD 2018 论文详解:基于强化学习技术的智能派单模型

    国际数据挖掘领域的顶级会议 KDD 2018 在伦敦举行,今年 KDD 吸引了全球范围内共 1480 篇论文投递,共收录 293 篇,录取率不足 20%.其中滴滴共有四篇论文入选 KDD 2018,涵 ...

  6. RabbitMq实战——外卖派单通过补单系统实现分布式事务

    一.分布式事务 请参考:分布式事务-LCN_熟透的蜗牛的博客-CSDN博客 二.思路原理  当派单系统派单成功之后,订单系统报错,此时将会产生分布式事务的问题,派单数据生成,但此时订单数据异常事务回滚 ...

  7. 去中心化的滴滴打车派单模拟系统前端历程

    这里写自定义目录标题 欢迎使用Markdown编辑器 新的改变 功能快捷键 合理的创建标题,有助于目录的生成 如何改变文本的样式 插入链接与图片 如何插入一段漂亮的代码片 生成一个适合你的列表 创建一 ...

  8. 外卖匹配系统_外卖平台派单规则浅析

    由于笔者多年的电商.O2O相关后台订单模块的产品设计经历,一直对于各类高频.端到端业务的订单分发及派单规则有浓厚兴趣,本文作为学习目的将国内两大外卖平台的骑手派单规则进行简单的整理及浅析. 首先,我们 ...

  9. 外卖与打车派单逻辑谁更复杂

    之前我一直认为点外卖,平台分配一个骑手取餐送到我手里,和我在网约车平台发送一个出行需求,平台分配一个司机为我服务是一样的,或者说分单策略差异应该不大.但不能简单看到表象,分析了一下,还是看到了一些区别 ...

最新文章

  1. GAN在产业和学术届的价值!
  2. Android - Manifest 文件 详解
  3. 论文阅读:CNN-RNN: A Unified Framework for Multi-label Image Classification
  4. OpenCv中实现了三种立体匹配算法:
  5. linux用户ftp失败,vsftpd本地用户登录密码错误的解决方法
  6. android app 移植到pc,微软开发新应用把Android app“移植”到Win Phone
  7. 程序员面试金典 - 面试题 01.03. URL化(字符串)
  8. 2维FFT算法实现——基于GPU的基2快速二维傅里叶变换
  9. go语言及etcd环境搭建
  10. windows版redis安装教程
  11. 在win10pe中集成virtio驱动
  12. 《木乃伊3:龙帝之墓》清晰版无字幕BT下载
  13. oracle的odac dll,.NET2.0中施用最少的ODAC动态库文件连接Oracle数据库
  14. error: expected an identifier解决方法
  15. Bitly:构建月处理60亿点击的分布式系统(转载)
  16. and5.1PowerManagerService深入分析(三)updatePowerStateLocked函数
  17. Keras: 创建多个输入以及混合数据输入的神经网络模型
  18. 刨根问底:Kafka 到底会不会丢数据?
  19. 肺实质分割matlab实现
  20. Lua--棋牌游戏开发(概念性设计一)

热门文章

  1. Required String parameter name is not present
  2. JavaWeb page指令
  3. 生。老。病。死。求不得,爱别离,怨憎会,五阴炽盛。怜众生无知,取苦为乐,饮鸩止渴。...
  4. 2022.1版本idea 安装教程
  5. 32.768kHZ时钟晶振的用途与特点
  6. Dart 字符串拼接
  7. 机器学习算法之SVM(二)概述
  8. 什么是分布式协同技术
  9. css样式中的vw什么意思,css中vw指的是什么单位
  10. 污水治理智能化管理解决方案