第五章 實證分析
5.1 測試及輸入資料背景
由於 E 業者所租用碼頭服務之船舶大多為定期靠泊,而船期表皆為一週前可得知,
亦可從港務局得到資料,所以本研究以一週時間為規劃期。輸入資料部分比照原排班方 式所用資料,方可比較其改善情形。輸入資料之船期如表 3.6,時間為自 2007 年 12 月 2 日至 12 月 8 日為期一週之船期表。工作時間班次如表 3.2,仍沿用原排班方式,將一天 分為五個班次,一樣為小夜班(00:00-04:00)、大夜班(04:00-08:00)、早班(08:00-14:00)、
中班(14:00-20:00)及晚班(20:00-00:00)。司機員之一週執勤休假表如表 4.1。最後由已知 之原始船期表統計出每天每船每班次之人力需求部分,一週中人力需求整理如表 5.1 所 示。
表 5.1 一周司機員人力需求表
BOX ETB ETD 碼頭 GC'S WORK HOURS 小夜班 00:00-04:00
大夜班 04:00-08:00
早班 08:00-14:00
中班 14:00-20:00
晚班 20:00-00:00
990 12/2 01:00 12/2 19:00 81 號 2 18 2 2 2 2
1360 12/2 03:00 12/2 19:00 80 號 3 16 3 3 3 3
1160 12/2 15:00 79 號 4 10.5 4 4
12/3 01:35 79 號 4 10.5 4
2530 12/3 08:00 79 號 4 23 4 4 4
12/4 07:00 79 號 4 23 4 4
2240 12/3 09:30 80 號 5 16 5 5 5
12/4 01:30 80 號 5 16 5
2520 12/4 02:30 12/4 20:00 80 號 5 17.5 5 5 5 5
1490 12/4 08:00 12/4 21:30 79 號 4 13.5 4 4 4
3360 12/5 00:30 80 號 5 23.5 5 5 5 5 5
12/6 01:00 80 號 5 23.5 5
1650 12/5 08:00 12/5 23:00 79 號 4 15 4 4 4
250 12/7 00:20 12/7 05:00 80 號 2 4.5 2 2
980 12/7 00:30 12/7 12:00 81 號 3 11 3 3 3
1960 12/7 08:00 12/7 22:00 81 號 5 14 2 5 5
1260 12/7 22:00 79 號 4 9 4
12/8 07:00 79 號 4 9 4 4
1020 12/8 11:25 12/8 23:30 80 號 3 12 3 3 3
660 12/8 12:30 12/9 00:00 81 號 2 12 2 2 2
資料來源:航運公司提供、本研究整理
上述資料及模式在利用 C 語言程式編寫目標式及限制式生成 text 檔案,再輸入各 需求輸入檔,最後生成輸出限制式展開之編碼檔案。由於程式內容多達 160 多頁,故只 節錄其中部分編碼作為參考。
TEXT 檔案:
#include <stdlib.h>
#include <stdio.h>
#define DAY 7 /*全部天數為 7 天*/
#define SLOT 5 /*SLOT 有 5 個班次*/
#define GROUP 50 /*可供排班有 50 位人員*/
#define FDEMAND1 "D:\\論文程式\\TEST 包\最終版\\demand1.txt"
#define FDEMAND2 "D:\\論文程式\\TEST 包\最終版\\demand2.txt"
#define FDEMAND3 "D:\\論文程式\\TEST 包\最終版\\demand3.txt"
#define FDEMAND4 "D:\\論文程式\\TEST 包\最終版\\demand4.txt"
#define FDEMAND5 "D:\\論文程式\\TEST 包\最終版\\demand5.txt"
#define FDEMAND6 "D:\\論文程式\\TEST 包\最終版\\demand6.txt"
#define FDEMAND7 "D:\\論文程式\\TEST 包\最終版\\demand7.txt"
int *day;
int *ship;
int **demand1=NULL;
int **demand2=NULL;
int **demand3=NULL;
int **demand4=NULL;
int **demand5=NULL;
int **demand6=NULL;
int **demand7=NULL;
int **off=NULL;
int shiftkind[SHIFT]={1,2,3,4,5};
int i,j,k,l;
int d;
void read_all_demand(void); /*讀入所有的資料*/
void write_model(void); /*印出所有的 model*/
void read_day(char *); /*給予天數代號,如第一天為 day[0]等*/
void read_ship(char *); /*ship 函數*/
void requiredemand_space(int ***,int); /*各天需求的空間*/
void read_demand(char *,int,int **); /*讀取各天的需求*/
void read_rest(int ***);
int objective(FILE *model); /*宣告目標式函數*/
int a(void);
void min_group(FILE *model);
void work_need(int,int,int **,FILE *model); /*宣告工作時段需求限制式*/
void time_conflict(FILE *model); /*時段衝突限制式*/
void holiday(FILE *model); /*輪休限制式*/
void continue_work(FILE *model,int,int); /*連續執勤限制式*/
void day_no_work(FILE *model); /*隔日不立刻勤執限制式*/
int c(void);
void end(FILE *model);
int main(void) {
read_all_demand();
write_model();
return 0;
}
生成之 MODEL 展開式檔案,以限制式(1)及限制式(2)為例:
限制式(1):
+Y1_1_1_1+ Y 1_1_2_1+ Y 1_1_3_1+ Y 1_1_4_1+ Y 1_1_5_1+ Y 1_2_1_1+
Y 1_2_2_1+ Y 1_2_3_1+ Y 1_2_4_1+ Y 1_2_5_1+ Y 1_3_1_1+ Y 1_3_2_1+
Y 1_3_3_1+ Y 1_3_4_1+ Y 1_3_5_1+ Y 2_1_1_1+ Y 2_1_2_1+ Y 2_1_3_1+
Y 2_1_4_1+ Y 2_1_5_1+ Y 2_2_1_1+ Y 2_2_2_1+ Y 2_2_3_1+ Y 2_2_4_1+
Y 2_2_5_1+ Y 3_1_1_1+ Y 3_1_2_1+ Y 3_1_3_1+ Y 3_1_4_1+ Y 3_1_5_1+
Y 3_2_1_1+ Y 3_2_2_1+ Y 3_2_3_1+ Y 3_2_4_1+ Y 3_2_5_1+ Y 4_1_1_1+
Y 4_1_2_1+ Y 4_1_3_1+ Y 4_1_4_1+ Y 4_1_5_1+ Y 6_1_1_1+ Y 6_1_2_1+
Y 6_1_3_1+ Y 6_1_4_1+ Y 6_1_5_1+ Y 6_2_1_1+ Y 6_2_2_1+ Y 6_2_3_1+
Y 6_2_4_1+ Y 6_2_5_1+ Y 6_3_1_1+ Y 6_3_2_1+ Y 6_3_3_1+ Y 6_3_4_1+
Y6_3_5_1+ Y 6_4_1_1+ Y 6_4_2_1+ Y 6_4_3_1+ Y 6_4_4_1+ Y 6_4_5_1+
Y 7_1_1_1+ Y 7_1_2_1+ Y 7_1_3_1+ Y 7_1_4_1+ Y 7_1_5_1+ Y 7_2_1_1+
Y 7_2_2_1+ Y 7_2_3_1+ Y 7_2_4_1+ Y 7_2_5_1-W<=0
上列展開式為限制式第一條,以司機編號 1 為例。上列式子代表總合編號 1 之司機 員之班次必須小於總合平均班次數之目標式 W。(在程式中以 W 代表
ω
)。限制式(2):
+ Y 1202_1_1_1+ Y 1202_1_1_2+ Y 1202_1_1_3+ Y 1202_1_1_4+ Y 1202_1_1_5+ Y
1202_1_1_6+ Y 1202_1_1_7+ Y 1202_1_1_8+ Y 1202_1_1_9+ Y 1202_1_1_10+ Y 1202_1_1_11+ Y 1202_1_1_12+ Y 1202_1_1_13+ Y 1202_1_1_14+ Y 1202_1_1_15+ Y 1202_1_1_16+ Y 1202_1_1_17+ Y 1202_1_1_18+ Y 1202_1_1_19+ Y 1202_1_1_20+ Y 1202_1_1_21+ Y 1202_1_1_22+ Y 1202_1_1_23+ Y 1202_1_1_24+ Y 1202_1_1_25+ Y 1202_1_1_26+ Y 1202_1_1_27+ Y 1202_1_1_28+ Y 1202_1_1_29+ Y 1202_1_1_30+ Y 1202_1_1_31+ Y 1202_1_1_32+ Y 1202_1_1_33+ Y 1202_1_1_34+ Y 1202_1_1_35+ Y 1202_1_1_36+ Y 1202_1_1_37+ Y 1202_1_1_38+ Y 1202_1_1_39+ Y 1202_1_1_40+ Y 1202_1_1_41+ Y 1202_1_1_42+ Y 1202_1_1_43+ Y 1202_1_1_44+ Y 1202_1_1_45+ Y 1202_1_1_46+ Y 1202_1_1_47+ Y 1202_1_1_48+ Y 1202_1_1_49+ Y 1202_1_1_50=2
上列展開式為限制式第二條,以第一天 12 月 2 日,第一艘船舶,第一個班次為例。
在該天該船舶該班次之需求為 2 個司機員。
以上述展開式加入標頭檔及限制整數規劃之參數後輸入 CPLEX 後,共產生 15380 條限制式,26250 個變數,求解時間為 0.16 秒。輸出後得到數學規劃之班表結果如表 5.2 所示。
表 5.2 數學規劃所得一周班表
資料來源:本研究整理
以 X111為例,即為規劃期第一天星期日、第一艘船 A 船、第一個工作時段小夜班,
執勤需求為兩位司機員,分別由司機員編號 401、604 值勤。該天該船之第二個工作時 段由司機員編號 205、301 值勤,以此類推。
而總和模式輸出班表之結果經統計後,將每位司機的總值勤班次數目做一整理,得 出每位司機員一週總值勤班次如表 5.3 所示。
表 5.3 司機員一周總值勤班次數
司機編號 101 102 103 104 105
201 202 203 204 205
班次 4 4 4 4 4 4 4 4 4 4
司機編號 301 302 303 304 305
401 402 403 404 405
班次 4 4 3 4 4 4 4 4 4 4
司機編號 501 502 503 504 505
601 602 603 604 605
班次 4 4 4 4 4 4 4 4 4 4
司機編號 701 702 703 704 705
801 802 803 804 805
班次 4 4 4 4 4 4 4 4 4 3
司機編號 901 902 903 904 905 1001 1002 1003 1004 1005
班次 4 4 4 4 4 4 4 4 4 4
資料來源:本研究整理
總班次需求數為 198 個班次,每位司機員平均值勤班次為 3.96 個班次,值勤班次 之變異數為 0.038。從統計資料可得知,每位司機員之一週值勤班次數都界於 3 個班次 到 4 個班次之間。
相較於業者之規劃方法,值勤之最多班次及最少班次總數達 6 個班次之多之結果而 言,由模式輸出所得到的班表在工作的均勻分配上有良好的改善結果。
表 5.4 數學規劃及原始班表之比較 比較項目
班表類別
總值勤班次數 值勤班次變異數
值勤班次之最多 及最少之差異
原始班表
由 1 個班次到 7 個 班次不等
1.81 6 個班次
數學規劃之班表 集中於 3-4 個班次 0.038 1 個班次
資料來源:本研究整理
而經由數學整數規劃模式所求解之班表,除了在排班上人員較無順序性外,就本研 究所設置的目標式,亦即每位司機員平均班次數而言,有其改善效果。而在安排司機員 之順序較無軌跡可循是因在整數規劃模式中尋求最佳化解時並沒有將特定司機員綁定 於某座碼頭之機具及特定之值勤班次時間上。
另外,求解之可行解及最佳解還尚存很多組空間,即代表目前的求解空間較鬆散也 較自由,此輸出最佳化班表只為其中一組最佳解。由此可見,原始給定的人力資源之司 機員人數在此安排作業下仍有充足的空間可供指派。
由上述資料之分析,不難發現目前所有的司機員在勞力方面非常充裕。以一般公司 企業為基準,周休二日,每日工作八小時為標準也仍有大量多餘的閒置時間(Idle Time)。其中夜班時間如晚班、小夜班、大夜班值勤一個班次只有四個小時,白日班如 早班及中班一個班次為六個小時。以業者角度安排的班次規劃認為夜班因天色較暗,需 耗費更多精神力於工作上,故認定夜班一個班次四小時等同於白日班一個班次六小時。
故本研究在計算值勤時數上,將夜班加權換算成白日班次的工作時數,意即夜班的一個 工作小時為白日班 1.5 個工作小時。由輸出之班表進一步分析統計每位司機員的總值勤 工時及閒置時間,如表 5.5 所示。
表 5.5 每位司機員一周總值勤時間(小時)