1. 程式人生 > >數學建模專欄 | 第十一篇:MATLAB CUMCM真題求解例項二:優化型

數學建模專欄 | 第十一篇:MATLAB CUMCM真題求解例項二:優化型

2003 年的 B 題是典型的優化型問題,這道問題的特色是模型容易建立,但求解比較困難。這道題目在求解方面的難點是模型有交叉,所以當時我們的求解策略是分步求解、逐級優化,採用這種策略後,就可以將複雜的優化問題轉化為標準的規劃模型進行求解了。

在 2003 年 MATLAB 還沒有整數規劃求解器,在這一講就介紹用 MATLAB 的整數規劃求解器來求解這一問題。

1. 問題的提出

鋼鐵工業是國家工業的基礎之一,鐵礦是鋼鐵工業的主要原料基地。許多現代化鐵礦是露天開採的,它的生產主要是由電動剷車(以下簡稱電鏟)裝車、電動輪自卸卡車(以下簡稱卡車)運輸來完成。提高這些大型裝置的利用率是增加露天礦經濟效益的首要任務。

露天礦裡有若干個爆破生成的石料堆,每堆稱為一個鏟位,每個鏟位已預先根據鐵含量將石料分成礦石和岩石。一般來說,平均鐵含量不低於 25% 的為礦石,否則為岩石。每個鏟位的礦石、岩石數量,以及礦石的平均鐵含量(稱為品位)都是已知的。每個鏟位至多能安置一臺電鏟,電鏟的平均裝車時間為 5 分鐘。

卸貨地點(以下簡稱卸點)有卸礦石的礦石漏、2 個鐵路倒裝場(以下簡稱倒裝場)和卸岩石的岩石漏、巖場等,每個卸點都有各自的產量要求。從保護國家資源的角度及礦山的經濟效益考慮,應該儘量把礦石按礦石卸點需要的鐵含量(假設要求都為 29.5%±1%,稱為品位限制)搭配起來送到卸點,搭配的量在一個班次(8 小時)內滿足品位限制即可。從長遠看,卸點可以移動,但一個班次內不變。卡車的平均卸車時間為 3 分鐘。

所用卡車載重量為 154 噸,平均時速 28km/h。卡車的耗油量很大,每個班次每臺車消耗近 1 噸柴油。發動機點火時需要消耗相當多的電瓶能量,故一個班次中只在開始工作時點火一次。卡車在等待時所耗費的能量也是相當可觀的,原則上在安排時不應發生卡車等待的情況。電鏟和卸點都不能同時為兩輛及兩輛以上卡車服務。卡車每次都是滿載運輸。

每個鏟位到每個卸點的道路都是專用的寬 60m 的雙向車道,不會出現堵車現象,每段道路的里程都是已知的。

一個班次的生產計劃應該包含以下內容:出動幾臺電鏟,分別在哪些鏟位上;出動幾輛卡車,分別在哪些路線上各運輸多少次(因為隨機因素影響,裝卸時間與運輸時間都不精確,所以排時計劃無效,只求出各條路線上的卡車數及安排即可)。一個合格的計劃要在卡車不等待條件下滿足產量和質量(品位)要求,而一個好的計劃還應該考慮下面兩條原則之一:

1.總運量(噸公里)最小,同時出動最少的卡車,從而運輸成本最小;

2.利用現有車輛運輸,獲得最大的產量(岩石產量優先;在產量相同的情況下,取總運量最小的解)。

請你就兩條原則分別建立數學模型,並給出一個班次生產計劃的快速演算法。針對下面的例項,給出具體的生產計劃、相應的總運量及岩石和礦石產量。

某露天礦有鏟位 10 個,卸點 5 個,現有剷車 7 臺,卡車 20 輛。各卸點一個班次的產量要求:礦石漏 1.2 萬噸、倒裝場 Ⅰ 1.3 萬噸、倒裝場 Ⅱ 1.3 萬噸、岩石漏 1.9 萬噸、巖場 1.3 萬噸。

