电梯调度有很多种模式,参见http://www.cnblogs.com/jianyungsun/archive/2011/03/16/1986439.html

1.1先来先服务算法(FCFS)

先来先服务(FCFS-First Come First Serve)算法,是一种随即服务算法,它不仅仅没有对寻找楼层进行优化,也没有实时性的特征,它是一种最简单的电梯调度算法。它根据乘客请求乘坐电梯的先后次序进行调度。此算法的优点是公平、简单,且每个乘客的请求都能依次地得到处理,不会出现某一乘客的请求长期得不到满足的情况[12]。这种方法在载荷较轻松的环境下,性能尚可接受,但是在载荷较大的情况下,这种算法的性能就会严重下降,甚至恶化。人们之所以研究这种在载荷较大的情况下几乎不可用的算法,有两个原因:

(1)任何调度算法在请求队列长度为1时,请求速率极低或相邻请求的间隔为无穷大时使用先来先服务算法既对调度效率不会产生影响,而且实现这种算法极其简单。

(2)先来先服务算法可以作为衡量其他算法的标准。

1.2最短寻找楼层时间优先算法(SSTF)

最短寻找楼层时间优先(SSTF-Shortest Seek Time First) [14]算法,它注重电梯寻找楼层的优化。最短寻找楼层时间优先算法选择下一个服务对象的原则是最短寻找楼层的时间。这样请求队列中距当前能够最先到达的楼层的请求信号就是下一个服务对象。在重载荷的情况下,最短寻找楼层时间优先算法的平均响应时间较短,但响应时间的方差较大,原因是队列中的某些请求可能长时间得不到响应,出现所谓的“饿死”现象。

1.3扫描算法(SCAN)

扫描算法(SCAN)是一种按照楼层顺序依次服务请求,它让电梯在最底层和最顶层之间连续往返运行,在运行过程中响应处在于电梯运行方向相同的各楼层上的请求。它进行寻找楼层的优化,效率比较高,但它是一个非实时算法。扫描算法较好地解决了电梯移动的问题,在这个算法中,每个电梯响应乘客请求使乘客获得服务的次序是由其发出请求的乘客的位置与当前电梯位置之间的距离来决定的,所有的与电梯运行方向相同的乘客的请求在一次电向上运行或向下运行的过程中完成,免去了电梯频繁的来回移动[2]。

扫描算法的平均响应时间比最短寻找楼层时间优先算法长,但是响应时间方差比最短寻找楼层时间优先算法小,从统计学角度来讲,扫描算法要比最短寻找楼层时间优先算法稳定。

1.4 LOOK 算法

LOOK算法[18]是扫描算法的一种改进。对LOOK算法而言,电梯同样在最底层和最顶层之间运行。但当LOOK算法发现电梯所移动的方向上不再有请求时立即改变运行方向,而扫描算法则需要移动到最底层或者最顶层时才改变运行方向。

1.5 SAFT 算法

SATF(Shortest Access Time First)[15,19]算法与SSTF算法的思想类似,唯一的区别就是SATF算法将SSTF算法中的寻找楼层时间改成了访问时间。这是因为电梯技术发展到今天,寻找楼层的时间已经有了很大地改进,但是电梯的运行当中等待乘客上梯时间却不是人为可以控制。SATF算法考虑到了电梯运行过程中乘客上梯时间的影响。

上面是常见的电梯调度模式,这里我们写的是第二种模式,这是一个简化的版本。

运行原理:电梯会将目前所有的请求中最高的楼层请求查出来,通过与电梯所在楼层进行对比,确定电梯的运行方向,是向上运行(方法getRequest1)或者是向下运行(方法getRequest),同时每到一层都会执行下面的操作:

1.这层是否有人请求,如果有,那么要求设置目的层。

2.确定这层是某个请求的目的层,如果是,就将相应的请求归零。

缺陷:将请求单纯简化为层数,其实实际中还会出现请求的方向,这个下次再解决,还有其他的一些。

