当前位置:首页 » 操作系统 » 坐电梯算法

坐电梯算法

发布时间: 2022-02-14 13:14:40

java模拟实现两部电梯同时工作的高效算法

1. 各电梯控制:
a. 实现一个方法,返回本电梯到请求楼层上、下的时间(或者简单点的,层数);
b. 任务接受:接受用户楼层上、下请求任务

2. 主控部分:
a. 当用户按下上、下请求时,通过调用两个电梯的上面所说的服务,进行比较决断最优时间电梯;
b. 给最最优电梯发送任务;
3. 主控与各电梯控制之间的通讯可以通过多种方式实现;

⑵ 电梯调度算法

(1)电梯调度算法的处理次序为:
5
8
1
4
3
6
2
7
(2)最短寻找时间优先算法的处理次序为:
5
8
6
2
7
1
4
3

⑶ 算法题 关于电梯的

如果到了顶层,是不是还要考虑别人往下爬?

记得采纳啊

⑷ 操作系统磁盘调度的电梯算法是怎么回事阿思想是什么比如磁道号从41开始,磁盘请求序列为:20

就是读取时按找当前的移动方向读取下一个,到顶后再反着读,就跟坐电梯一样,要不先上,要不先下。
下:41 20 12 4 上: 44 76 80
合起来就是: 41 20 12 4 44 76 80
这样的话磁头的总移动距离会相对减少

⑸ 求关于 多部电梯调度算法研究

这里是我 一些 想法 LZ可以看看 在这里 主要告诉你的是 C程序设计里面很重要的一个思想那就是 增量开发
首先设计 一个MAIN函数 确定要调用的函数 在函数里面 尽量使用指针变量,这是第一块
第二快: 电梯的初始化
第三快: RUNNING电梯的运行
第四快: 电梯的移动
第五快: 上和下
第六快: 用户的要求 也就是说 电梯到底是上 还是下的设计
第七快 延迟程序 也就说 等待的时间
第八块:STOP
按照这个思路的话,代码加起来有100多行的样子吧
还有就是 LZ在采用这个思路的时候 一定要对函数的运用 很上手啊
要不在调试的时候很容易出BUG的!
希望能帮到你!

⑹ 大神们看过来啊:电梯调度算法模拟。。。用c语言编写。紧急!!!

⑺ 请问谁有C语言的电梯模拟算法

#include <stdio.h>
#include <stdlib.h>
#include <winsock.h>
#include <winbase.h>
#include <string.h>
#include "egg.h"
#include "elevator.h"

#define START 0//定义初始状态
#define UP 1//上行初始
#define DOWN 2//下行初始
#define PAUSE 3
#define N 100//记录数组的容量

void getInput(void);//
void getInput0(void);//

void Status_trans(void);//显示当前的状态
void control(void);//控制主要的电梯过程
void control0(void);//在暂停后的控制
void time_count(void);
void Uper(void); //上行
void Downer(void); //下行

int Call[N]={0};
int Callup[10]={0}; //存放向上呼叫的整型数组
int Callin[10]={0}; //存放内部呼叫的整型数组
int Calldown[10]={0};//存放向下呼叫的整型数组
int time=0,state=0,prestate=0,flag=1,x=0;
int aimLayer=0,currentLayer=1;
float cl1=0.0,cl2=0.0;

main()
{
int service;
elevator();

system("color 3f");

printf("EVA 电梯竭诚为您服务,祝乘坐愉快\n");
printf("请选择服务策略(1为先来先服务,2为顺便服务):\n");
scanf("%d",&service);
if(service==1) {
DWORD ThreadID1 = 1;
HANDLE hRead1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)getInput0,NULL,0,&ThreadID1);
}
else {
DWORD ThreadID2 = 1;
HANDLE hRead2 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)getInput,NULL,0,&ThreadID2);
}
while (1){
if(service==1)
control0();
else
control();
Status_trans(); /*确定电梯此刻的状态,包括运行方向、所在楼层等*/

}

system("pause");
return 0;
}

void Status_trans(void)//yang
{
int i;

switch (state) {
case START:
if(aimLayer>currentLayer)
state=UP;
if(aimLayer==currentLayer)
state=PAUSE,prestate=START;
if(aimLayer==0)
state=START;
break;
case UP:
flag=1;

Uper();
currentLayer++;
drawCurrentLayer1(currentLayer);
drawCurrentLayer2(currentLayer);
printf("当前电梯楼层 %d\n", currentLayer);
if(currentLayer==aimLayer) {
state=PAUSE,x=1,prestate=UP;
printf("当前电梯楼层 %d\n", currentLayer);
}
if(currentLayer<aimLayer)
state=UP,flag=1;
if(currentLayer>aimLayer)
state=DOWN,flag=-1;
break;
case DOWN:
flag=-1;

Downer();
currentLayer--;//?
drawCurrentLayer1(currentLayer);
drawCurrentLayer2(currentLayer);
printf("当前电梯楼层 %d\n", currentLayer);
if(currentLayer==aimLayer) {
state=PAUSE,x=1,prestate=DOWN;
printf("当前电梯楼层 %d\n", currentLayer);
}
if(currentLayer<aimLayer)
state=UP,flag=1;
if(currentLayer>aimLayer)
state=DOWN,flag=-1;//flag?
break;
case PAUSE:
drawCurrentLayer1(currentLayer);
drawCurrentLayer2(currentLayer);
for(i=1;i<=4;i++)
WaitFor(100);
if(aimLayer<currentLayer)
state=DOWN;
if(aimLayer>currentLayer)
state=UP;
if(aimLayer==0)
state=PAUSE,prestate=PAUSE;
break;
}
}

