电梯调度算法

编程之美------电梯调度算法
2011-06-02 15:24

一座大厦一共有6部电梯。在高峰时间,每层都有人上下,电梯在每层都停。

实习生小飞常常会被每层都停的电梯弄得很不耐烦,于是他提出了这样的一个办法:

由于楼层并不太高,那么在繁忙的上下班时间,每次电梯从一层往上走时,我们只允许电梯停在其中的一层。所有乘客都从一楼上电梯,到达某楼层后,电梯停下来,所有乘客再从这里爬到自己的目的层。在一楼上电梯的时候,每个乘客选择自己的目的层,电梯则自动计算出应停的楼层。

问:电梯停在哪一层,能够保证这次乘坐的电梯所有乘客爬楼梯的层数之和最少。

首先,有两个因素会影响到最后的结果:

乘客的数目和要停的目的楼层

假设楼层总共有N层,电梯停在第x层,要去第i层的乘客数目总数为Tot【i】,这样,总数就是 { Tot [ i ] * | i - x |};

我们的任务就是找到这样的一个最小值

枚举的代码:

void solve(int & nTargetFloor, int & nMinFloor){
int nFloor;
nTargetFloor=-1;
for(int i=1;i<=N;i++)
{

nFloor=0;

for(int j=1;j<i;j++)

nFloor+=nPerson[j]*(i-j);

for(int j=i+1;j<=N;j++)

nFloor+=nPerson[j]*(j-i);

if(nTargetFloor == -1 || nMinFloor > nFloor)

{

nMinFloor=nFloor;

nTargetFloor=i;

}

}

}

显然这个解法可以进一步优化:

假设电梯停在第i层,显然我们可以计算出所有乘客总共要爬的层数Y。如果有N1个乘客目的楼层在i层以下,有N2个乘客在i层,还有N3个乘客在第i层以上。这个时候,如果电梯改停在第i-1层,所有目的地在i层以上的乘客都要多爬一层,总共需要N2+N3层,而所有目的地在第i-1层以下的乘客都可以少爬一层,总共少爬N1层。所以乘客总共需要爬Y-(N1-N2-N3)

反之,如果电梯停在i+1层,那么乘客总共需要爬Y+(N1+N2-N3)层。

由此可知:

当N1>N2+N3时,电梯停在i-1层好,乘客少走N1-N2-N3层

当N1+N2<N3时,电梯停在i+1层好

其他情况停在i层好

这样我们可以从第一层开始考虑

代码如下:

void solve(int & nTargetFloor,int & nMinFloor)
{
   int N1,N2,N3,i;
   nTargetFloor=1;
   nMinFloor=0;
   for(N1=0,N2=nPerson[1],N3=0,i=2;  i<=N;i++)
   {
        N3+=nPerson[i];
        nMinFloor+=nPerson[i]*(i-1);
   }
   for(i=2;i<=N;i++)
   {
       if(N1+N2<N3)
       {
           nTargetFloor=i;
           nMinFloor+=(N1+N2-N3);
           N1+=N2;
           N2=nPerson[i];
           N3-=nPerson[i];
       }
       else
         break;
    }
}


  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
电梯调度算法是指在多层楼房中,通过电梯的运行,使乘客尽快到达目的地的一种算法。常用的电梯调度算法有 FCFS(先来先服务)、SSTF(最短寻找时间优先)、SCAN(扫描)、CSCAN(循环扫描)等。 以下是一个简单的电梯调度算法的C++代码示例,其中使用了SCAN算法: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int current_floor = 1; // 当前电梯所在楼层 int direction = 1; // 1表示上行,-1表示下行 vector<int> requests; // 请求列表 // 模拟电梯接受请求的过程 requests.push_back(5); requests.push_back(3); requests.push_back(7); requests.push_back(2); requests.push_back(6); // 对请求进行排序,按照电梯所在楼层的方向进行排序 sort(requests.begin(), requests.end(), [current_floor, direction](int a, int b) { return (direction == 1) ? (a < b) : (a > b); }); // 执行电梯调度 while (!requests.empty()) { int target_floor = requests.back(); // 获取最后一个请求 requests.pop_back(); // 弹出最后一个请求 // 判断电梯运行方向并输出运行轨迹 if (target_floor > current_floor) { while (current_floor < target_floor) { cout << "电梯上行到达第" << current_floor << "层" << endl; current_floor++; } } else { while (current_floor > target_floor) { cout << "电梯下行到达第" << current_floor << "层" << endl; current_floor--; } } cout << "电梯到达第" << current_floor << "层,开门" << endl; } cout << "电梯调度完成" << endl; return 0; } ``` 该示例代码只是一个简单的电梯调度算法的实现,实际应用中需要考虑更多的因素,如电梯负载、优先级、故障处理等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值