外卖派单模拟系统

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.  算法设计

(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);

函数功能:分配订单给一个骑手,计算人到房子,房子到房子的最短路径所需最短时间并进行比较,将路线添加至可能的路径中最终将最短路径添加至最终路径

 

具体实现细节就不说了。。。

 

posted @ 2020-04-22 19:05  简单记录一下咯  阅读(1458)  评论(0编辑  收藏  举报