鏟位和卸點位置的二維示意圖如圖 1 所示,具體的資料參考官網的賽題


1  礦場鏟位和卸點示意圖

2. 基本假設

為了便於問題的研究,我們對題目中的不確定因素作一些約定和假設。

1) 電鏟在一個班次內不改變鏟位,也就是說每臺電鏟在一個班次內只在一個鏟位上工作。這主要是因為電鏟的轉移不方便並且電鏟的轉移需要佔用時間,影響公司的效益。

2) 礦石漏和鐵路倒裝場只是卸礦石的不同地方,它們的開採對露天礦的經濟效益無影響。同樣,卸岩石的岩石漏和巖場的屬性也不影響開採公司的經濟效益。開採公司的經濟效益主要與開採量與運輸成本有關。

3) 卸點的品位是指在一個班次內在卸點內所卸總礦石鐵的綜合含量 ,並不要求任何一部分礦石的鐵含量達到品位限制要求。

4) 卡車每次運輸都按載重量滿載運輸,並不考慮因顛簸而使岩石或礦石減少的情況。另外卡車運輸始終以 28km/h 的平均速度行駛,發動和剎車所佔用的時間忽略不計。

5) 在同一班次內,每輛卡車所走的路線是不定的,即卡車選擇哪條路線是隨機的。

3. 問題的分析及模型的準備

通過直觀的分析可知,本問題是一個較複雜的運輸系統排程問題。問題要求分別滿足兩條運輸原則的條件下建立一個班次運輸方案安排的數學模型,並且要給出所用電鏟的臺數,每臺電鏟的鏟位,出動卡車的數量,卡車的具體排程安排等。所以本問題是一個大型的目標規劃問題,目標函式是要求的兩個原則,即一個是要求總運量最小,同時出動的卡車最少,另一個是要求獲得最大的產量。對於開採公司來說,制定的兩個原則事實上就是減少成本,增加收入,以提高公司的經濟效益。這樣我們就可知道研究該問題的方向就是找目標函式,抽象約束條件,建立規劃問題的數學模型。

為了建立完善的數學模型,我們還需對問題作進一步的分析。

(1) 運輸矩陣的建立

卡車運輸路線的選擇是雙向、隨機的,當多輛卡車同時運輸時,他們所形成的運輸網錯綜複雜。為了便於描述卡車在一個班次的調動狀態,我們先規定了兩個運輸方向,同人們習慣上的方向相同,我們把從鏟位到卸點的方向稱為前進(Go)方向,而將從卸點到鏟位的方向稱為返回 (Return) 方向。

設有 m 個卸點,n 個鏟位,可以構建以下矩陣描述 Go 方向的運輸狀態:


其中,gij 表示在一個班次內從 j 鏟位到 i 卸點單向路徑上所通過的總車次,1 ≤ j ≤ n,1 ≤ i ≤ m。

同理,我們可得到 Return 矩陣:


其中 rij 表示在一個班次內從 i 卸點到 j 鏟位單向路徑上所通過的總車次。

我們將 Go 矩陣和 Return 矩陣統稱為排程矩陣。

(2) 原則 1 的數學分析

原則 1 要求總運量最小,同時出動的卡車數量最少,這實際上是要求運輸成本最小,所以原則 1 又可稱為成本最小原則。這裡的總運量我們理解為卡車所裝載的貨物總質量(噸)與卡車在裝載狀態下所行的路程之積,其數字表達式為

其中 sij 表示從鏟位j到卸點i之間的路程,a 為卡車滿載時的載重。

當卡車從卸點返回時,此時雖然卡車所走的路程不為零,但此時卡車所裝載貨物的質量為零,所以返回時卡車的運量為零,所以卡車的總運輸指的是從鏟位到卸點也即 Go 方向上的總運量。

原則 1 同時也要求在同一班次內出動卡車的數量最少。卡車最少的運輸狀態有以下兩個特點:

卡車得到最大限度的利用,即卡車幾乎沒有等待時間(閒置時間)。

