外卖派单模拟系统
1.任务:
制定外卖订单接收和餐食快递的调度策略.有一笔启动资金,可以招募外卖骑手送餐,来赚取快递费.但本区域的订单都有义务接收,不能拒绝,若拒单政府就会吊销你的营业执照;但如果接收多个订单后,因为骑手来不及送,导致某个订单超时未送达,客户会投诉,你会被罚款.
2.模块设计:
3.结构体定义:
A. struct order订单结构体
typedef struct order {
int num;
int time;
int start_x, start_y;
int end_x, end_y;
struct order* nextptr;
}
B. struct deliver 外卖员结构体
typedef struct deliver {
int deliver_x;
int deliver_y;
int neighbour[2][3];
/*是否停靠,以及停靠坐标*/
int takeOrders;
/*手里接单数*/
int cheating;
/*是否在作弊*/
int incapable;
/*60s内不能送到*/
int usetime[2];
/*真正路线走完用时,以当前状态为起始时间*/
int largetime;
/*花最长时间送完的单对应的时间*/
int getmoney[2];
/*手里单完成挣的钱,第二个是备用路线走完挣的钱*/
int stop;
/*作弊到达下一地点后停下来*/
int trueways[50][6];
/*真路线,x,y,0/1/2(0代表起点,1代表终点,2代表超时),点出现的时间,用来排序的编号(起点对终点,起点为奇数)订单编号(文件读取的)*/
int mayways[50][6];
/*备用路线*/
int waynum[4];
/*真路线为骑手-->trueways[0]-->trueways[1]...-->trueways[waynum[0]],waynum[1]记录单编号,备用路线用后2个记录,排除(0,0)虚假*/
}
4.算法设计:
- 1. 算法设计
(1)模块说明:输入输出
包含函数名:
A. void output(Deliver delivers[10], FILE* ftpout, int G_time, int G_money, int G_orders, int G_finished, int G_overorder, int totaldeliver);
B. void input(Order_ptr* headptr, FILE* ftp, int * lastorder);
函数功能:从文件中读取订单存储,输出文件以及字符动画
(2)模块说明:steps 函数功能:每一个骑手都走一步,随着时间更新状态和路线信息
包含函数名:
C. void everysteps(Deliver delivers[10], Order_ptr* nextOrder, int cheat[20], Order_ptr cheatOrders[20], int * totalMoney, int *finished, int * overOrders, int totaldelivers, int totalcheat, int finishOrders[10], int overorder[10])
循环实现对每个骑手的判断,分情况调用子函数
D.void steps(Deliver_ptr man, Order_ptr nextOrder, int *money, int *finished, int *over, int finishOrders[10], int overorder[10], int totalTime);
E.void changestate(Deliver_ptr man, int * money, int *finished, int *over, int finishOrders[10], int overorder[10])
当骑手到达一个目标点时,骑手结构体里路线,接单数,是否作弊,邻居等元素的改变,以及总钱数,单数的改变。
当到达一个点时,判断该点是餐/客来改变总钱数和单数,记录此时的停靠的坐标,同时更新骑手路线,将目标点后移。如果骑手无单且没正在坐弊,读取(排除以及有作弊对象的单)下一单进行作弊
(3)模块说明:预知未来规划路线,判断是否能有骑手提前到达,继续判断选择谁去作弊(中途接单),完成作弊。
包含函数名:
F. int cheatchoose(Deliver delivers[10], Order_ptr new, int totalDeliver, int totalTime);
G. int canCheat(Deliver delivers[10], Order_ptr currentptr, int totaldelivers);
H. void finishcheat(Deliver delivers[10], Order_ptr* nextOrder, int cheat[20], Order_ptr cheatOrders[20], int *totalcheat, int totalTime, int totalDeliver);
(4)模块说明:派单
包含函数名:
I. void new_deliver(Deliver_ptr newman);
J. int assignorder(Deliver delivers[10], Order_ptr new, int * orders, int * totalDeliver, Order_ptr cheatOrder[10], int cheat[10], int * totalcheat);
K. void assignoneman(Deliver_ptr man, Order_ptr new, int* orders);
L. int getShortest(Deliver_ptr man, Order_ptr new);
M. void initMayway(Deliver_ptr deliver);
N. int Short_two(int start_x, int start_y, int end_x, int end_y);
O. int Shortmen_house(int men_x, int men_y, int end_x, int end_y);
P. void cleanoneCheat(int cheat[10], Order_ptr cheatOrders[10], int k, int *totalcheat);
Q. int getTime(Deliver_ptr man, int timeLog[20], int a[20], int totalTime, int num);
R. void timeRecorder(Deliver_ptr man, Order_ptr new, int timeLog[20], int a[20]);
S. void randnums(int a[20], Deliver_ptr man, int *size);
T. void addmayOrder(Deliver_ptr man, Order_ptr new);
U. void initMayway(Deliver_ptr deliver);
函数功能:分配订单给一个骑手,计算人到房子,房子到房子的最短路径所需最短时间并进行比较,将路线添加至可能的路径中最终将最短路径添加至最终路径
具体实现细节就不说了。。。