数学建模——01规划 / 线性规划 (工具:matlab + lingo,算法:Folyd)
??💺
文章目錄
- 一、前驅知識準備
- 1、Lingo簡介
- 2、01規劃、整數規劃、(非)線性規劃等規劃的區別
- 3、優化(/規劃)模型的組成
- (1)目標函數
- (2)決策變量
- (3)約束條件
- 4、Lingo模型的基本組成
- (1)集合定義部分
- (2)數據段
- (3)初始化段
- (4)計算段
- (5)目標函數和約束條件
- 二、樣例:國賽數模11年B題《交巡警服務平臺的設置與調度》的第一問(前2小問)
- 1、問題描述:
- 2、解題思路
- 3、數據預處理
- 4、第①小問 模型的建立和求解
- 5、第②小問 模型的建立和求解
- 三、總結:
- 四、參考附錄:
敲到碼窮處,坐看云起時。?? ?? ??
數學建模系列文章——總結篇:《數模美一國一退役選手的經驗分享[2021紀念版]》.
🍬
一、前驅知識準備
1、Lingo簡介
??LINGO是 Linear Interactive and General Optimizer 的縮寫,即“交互式的線性和通用優化求解器”。
??Lingo超強的優化計算能力在很多方面(線性規劃、非線性規劃、線性整數規劃、非線性整數規劃、非線性混合規劃、二次規劃等)比matlab、maple等強得多。
??Lingo編程簡潔明了,數學模型不用做太大的改動,便可以直接用Lingo語言編程呈現,十分直觀。
2、01規劃、整數規劃、(非)線性規劃等規劃的區別
?? ?? ??
??①0-1規劃 是決策變量僅取值0或1的一類 特殊的整數規劃。
?? 補充:0-1 變量可以數量化地描述諸如開與關、取與棄、有與無等現象所反映的邏輯關系。因此 0-1 規劃非常適合解決如工廠選址 、生產計劃安排、背包問題、人員安排等多種問題。
??②整數規劃 是指規劃中的變量(全部或部分)限制為整數。
??補充:若在線性模型中,變量限制為整數,則稱為整數線性規劃。所流行的求解整數規劃的方法往往只適用于整數線性規劃。從約束條件的構成又可細分為線性,二次和非線性的整數規劃。
??③線性規劃(Linear programming,簡稱 LP ),是運籌學中的一個重要分支,它是一種數學方法。研究 線性約束條件 下 線性目標函數 的 極值問題 的數學理論和方法。
??④非線性規劃 是一種求解目標函數或約束條件中有一個或幾個 非線性函數 的最優化問題的方法。
3、優化(/規劃)模型的組成
(1)目標函數
??(1)目標函數:一般表示成求 某個數學表達式 的 最小值 或 最大值 。
(2)決策變量
??(2)決策變量:目標函數值 取決于 哪些變量。
(3)約束條件
??(3)約束條件:對變量附加一些條件限制(通常用等式或不等式來表示)。
4、Lingo模型的基本組成
(1)集合定義部分
(2)數據段
(3)初始化段
(4)計算段
(5)目標函數和約束條件
??注:詳細說明可參考本文最后的 參考附錄【2】 📚。
二、樣例:國賽數模11年B題《交巡警服務平臺的設置與調度》的第一問(前2小問)
1、問題描述:
??該市中心城區A的交通網絡和現有的20個交巡警服務平臺的設置情況如下圖所示。(相關數據可在本文最后 參考附錄【1】下載)
??①現在請為各交巡警服務平臺分配管轄區域,使其在所管轄的范圍出現突發事件時,盡量能在3分鐘內有交巡警(警車時速為60km/h)到達事發地。
??②對于重大突發事件,需要調度全區20個交巡警服務平臺的警力資源,對進出該去的13條交通要道實現快速全封鎖。實際中一個平臺的警力最多封鎖一個結點,請給出該區交巡警服務平臺合理的調度方案。【注:13條交通要道即圖中13個紅點。】
2、解題思路
??①根據實際情況,我們首先要對數據進行處理,利用Folyd算法,借助 matlab 軟件對其進行求解,求出20個交巡警服務平臺到各個結點之間的實際距離。
??然后建立優化模型,找出目標函數,并找出相應的約束條件,借助 lingo 對其進行求解,得出結論。
??②由上面那張圖,我們明顯地可以看出,有些結點到所有的交巡警平臺的距離都不會小于3km,所以顯然不能滿足 “3分鐘” 那個條件(因為車速60km/h→1km/min)。故我們考慮到交巡警平臺的重新鋪設,將20個交巡警平臺重新在交通網絡中鋪設,得到最優結果。
??③我們設定一個正向型指標,使增設平臺的目標就是:讓該 指標 分數最大。
3、數據預處理
Folyd算法如下:
??Step1:構造 0-1 矩陣 A0:
??來存放各節點之間的關系,其中,aij = 0 表示 i,j 兩節點之間 沒有 直接連接。 a ij = 1 表示 i,j 兩節點之間直接連接。
??Step2:遞推產生一個矩陣序列 A0、A1、A2、… 、Ak、Ak+1、… 、An-1、An。其中 Ak ( i , j ) 表示從節點 i 到結點 j 的路徑所經過的節點序號不大于 k 的最短路徑長度。
??計算時用的迭代公式為:
Ak(i,j)=min(Ak?1(i,j),Ak?1(i,k)+Ak?1(k,j))A_k(i,j)=min(A_{k-1}(i,j),A_{k-1}(i,k)+A_{k-1}(k,j))Ak?(i,j)=min(Ak?1?(i,j),Ak?1?(i,k)+Ak?1?(k,j))
??其中,k 為迭代次數, i, j, k = 1, 2, 3, … , n
??最后,當 k=n 時,An 即是各節點之間的最短距離。
??注: Table是個 n*m 的結構體表 ,封裝了題目里面的所有數據。
??其構造的內容詳見 這一篇文章《數學建模——matlab繪制 地圖 散點圖連線圖 (運用plot、scatter、struct、xlsread等函數)》
??鏈接: https://blog.csdn.net/Wang_Dou_Dou_/article/details/119007126?spm=1001.2014.3001.5501.
??Folyd 的原理可以參考這篇《算法篇——詳解 弗洛伊德(Folyd)算法【用 C/C++ 和 matlab 實現】》
??鏈接:https://blog.csdn.net/Wang_Dou_Dou_/article/details/119485893?spm=1001.2014.3001.5501.
??通過 matlab 編程求解如下:
A_0 = zeros(92,92); % 初始化 注:A區域有92個節點 for i=1:92next_point = Table(i).NextJieDian; % 注:Table(i).NextJieDian 是一個 1*n 的矩陣for j=1:length(next_point)if 1 <= next_point(j) && next_point(j) <= 92A_0(i,next_point(j)) = 1;endend endzuo_x_A = zeros(92,1); zuo_y_A = zeros(92,1); for i=1:92 % 篩選出 A 區域里面的數據點zuo_x_A(i) = Table(i).X;zuo_y_A(i) = Table(i).Y; endX_0 = zeros(92,92); for i=1:92 % 計算A區域中 兩兩結點之間的距離for j=1:92X_0(i,j) = sqrt( ( zuo_x_A(i) - zuo_x_A(j) ).^2 + ( zuo_y_A(i) - zuo_y_A(j) ).^2 ); end end Fal_X = X_0 .* A_0; % 只保留 兩個結點有連線的 "距離值"for i=1:92for j=1:92if A_0(i,j) == 0 % 距離等于0,表示網絡中兩節點之間不相連,則表示距離無窮大Fal_X(i,j) = 99999; endend endfor i=1:92Fal_X(i,i) = 0; % 自身到自身的節點距離為0 end% Folyd算法: path = zeros(92); for k=1:92for i=1:92for j=1:92if Fal_X(i,j) > Fal_X(i,k) + Fal_X(k,j)Fal_X(i,j) = Fal_X(i,k) + Fal_X(k,j); % 修改最短距離path(i,j) = path(k,j); % 記錄最短途徑endendend end??運行結果如下:
??Fal_X 表示 節點 i 到節點 j 之間的最短距離。path 記錄著 節點 i 到節點 j 的最短途徑上, 結點 j 的上一結點 k。
4、第①小問 模型的建立和求解
??根據上述分析和數據處理,明顯有些節點到所有交巡警服務平臺的距離都不會小于 3km 。所以不能滿足那個 “3分鐘”(因為車速60km/h→1km/min) 的要求。
??所以,我們建立以下模型。并且在滿足 “3分鐘之內盡量到達” 的條件上,再使得對于少數不能感趕到的,我們盡量使其趨于最短時間。
說明:
??<1> xijx_{ij}xij? 是 0/1 變量,當 xij=1x_{ij}=1xij?=1 表示第 j 個節點分配在第 i 個交巡警服務平臺的管轄內;當 xij=0x_{ij}=0xij?=0 表示第 j 個節點 沒有 分配在第 i 個交巡警服務平臺的管轄內。
??<2> LijL_{ij}Lij? 是 結點 i 到 結點 j 的最短距離。
??<3>目標函數為 ∑i=120xijLij,(j=1,2,...,92)\sum \limits_{i=1}^{20} x_{ij}L_{ij} ,(j=1,2,...,92)i=1∑20?xij?Lij?,(j=1,2,...,92) 表示第 j 個節點距離第 i 個交巡警服務平臺距離最近時,就將第 j 個節點分配在第 i 個交巡警服務平臺的管轄區域內。并 盡量 使交巡警平臺 能滿足 “3分鐘” 的那個條件。
??<4> ∑i=120xij=1,(j=1,2,...,92)\sum \limits_{i=1}^{20} x_{ij}=1 ,(j=1,2,...,92)i=1∑20?xij?=1,(j=1,2,...,92) 表示每個節點(總共92個) 只能歸屬于一個交巡警服務平臺的管轄。
??<5> ∑j=192xij≥1,(i=1,2,...,20)\sum \limits_{j=1}^{92} x_{ij} ≥1,(i=1,2,...,20)j=1∑92?xij?≥1,(i=1,2,...,20) 表示每個交巡警服務平臺至少管轄一個節點。【也就是大家也都得干干活】
??用 lingo 軟件對其進行求解:
model: sets: ! 集合段; R/1..92/; S/1..20/; T/1..92/; JuZhen(S,T): x,L; BigJuZhen(R,T):Fal_X; endsetsdata: ! 數據段; Fal_X = @ole('C:\Users\ASUS\Desktop\CSDN\6交巡警\cumcm2011B附件2_全市六區交通網路和平臺設置的數據表.xls','data_1'); ! 向Excel讀數據 @ole('C:\Users\ASUS\Desktop\CSDN\6交巡警\cumcm2011B附件2_全市六區交通網路和平臺設置的數據表.xls','結果') = X; ! 向Excel寫數據 enddatacalc: ! 計算段; @for( R(i)| (i #LE# 20): @for( T(j): L(i,j) = Fal_X(i,j) ) ); endcalcmin = @sum( JuZhen: x*L ); ! 目標函數;! 以下3個函數是約束條件; @for( T(j): @sum( S(i):x(i,j) ) = 1 ); @for( S(i): @sum( T(j):x(i,j) ) >= 1 ); @for( JuZhen: @bin(x) ); ! 01變量 end??運行結果如下:(已轉到 Excel )
??后續的可視化處理,即用 matlab 軟件對其進行畫圖:
x = xlsread('cumcm2011B附件2_全市六區交通網路和平臺設置的數據表.xls',7,'A1:CN20') table_2 = struct([]); % 結構體初始化 for i=1:20table_2(i).PingTai = []; endfor i=1:20for j=1:92if x(i,j) == 1table_2(i).PingTai = [ table_2(i).PingTai,j ]; % 將 x 的數據讀到結構體endend end Save = zeros(20,2); % 初始化 for i=1:20Z = cell2mat( struct2cell( table_2(i) ) ); % 轉換操作:結構體 → 元胞數組 → 矩陣biggest_dis = 0 ;x0 = Table(i).X;y0 = Table(i).Y;for j=1:length(Z)x1 = Table(Z(j)).X;y1 = Table(Z(j)).Y;dis = sqrt( ( x0 - x1 ).^2 + ( y0 - y1 ).^2 );if dis > biggest_disSave(i,1) = dis; % 記錄最長時間(也就是最短距離,因為車速是1km/h)Save(i,2) = j; % 記錄交通路口編號endend end xlswrite('cumcm2011B附件2_全市六區交通網路和平臺設置的數據表.xls',Save,9,'M2:N22'); hold on; new_line = cell2mat( struct2cell( table_2(1) ) ); % 結構體 → 元胞數組 → 矩陣 for j=1:length(new_line) % 給第一個交巡警服務平臺畫管轄區域xx = [ Table(1).X,Table(new_line(j)).X ] ;yy = [ Table(1).Y,Table(new_line(j)).Y ] ;scatter(xx(:,2),yy(:,2),10,'filled','m');plot(xx,yy,'m-.','LineWidth',1) endnew_line = cell2mat( struct2cell( table_2(2) ) ); for j=1:length(new_line) % 給第二個交巡警服務平臺畫管轄區域xx = [ Table(2).X,Table(new_line(j)).X ] ;yy = [ Table(2).Y,Table(new_line(j)).Y ] ;scatter(xx(:,2),yy(:,2),10,'filled','r');plot(xx,yy,'r-.','LineWidth',1) end??運行結果如下:(注:只畫出兩個交巡警服務平臺的管轄區域,即 粉色 和 紅色)
5、第②小問 模型的建立和求解
???? ?? ??
??首先,我們用 matlab ,統計出13個節點(A區的13個出入口)和20個交巡警服務平臺的距離表。
Model_2 = zeros(20,13); t = 1; ans = []; for i=1:92if Table(i).A_Qu_ChuRuKou == 1for j = 1:20Model_2(j,t) = Fal_X(j,i); % 獲取對應的最短距離endt = t + 1;ans = [ans , i]; % 獲取編號end end Model_2 ans xlswrite('cumcm2011B附件2_全市六區交通網路和平臺設置的數據表.xls',Model_2,9);??運行結果如下:(已用 Excel 作處理)
??注:①表中的單位是mm。(比例尺1:100000)
????②最上面一排項目中,括號外是打表的序號,括號內是A區13個出入口的編號。
??接著,考慮到題目中所說的 “快速全面封鎖” 這點,而時間的長短是由 所有距離中的最長距離 決定的,故不能建立 所有路程之和最短的模型,而要建立一個 時間最短模型。因為制約時間的并非是所有路程之和而是其中的最長路徑。
??所以建立的模型如下:
說明:
??<1> L0 為 13個A區出入口分別到20個服務平臺的 13 個最短距離中的 最大值。
??<2> ∑j=113xij≤1,(i=1,2,...,20)\sum \limits_{j=1}^{13} x_{ij}≤1 ,(i=1,2,...,20)j=1∑13?xij?≤1,(i=1,2,...,20) 表每個交巡警平臺只能封鎖一個節點。
??<3> ∑i=120xij=1,(j=1,2,...,13)\sum \limits_{i=1}^{20} x_{ij}=1 ,(j=1,2,...,13)i=1∑20?xij?=1,(j=1,2,...,13) 表示每個A區出入口(總共13個) 都必須有交巡警進行封鎖。
??然后,我們用 lingo 編程求解。
model:sets: S/1..20/; T/1..13/; link(S,T): x,L; endsetsdata: L = @ole('C:\Users\ASUS\Desktop\CSDN\6交巡警\cumcm2011B附件2_全市六區交通網路和平臺設置的數據表.xls','dis'); !讀數據; @ole('C:\Users\ASUS\Desktop\CSDN\6交巡警\cumcm2011B附件2_全市六區交通網路和平臺設置的數據表.xls','TRY') = x; !寫數據; L0 = 57.01; !從Excel直接獲取的數據; enddata min = L1;L1 >= L0;@for( S(i): @SUM( T(j): x(i,j) ) <= 1 );@for( T(j): @SUM( S(i): x(i,j) ) = 1 );@for( link: x*L <= L1 );@for( link: @bin(x) );end??運行結果如下:(已用 Excel 作處理)
??注:lingo解得的 L1 = 80.15,故最長的路程為第29個節點,但只有 8015m ,并且滿足將各個節點全部封鎖的條件。所以從 時間的角度 來看,該模型是值得肯定的。【其實這里有一個 對比方案 ,但我沒寫,那個對比方案是 以13個A區出入口到20個服務平臺的距離和最小 為規劃目標。但這個對比方案的模型計算結果沒 80.15 好。】
三、總結:
??在做 優化(/規劃)模型 的題目時,一般用 lingo 要方便一點。但在此之前,我們一般要進行一下 數據預處理。
??之后,我們要 找到并建立 以下三個東西:
????(1)目標函數
????(2)決策變量
????(3)約束條件
??最后,我沒有詳細地闡述其原理,只闡述了有什么用、怎么用。詳細原理可以參考本文最后的 參考附錄 📚 📚 📚。
四、參考附錄:
[1] 《2011高教社杯全國大學生數學建模競賽賽題 B題 數據》
鏈接: http://www.mcm.edu.cn/html_cn/node/a1ffc4c5587c8a6f96eacefb8dbcc34e.html.
[2] 《數學建模之Lingo基礎知識與應用》
鏈接: https://blog.csdn.net/sunyueqinghit/article/details/81708836.
[3] 《LINGO學習筆記01》
鏈接: https://blog.csdn.net/Temmie1024/article/details/108863568.
[4] 《算法篇——詳解 弗洛伊德(Folyd)算法【用 C/C++ 和 matlab 實現】》
鏈接: https://blog.csdn.net/Wang_Dou_Dou_/article/details/119485893?spm=1001.2014.3001.5501.
數學建模系列文章——總結篇:《數模美一國一退役選手的經驗分享[2021紀念版]》.
純手碼字 碼圖不易,多多支持 🙈🙈
總結
以上是生活随笔為你收集整理的数学建模——01规划 / 线性规划 (工具:matlab + lingo,算法:Folyd)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot websocket
- 下一篇: matlab人脸追踪,求大神帮助我这个菜