// 电梯优化算法.cpp: 定义控制台应用程序的入口点。
//
#include <stdlib.h>
#include <time.h>
#include "stdio.h"
//首先来讲讲不进行优化的时候(一个电梯)怎么控制
#define F 30 //楼层数
//我们需要知道哪一层楼有人叫电梯,可以定义一个数组,用两位二进制内存即可,
struct Call
{
bool up;
bool down;
}call[F];
struct Elevator
{
bool director[F]; //每一位分别表示电梯内乘客按下需要到达的楼层(bool型数组可能无法使用,)
unsigned short now; //电梯当前所处楼层
bool direction; //电梯当前运行方向 1表示上升
short weight; //当前电梯载重情况,由外部传感器读取转化
//在本算法中将载重分为012345五个等级,0为空载
unsigned short next; //电梯应当去往的楼层
}elv1,elv2; //俩电梯
//简易函数实现scan型路过拉人算法
//返回目的地楼层数,电梯需要转向时返回0,
short Scan(struct Elevator elv, struct Call call[])
{
if (elv.direction) //如果在上升,扫描当前楼层以上的请求
{
if (elv.now < F-1) //不在顶层
{
short n = elv.now;
for (short i = n + 1; i < F; i++)
{
if (elv.director[i]) ///读电梯内部数据发现这层有乘客要下
{
n = i;
break;
}
if (call[i].up) ///读楼层数据发现这层有乘客要上电梯
{
n = i;
break;
}
}
if (n == elv.now) //上面没人了
return 0;
else
{
elv.next = n;
return n+1;
}
}
else
return 0;
}
else //电梯下降
{
if (elv.now >0) //不在底层
{
short n = elv.now;
for (short i = n -1; i >=0; i--)
{
if (elv.director[i]) ///读电梯内部数据发现这层有乘客要下
{
n = i;
break;
}
if (call[i].down) ///读楼层数据发现这层有乘客要上电梯
{
n = i;
break;
}
}
if (n == elv.now) //下面没人了
return 0;
else
{
elv.next = n;
return n+1;
}
}
else
return 0;
}
}
void move(short dir)
{
//驱动过程略
printf("电梯已经到达第%d层\n",dir+1);
}
int main()
{
//we support that we have got all information we need,即认为call和elv 中数据已经由传感器获得。
while (1)
{
//update data here(更新传感器数据)
short tem = Scan(elv1, call);
if (tem)//电梯需要运行
{
move(elv1.next);//驱动到达目标层
//下面做数据消除,这层已经到过了
elv1.now = elv1.next;
elv1.director[elv1.next] = 0;
if (elv1.direction)
call[elv1.next].up = 0;
else
call[elv1.next].down = 0;
}
else//电梯反向(如果两次以上反向可以认为已经无人乘坐)
elv1.direction = !(elv1.direction);
//这里可以让指示灯闪烁一次
}
return 0;
}
后续更新时间优化代码
电梯调度算法(后续更新)
最新推荐文章于 2024-06-08 17:02:21 发布