卡車充分地工作,恰能完成運輸問題,或者超額的部分並不多。

對於多輛卡車的裝、運、卸的時間我們很難確定,但根據特點(1),我們在巨集觀上很容易找到卡車數量與其他因素之間的關係。

由於所有卡車幾乎一直在工作,即對每輛卡車來說在一個班次內都處於裝、運、卸三個時間狀態,所以我們將所有卡車的工作時拆合成一輛卡車的工作時,便有


其中 T 為生產週期,即一個班次的時間,t* 為在一個班次內所有卡車的總等待時間,於是有


由於整個運輸過程中原則上不應存在等待時間,所以 t* 的值應近似為零或就是零。

(3) 原則 2 的數學分析

原則 2 要求利用現有車輛,獲得最大的產量,所以原則 2 又可稱為產量最大原則,這裡的產量指的是礦石和岩石的總產量,其數學表示式為:


(4) 等待時間的控制

我們在安排運輸方案時,原則上不應存在等待時間,但不排除一定存在等待時間的情況,所以我們安排運輸時應儘可能避免出現等待時間的情況。根據參考文獻 [8],卡車在進行排程時可以根據“最小飽和度”排程準則(MSD),以儘可能地避免發生等待現象。

這一準則的實質,是將卡車調往具有最小“飽和”程度的路線:


式中 choice(i) 表示處於 i 卸點的待發車所選擇的將去鏟位的代號,choice(j) 表示處於 j 鏟位的待發車所選擇的將去卸點的代號,Dj 表示由卸點到 j 鏟位的飽和度,Di 表示由鏟位到 i 卸點的飽和度。Dj 和 Di 的具體表達式為:


其中 t' 為正裝車(卸車)估計剩餘的裝車(卸車)時間,Nj 表示到第 j 號鏟位的卡車數,不包括正裝的卡車,Ni 表示到 i 卸點的卡車數,不包括正卸的卡車。

4. 原則1數學模型(模型1)的建立與求解

4.1 模型的建立

由上面問題的分析,我們給出了成本的數學表示式,再經過對目標函式約束條件的分析後,建立了以下的雙目標線性規劃模型:

Goals:



S.T:

...........................................(1)

(2)

........................................(3)

.........................................(4)

.......................(5)

.........................(6)

..............................(7)

..........................(8)

.....(9)

 ..................(10)

...................(11)

關於約束條件的說明

1)  約束條件 (1) 是為保障在一個班次內要滿足各卸點的需求;

2)  條件 (2) 是對鏟位搭配的約束,即在同一班次內所有礦石的卸點都要達到品位要求的限制;

3)  條件 (3)、(4) 是基於鏟位的岩石和礦石的儲量都是有限的而進行的約束,即從任何鏟位所輸出的產量不應超過該鏟位的儲量;

4)  條件 (5)、(6) 是對 gij 和 rij 的約束,它們的上限不應超過 T/tT/t

5)  條件 (7) 描述了等待時間的情形,說明了可以存在等待時間,但儘量應使等待時間為 0;

6)  條件 (8) 給出了 Go 和 Return 矩陣元素之間的邏輯關係;

7)  條件 (9) 是對目標函式中 gij 和 rij 的約束,這是由它們的現實意義而定的。

4.2 模型的求解

模型 1 是典型的大型的雙目標線性規劃問題,即使在約束條件下對兩個目標分別求解,也是困難的,困難在於模型中的變數太多,尤其是模型的約束條件中包含了實時排程的限制,這種限制使模型變成非線性,而且不易控制的複雜的數學模型。因此不易直接由計算機進行搜尋求解,只能另闢途徑。

(1) 模型演算法的理論分析

模型的求解要求給出一個班次內出動電鏟的臺數、電鏟分佈的鏟位、出動卡車的數量及卡車的路線分配。模型的目標函式為總運量最小,同時要求出動的卡車也是最少,但也要滿足運輸要求,所以我們先不考慮出動卡車的臺數,直接以總運量最小為目標,求解模型。求解出運輸方案後,卡車數量即可給出。