void control(void)
{
int i,mark=0,m=0;

if(flag==1) {
if(state==PAUSE && prestate!=PAUSE) {//上行中确定目标楼层
Callin[currentLayer]=Callup[currentLayer]=0;
for(i=currentLayer+1;i<=9;i++)
if(Callup[i]==1 || Callin[i]==1 || Calldown[i]==1)
m=1;
if(m!=1)//无上行需求直接将下行此楼层处理
Calldown[currentLayer]=0;
}
for(i=currentLayer;i<=9;i++)
if(Callup[i]==1 || Callin[i]==1) {
mark=i;
aimLayer=i;
break;
}//有上行需求 ,目标楼层被确定
if(mark==0)//无上行需求
for(i=9;i>=1;i--)
if(Calldown[i]==1 || Callin[i]==1) {
aimLayer=i;
mark=i;
break;
}//确定下行目标楼层
if(mark==0)
for(i=1;i<=8;i++)
if(Callup[i]==1) {
aimLayer=i;
mark=i;
break;
}
if(mark==0)
aimLayer=0;
}//无目标楼层
else if(flag==-1) {
if(state==PAUSE && prestate!=PAUSE) {//电梯运行中
Calldown[currentLayer]=Callin[currentLayer]=0;//此层已处理过
for(i=currentLayer-1;i>=1;i--)
if(Callup[i]==1 || Callin[i]==1 || Calldown[i]==1)
m=1;
if(m!=1)
Callup[currentLayer]=0;//无目标楼层暂时停靠 m??
}
for(i=currentLayer-1;i>=1;i--)
if(Calldown[i]==1 || Callin[i]==1) {
mark=i;
aimLayer=i;
break;
}//确定下行目标楼层

//???为何要向上运行开始呢?

if(mark==0) //顺便无要求,开始新的一楼起的上升需求扫描
for(i=1;i<=9;i++)
if(Callup[i]==1 || Callin[i]==1) {
aimLayer=i;
mark=i;
break;
}
if(mark==0)
for(i=9;i>=2;i--)
if(Calldown[i]==1) {
aimLayer=i;
mark=i;
break;
}
if(mark==0)
aimLayer=0;
}
}

void control0(void)//yang
{
int i;

for(i=0;i<=N-1;i++) {
if(Call[i]!=0) {
aimLayer=Call[i];
if(state==PAUSE && prestate!=PAUSE)
Call[i]=0;
break;
}
}
}

void getInput(void)
{
char ch;

while(1){
ch=getchar();
switch(ch) {

case'I':
Callup[1]=1;
break;
case'U':
Callup[2]=1;
break;
case'Y':
Callup[3]=1;
break;
case'T':
Callup[4]=1;
break;
case'R':
Callup[5]=1;
break;
case'E':
Callup[6]=1;
break;
case'W':
Callup[7]=1;
break;
case'Q':
Callup[8]=1;
break;

case'K':
Calldown[2]=1;
break;
case'J':
Calldown[3]=1;
break;
case'H':
Calldown[4]=1;
break;
case'G':
Calldown[5]=1;
break;
case'F':
Calldown[6]=1;
break;
case'D':
Calldown[7]=1;
break;
case'S':
Calldown[8]=1;
break;
case'A':
Calldown[9]=1;
break;

case '1':
Callin[1]=1;
break;
case '2':
Callin[2]=1;
break;
case '3':
Callin[3]=1;
break;
case '4':
Callin[4]=1;
break;
case '5':
Callin[5]=1;
break;
case '6':
Callin[6]=1;
break;
case '7':
Callin[7]=1;
break;
case '8':
Callin[8]=1;
break;
case '9':
Callin[9]=1;
break;
}
fflush(stdin);//使回车不被读取
}
}

void getInput0(void)//yangnan
{
int i=0;
char ch;

while(1){
ch=getchar();
switch(ch) {
case'I':
Call[i]=1;
break;
case'U':
Call[i]=2;
break;
case'Y':
Call[i]=3;
break;
case'T':
Call[i]=4;
break;
case'R':
Call[i]=5;
break;
case'E':
Call[i]=6;
break;
case'W':
Call[i]=7;
break;
case'Q':
Call[i]=8;
break;

case'K':
Call[i]=2;
break;
case'J':
Call[i]=3;
break;
case'H':
Call[i]=4;
break;
case'G':
Call[i]=5;
break;
case'F':
Call[i]=6;
break;
case'D':
Call[i]=7;
break;
case'S':
Call[i]=8;
break;
case'A':
Call[i]=9;
break;

case '1':
Call[i]=1;
break;
case '2':
Call[i]=2;
break;
case '3':
Call[i]=3;
break;
case '4':
Call[i]=4;
break;
case '5':
Call[i]=5;
break;
case '6':
Call[i]=6;
break;
case '7':
Call[i]=7;
break;
case '8':
Call[i]=8;
break;
case '9':
Call[i]=9;
break;
}
i++;
fflush(stdin);//使回车不被读取
}
}

