电梯调度算法(后续更新)

// 电梯优化算法.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;
}




后续更新时间优化代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值