電梯控制演算法(3)單電梯場景 空閒停靠

2021-10-07 12:00:53 字數 3280 閱讀 1901

電梯控制演算法 

電梯在空閒狀態時,停靠的情況有2種:原處停靠、固定樓層停靠。

原處停靠很簡單,停到哪了就是哪,而固定樓層停靠,一般是為了節約乘客平均等待電梯時間。

樓層均值分析:

一般情況下,乘電梯是2種情況,1到k 或者 k到1,起點和終點都不是1樓的情況很少。

更進一步,**均衡,1樓的等待乘客數等於其他樓層等待乘客數(此處數目指的的數學期望,下同)

假設2到n的等待乘客數分別為1,那麼一樓的等待乘客數為n-1

假設停靠樓層為m,那麼電梯去接第乙個乘客的接客距離為

(n-1) * abs(m-1) + abs(m-2) +  abs(m-3) + ...... + abs(m-n) ,忽略常數,下同

abs表示絕對值,很明顯,這個式子在m=1或2時取到最小值,所以電梯停靠在1樓或者2樓是可以達到乘客平均等待電梯時間最短的目的的

ps: 這裡只考慮當電梯空閒,第一位乘客等待電梯的情況。

固定停靠的樓層,也可以採取複雜的策略而定,而不是一直保持乙個固定的數字。

比如,按照時間,小區早高峰是下樓上班,晚高峰是下班上樓,公司中午12點是下樓吃飯高峰,12點20分是吃完飯上樓高峰,等等。

對於下行高峰,如果按照前面的邏輯,一共n層樓的話,停靠在n/2層樓貌似是最優解。

然而,光考慮第一位乘客等待電梯的情況,或許還不是最優方案。

存在這麼一種情況,加入電梯空閒停靠在5樓,此時7樓使用者按了電梯下行按鈕,電梯就上行去7樓接乘客,然而此時9樓又按了電梯下行按鈕,那麼電梯就會先去9樓,下行時經過7樓才開門接7樓乘客。如果一開始電梯停靠在8樓,那麼電梯就會直接去7樓接乘客下行到1樓,然後才上行到9樓接乘客。

很明顯,2種情況下的電梯利用率是不一樣的,乘客的等待時間也是不一樣的。

所以,對於下行高峰,相比於停靠在n/2層樓,停靠在更低的樓層或許是更好的方案

假設電梯處於空閒狀態停靠在m層,此時 i 層有乘客按電梯下行,緊接著 j 層立馬也有人按電梯下行,那麼電梯把倆乘客都送到1樓需要多久呢?平均停靠在哪一層可以最快的把2名乘客都送到1樓?

列舉一下n從3到30的結果:

int main()

return 0;

}

3 1

4 15 1

6 27 2

8 29 2

10 2

11 3

12 3

13 3

14 3

15 4

16 4

17 4

18 4

19 4

20 5

21 5

22 5

23 5

24 6

25 6

26 6

27 6

28 7

29 7

30 7

讓我們用程式設計驗證一下e求解的過程對不對。

int gete(int n, int m)

int main()

return 0;

}

3 3

4 45 5

6 67 7

8 89 9

10 10

11 11

12 12

13 13

14 14

15 15

16 16

17 17

18 18

19 19

20 20

21 21

22 22

23 23

24 24

25 25

26 26

27 27

28 28

29 29

30 30

結果不一樣!

我們把e關於m的三次函式畫出來大概是這樣:

前面求出來的那個是極值點,但還不是最小值。

所以對於下行高峰,如果只考慮盡快把乘客都送到1樓,空閒停靠選擇最高層是最優的。

如果要同時考慮電梯外乘客等待時間和乘客到達1樓時間,上面求的極值點附近是比較優的方案。

ps:雖然下行高峰期往往空閒時間較短,電梯可能到不了空閒停靠樓層就要去接客,但是空閒的時候往這個方向前進還是有效果的。

現在我們已經知道了如何設定空閒停靠樓層,那麼基於此,掃瞄排程演算法還需要進一步優化:

#include #include#define level 6

#define park 2 //空閒停靠樓層

int flag[level + 1]; //1到level層的外部輸入,取值為0,1,2,3,其中0表示無乘客,1表示有乘客上行,2表示有乘客下行,3表示既有上行又有下行

int dest[level + 1]; //目的樓層的記錄,取值為0,1,其中0表示不是目的地,1表示是目的地

int levelmax, levelmin; //levelmax是進出電梯最大樓層,levelmin是進出電梯最小樓層

void input()

}void uppull(int loc)//上行接客

void downpull(int loc)//下行接客

void push(int loc)//送客

int getmax()//進出電梯最大樓層

return levelmax;

}int getmin()//進出電梯最小樓層

return levelmin;

}bool ispark()//是否為空閒狀態

int getmax2()//進出電梯最大樓層

int getmin2()//進出電梯最小樓層

電梯控制演算法(8)多電梯場景 雙電梯的空閒停靠

電梯控制演算法 如果,兩個電梯是等價的,那麼,2個電梯的空閒停靠樓層是多少呢?假設2到n的等待乘客數分別為1,那麼一樓的等待乘客數為n 1 假設停靠樓層為x,y,那麼電梯去接第乙個乘客的接客距離為 n 1 f 1 f 2 f 3 f n 其中f t min abs t x abs t y abs表示...

電梯控制專案

每層電梯口有兩個按鈕 上行 和 下行 有兩個led數碼管分別顯示左右兩個電梯所在的樓層,數碼管旁有箭頭led燈指示該電梯的執行狀態 向上,向下,停止 兩個按鈕即為電氣開關,控制電梯的上行和下行。兩個led數碼管要顯示電梯樓層的話,就必須能夠接收到電梯所在樓層的資訊。箭頭led燈需要接收電梯執行狀態的...

電梯排程演算法

在高峰時間,實習生小飛常常會被電梯每層樓都停弄得很不耐煩,於是他想出了這樣乙個辦法 由於樓層並不高,那麼在繁忙的時間,每次電梯從一層往上走時,我們只允許電梯停在其中的某一層。所有乘客都從一樓上電梯,到達某層樓後,電梯聽下來,所有乘客再從這裡爬樓梯到自己的目的層。在一樓時,每個乘客選擇自己的目的層,電...