void Uper(void)
{
int step;
for(step=1;step<=20;step++){
WaitFor(50);/*等待50毫秒*/
move(0.075);
}
}
void Downer(void)
{
int step;
for(step=1;step<=20;step++){
WaitFor(50);/*等待50毫秒*/
move(-0.075);
}
}

但是这个算法可能会有点小问题,你研究一下看看,多多少少有帮助的

⑻ 求两部电梯5层楼的C算法

4544545

⑼ 电梯从一楼到五楼需要20分钟,假如速度不变一直到10楼需要多少分钟 并说出其详细算法.

一楼到五楼要爬4层楼梯 爬1层楼梯20/4=5分钟 一楼到10楼要爬9层楼梯 9*5=45分钟

⑽ 如何将各种算法应用到实际的电梯调度中

说明 假设大厦有31层楼.电梯每经过1层(不论上下行)的时间是4秒.也就是说,电梯从1楼到31楼且中间不停则需要(31-1)*4=120秒.电梯每次需要停10秒,因此,如果电梯每层都停一次,就需要30*4+29*10=410秒.与此同时,员工步行一层楼(不论上下行)需要20秒,从1楼到31楼就需要30*20=600秒.明显,这个主意不好.因此,很多员工依赖电梯前往他们的办公室.现在我们需要设计一个方案,这个方案的设计目标是让最后一个到达办公室的员工花费最短的时间(也就是说,他并不保证每一位员工都能最快到达自己办公室).比如,如果员工想到达4,5和10层,则电梯的运行方案是在4和10层停止.因为电梯在第12秒到达4层,停止10秒,则电梯到达10层需要3*4+10+6*4=46秒.按此计划,住在4层的员工需要12秒,5层的员工需要12+20=32秒,10层的员工需要46秒.因此,最后到达办公室的员工需要46秒.对于大家来说,这是个不错的方案.

实现 下面就详细说一说我实现的具体方式,虽然花了我近2天的时间,但是其实并不是很复杂,这里我本着抛砖引玉的原则,下面就一起来看看吧:

我们将定义一个名叫Case的class用来存储一些要测试的数据,然后再定义一个叫CaseUtil的class用来实现我们的方案。

首先我说一下具体得思路:这里我只考虑从下到上的方案(从上到下其实是一样的,具体自己想吧)。举个例子,假设当前的楼层是【29 30 31】.3个。那么我们该如何做呢?

首先,不管怎么说,假设最后一层即31的到达时间为 (31-1)* 4 + (stopNums-1)*10 说明一下,这里为了简单起见我们就按照案例的数据进行分析,实际上4表示电梯经过每层所需时间,而10表示电梯每层停靠的时间。上面的stopNums是什么呢?就是电梯到达31层时所有的停靠次数,减去1是除去31层得停靠。而最后一层到达的人则很可能为最后一位到达的人,为什么不是一定呢,按照本例,上面举得例子就可以很简单的看出,在28、31停2次即可,此时最后一个到达的就是地30层的人了。当然在仅仅是在本例中,实际上会由于具体数值不一样而有不同。所以这里我用了可能,而它也和我们的最优解很接近了,而这给了我想法。虽然最后一层不一定是最后一位,但已经很接近了,而它所花费的时间,仅仅只和一个变量有关,即stopNums,即可以得出如下结论:

电梯的停靠次数越少,最后一层的时间也就越少,同样最佳时间也就越少。

假设我们有一个方法可以根据当前的停靠次数来计算最佳的停靠方案,那么我们该如何得到实际最佳方案呢?下面的一段代码很好的可以达到我们的目标。

热点内容
memcache设置缓存时间设置 发布:2024-12-29 12:06:51 浏览:936
交运换算法 发布:2024-12-29 11:56:59 浏览:961
魅族保存网页在哪个文件夹 发布:2024-12-29 11:38:02 浏览:51
安卓光遇耳机下一个复刻是什么 发布:2024-12-29 11:36:41 浏览:269
java调用栈 发布:2024-12-29 11:36:31 浏览:851
红米2刷机包用解压嘛 发布:2024-12-29 11:33:04 浏览:183
ug服务器名字是什么 发布:2024-12-29 11:28:55 浏览:507
奇迹脚本网 发布:2024-12-29 11:18:15 浏览:597
数据库怎么把删除恢复 发布:2024-12-29 11:15:36 浏览:95
选课管理数据库设计 发布:2024-12-29 11:11:20 浏览:278