直接的求解很複雜,為此我們採取分步求解的方法:

第一步:用線性規劃的方法求出從每個鏟位到每個卸點所發的車次,從而求解出 Go 矩陣。

第二步:從 Go 矩陣判斷所需出動的電鏟的臺數和鏟位分配。

第三步:依據 Go 矩陣提供的資訊,用線性規劃方法求出由每個卸點返回到每個鏟位的車次,從而給出了 Return 矩陣。

第四步:依據 Go 矩陣和 Return 矩陣,根據卡車的充分利用條件求出在一個班次內所需卡車的數量。

(2) 分步求解的實現

為求解 Go 矩陣,我們先要求出從每個鏟位到每個卸點的岩石或礦石的運量。為此,我們以總運量最小為目標函式,供應約束、需求約束、品位限制為約束條件,建立如下單目標線性規劃數學模型。


S.T:

gij≥ 0,且為整數


該模型是線性規問題,用 MATLAB 的求解程式如下:

%% 2003-B MATLAB整數規劃求解程式

c=[5.26    5.19   4.21   4      2.95   2.74   2.46   1.9    0.64   1.27   1.9    0.99   1.9    1.13   1.27   2.25   1.48   2.04   3.09   3.51   4.42   3.86   3.72   3.16   2.25   2.81   0.78   1.62   1.27   0.5 5.89   5.61   5.61   4.56   3.51   3.65   2.46   2.46   1.06   0.57   0.64   1.76   1.27   1.83   2.74   2.6 4.21   3.72   5.05 6.1];

A=[0.0154   0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154 0.0154..............................]; 省略部分資料

b=[1.2154   -1.2   1.3154 -1.3   1.3154 -1.3    0      0      0      0      0      0       61.68831169   68.18181818   64.93506494       68.18181818   71.42857143   81.16883117       68.18181818   84.41558442   87.66233766       81.16883117   81.16883117   71.42857143       87.66233766   68.18181818   74.67532468       87.66233766   68.18181818   74.67532468       87.66233766   81.16883117   160    160    160    160    160    96     96     96     96     96     96     96  96 96 96];

Aeq=[];

beq=[];

n = size(c,2);

lb=zeros(1,n);

ub=ones(1,n)*inf;

cons=1:n;

x=intlinprog(c,cons,A,b,Aeq,beq,lb,ub);

%% 解的轉化

X = reshape(x,[5, 10])

%% 資料和模型可以參考《MATLAB 在數學建模中的應用》(第二版)

執行該程式求出一組解,由於該函式求出的解並非整數,所以我們用手工改動的方法對求出的結果進行優化處理,處理原則是對所得結果進行向上或向下取整,並在滿足限制條件下使目標函式儘可能的大,這樣我們便得到 Go 矩陣:

用同樣的程式, 只要更新其中的變數, 就可以輕鬆得到 Return 矩陣, 這樣就完成了整個模型的求解了, 是不是發現 MATLAB 整數規劃的求解也是挺方便的。

5. 點評

優化問題的建模思路就是:定目標-抽約束-求解三步曲,該模型的建模過程相對來說比較容易些。但本問題的求解是比較麻煩的,雖然目標和約束非常清晰。從本篇的建模和求解過程來看,可以得到以下的技巧:

(1) 在建立模型的過程中,可以有個循序漸進的過程,從簡單到複雜,這樣求解的起點就會低些,更容易得到簡單模型的解,這樣求解也會有個逐漸深入的過程,也便於對模型的結果進行比較。

(2) 文中的模型,直接進行求解是非常困難的,這裡面採取了分步求解、逐級優化的策略,將複雜的模型簡化到了可以求解的程度,從而很容易對模型進行了求解。這樣雖然得到的解不是最優解,但應該也是非常接近最優解的可行解。得到一個近似最優解,總比得不到解好吧,所以對模型進行簡化在實際的建模比較中也要考慮到。