坐電梯演算法
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,即可以得出如下結論:
電梯的停靠次數越少,最後一層的時間也就越少,同樣最佳時間也就越少。
假設我們有一個方法可以根據當前的停靠次數來計算最佳的停靠方案,那麼我們該如何得到實際最佳方案呢?下面的一段代碼很好的可以達到我們的目標。