代码如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace 电梯调度算法
{ struct elevatorRequest
{
public int start;
public int end;
public int rFlag;
}
class elevator
{
public static int count = ;
public static int now = ;
elevatorRequest[] sRequest = new elevatorRequest[];
public static int runNow = ;
public void run()
{
while (count > )
{
getRequest();
getRequest1();
}
}
public void setDirect()
{
int max = ;
int ns = count;
if (ns != )
{
max = sRequest[].start; int i = ;
while (ns > )
{
if (max < sRequest[i].end || max < sRequest[i].start)
{
max = sRequest[i].end > sRequest[i].start ? sRequest[i].end : sRequest[i].start;
}
}
if(max>runNow)
{
getRequest();
}
else
{
getRequest1();
}
}
}
public void getRequest1()
{
if (count > )
{ Console.WriteLine("电梯开始方向运行");
for (int i = ; i >= ; i--)
{
Console.WriteLine("-----" + i + "----");
int j = isEnd(i);
if (j != )
{
Console.WriteLine("完成了从" + sRequest[j].start + "层到" + sRequest[j].end + "的请求");
runNow = i;
count--;
sRequest[j].start = ;
sRequest[j].end = ;
}
}
if (count == )
{
Console.WriteLine("请求执行完毕,电梯停止运行");
Console.WriteLine("电梯停留在" + runNow + "层");
}
}
else
{
Console.WriteLine("请求执行完毕,电梯停止运行");
Console.WriteLine("电梯停留在" + runNow + "层");
}
}
public void getRequest()
{
if (count > )
{
//int next = getNextFloor();
for (int i = ; i < ; i++)
{
Console.WriteLine("-----" + i + "----");
if (sRequest[i].start != )
{
Console.WriteLine("响应了" + i + "层的请求");
Console.WriteLine("请输入要去的楼层");
int e;
string str = Console.ReadLine();
e = Convert.ToInt32(str);
setRequest(i, e);
}
int j = isEnd(i);
if (j != )
{
Console.WriteLine("完成了从" + sRequest[j].start + "层到" + sRequest[j].end + "的请求");
runNow = i;
count--;
sRequest[j].start = ;
sRequest[j].end = ;
}
}
if (count == )
{
Console.WriteLine("请求执行完毕,电梯停止运行");
Console.WriteLine("电梯停留在" + runNow + "层");
}
}
else
{
Console.WriteLine("请求执行完毕,电梯停止运行");
Console.WriteLine("电梯停留在" + runNow + "层");
}
}
public int isEnd(int i)
{
for (int j = ; j < ; j++)
{
if (i == sRequest[j].end)
{
return j;
}
}
return ;
}
public int getNextFloor()
{
int min = sRequest[].start - runNow > ? (sRequest[].start - runNow) : (runNow - sRequest[].start);
for (int i = ; i < now; i++)
{
if (min > sRequest[i].start - runNow)
{
min = sRequest[i].start - runNow;
}
}
return min + runNow;
}
public void setRequest(int i, int e)
{
sRequest[i].end = e;
if (i > e)
{
sRequest[i].rFlag = ;
}
else
{
sRequest[i].rFlag = ;
}
}
public void setRequest(int s)
{
count++;
sRequest[s].start = s;
}
public void show()
{
for (int i = ; i < ; i++)
{
if (sRequest[i].end != )
{
string s = "";
if (sRequest[i].rFlag > )
{
s = "上";
}
else
{
s = "下";
}
Console.WriteLine("我要从" + sRequest[i].start + "层到" + sRequest[i].end + "层,方向向" + s);
}
}
}
}
class Program
{
static void Main(string[] args)
{
elevator es = new elevator();
es.setRequest();
es.setRequest();
es.setRequest();
es.run();
es.show();
es.setRequest();
es.setRequest();
es.run();
Console.ReadKey();
}
}
}

运行结果:

自己动手C#模拟电梯的运行V1.0的更多相关文章

  1. WPF界面设计技巧(7)—模拟电梯升降的缓动动画

    原文:WPF界面设计技巧(7)-模拟电梯升降的缓动动画 如同Flash一样,WPF的亮点之一也在于其擅于表现平滑的动画效果,但以移动动画来说,仅凭简单的起始位置.目标位置,所产生的动画仍会非常生硬,这 ...

  2. 自己动手写计算器v1.0

    今天突发奇想,想着看了还几个设计模式了,倒不如写点东西来实践它们.发现计算器这种就比较合适,打算随着设计模式的学习,会对计算器不断的做改进. 包括功能的增加和算法的改进.初学者难免犯错,希望大家不吝指 ...

  3. 电梯V1.0

    电梯V1.0 GitHub仓库地址 Problem 一栋3层的大楼(楼层编号0-2),设有一台无限载重的电梯,初始时电梯停在0层.电梯移动1层的耗时为1,在某一层停靠的耗时为1(时间初始为0).电梯不 ...

  4. Servlet+AJAX实现的模拟电梯调度

    需求产生: 大三下学期天天在学校的同一栋教学楼上课,每天要等四次电梯,有次等电梯无聊了,就想到电梯的运行逻辑该如何用程序来表达呢? 问题描述: 大学的那栋楼有21层,不过在页面中画21层有点密,所以只 ...

  5. JavaScript | 模拟文件拖选框样式 v1.0

    ————————————————————————————————————————————————————————— 文件拖选v1.0 图片不清楚时请右键点击"在新链接中打开图片" ...

  6. 最新:百度春节抢百万游戏--汤圆向前冲--辅助工具v1.0.0.2

    https://www.cnblogs.com/Charltsing/p/ADBJumpTY.html 联系QQ:564955427 本程序为Windows版,不要在手机里面打开. 汤圆向前冲辅助工具 ...

  7. 三、主流区块链技术特点及Hyperledger Fabric V1.0版本特点

    一.Hyperledger fabric V1.0 架构 1.逻辑架构: 2.区块链网络 3.运行时架构 二.架构总结 1.架构要点 分拆Peer的功能,将Blockchain的数据维护和共识服务进行 ...

  8. Python WSGI v1.0 中文版(转)

    add by zhj: WSGI全称Web Server Gateway Interface,即Web网关接口.其实它并不是OSI七层协议中的协议,它就是一个接口而已,即函数,而WSGI规定了该接口的 ...

  9. 003-主流区块链技术特点及Hyperledger Fabric V1.0版本特点

    一.Hyperledger fabric V1.0 架构 1.逻辑架构: 2.区块链网络 3.运行时架构 二.架构总结 1.架构要点 分拆Peer的功能,将Blockchain的数据维护和共识服务进行 ...

随机推荐

  1. iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

    -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...

  2. Redis系列(二)-Hredis客户端设计及开源

    接上篇c#实现redis客户端(一),重新整理些了下. 阅读目录: 项目说明 Hredis设计图 单元测试场景 总结 项目说明 背景:因为有地方要用,而又没找到对sentinel良好支持的Net客户端 ...

  3. 企业IT管理员IE11升级指南【1】—— Internet Explorer 11增强保护模式 (EPM) 介绍

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...

  4. Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(2)

    Modern OpenGL用Shader拾取VBO内单一图元的思路和实现(2) 上一篇里介绍了Color-Coded Picking的思路和最基本的实现.在处理GL_POINTS时已经没有问题,但是处 ...

  5. Outlook HTML渲染引擎

    OutLook始终不离不弃 是不是很讨厌为Email代码兼容Outlook? 太遗憾了!虽然光都有尽头,但Outlook始终存在. 为了应付Email的怪癖,我们花了很多时间测试,确保我们搞定了所有O ...

  6. npm不是以管理身份运行遇到的问题

    环境:win10+npm3.10.5 问题:在npm install lodash时,出现下列错误("npm-debug.log"文件内容) 0 info it worked if ...

  7. Objective-C 装饰模式--简单介绍和使用

    装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰来包裹真实的对象. 比如游戏机有一个GamePad类, 现在要增加一个作弊功能(例如100 ...

  8. iOS开发-闪退问题-解决之前上架的 App 在 iOS 9 会闪退问题

    最新更新:(2015.10.02) 开发环境: Delphi 10 Seattle OS X El Capitan v10.11 需使用下列 HotfixID: 30398, PAServer Hot ...

  9. Android开发-之数据的存储方式一

    在Android中,数据的存储分为两种方式: 1.直接以文件的形式存储在目录中 2.以json格式存储在数据库中 将数据以文件的存储又分为两种方式: 1.生成.txt文件 2.生成xml文件 那么今天 ...

  10. SVM算法

    本文主要介绍支持向量机理论推导及其工程应用. 1 基本介绍 支持向量机算法是一个有效的分类算法,可用于分类.回归等任务,在传统的机器学习任务中,通过人工构造.选择特征,然后使用支持向量机作为训练器,可 ...