国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

數(shù)學(xué)建模十大算法03—線性規(guī)劃、整數(shù)規(guī)劃、非線性規(guī)劃、多目標(biāo)規(guī)劃

這篇具有很好參考價值的文章主要介紹了數(shù)學(xué)建模十大算法03—線性規(guī)劃、整數(shù)規(guī)劃、非線性規(guī)劃、多目標(biāo)規(guī)劃。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、線性規(guī)劃(Linear Programming,LP)

1.1 引例

在人們的生產(chǎn)實踐中,經(jīng)常會遇到如何利用現(xiàn)有資源來安排生產(chǎn),以取得最大經(jīng)濟效益的問題。 此類問題構(gòu)成了運籌學(xué)的一個重要分支一數(shù)學(xué)規(guī)劃,而線性規(guī)劃(Linear Programming, LP) 則是數(shù)學(xué)規(guī)劃的一個重要分支。

簡而言之,線性規(guī)劃就是在有限的條件下,獲得最大的收益。

【例】 某機床廠生產(chǎn)甲、乙兩種機床,每臺銷售后的利潤分別為4000元與3000元。生產(chǎn)甲機床需用A、B機器加工,加工時間分別為每臺2h和1h;生產(chǎn)乙機床需用A、B、C三種機器加工,加工時間為每臺各1h。若每天可用于加工的機器時數(shù)分別為A機器10h、B機器8h和C機器7h,問該廠應(yīng)生產(chǎn)甲、乙機床各幾臺,才能使總利潤最大?

上述問題的數(shù)學(xué)模型為:(其中, x 1 x_1 x1? x 2 x_2 x2?決策變量
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
總之,線性規(guī)劃問題是在一組線性約束條件的限制下,求一線性目標(biāo)函數(shù)最大或最小的問題。 “線性”意味著所有變量都是一次方。
在解決實際問題時,把問題歸結(jié)成一個線性規(guī)劃數(shù)學(xué)模型是很重要的一步,往往也是很困難的一步,模型建立得是否恰當(dāng),直接影響到求解。而選擇適當(dāng)?shù)臎Q策變量,是建立有效模型的關(guān)鍵之一。

1.2 線性規(guī)劃問題的解

一般線性規(guī)劃問題的(數(shù)學(xué))標(biāo)準(zhǔn)型為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

1.3 Matlab標(biāo)準(zhǔn)形式

線性規(guī)劃的目標(biāo)函數(shù)可以是求最大值,也可以是求最小值,約束條件的不等號可以是
小于等號也可以是大于等號。為了避免這種形式多樣性帶來的不便,Matlab中規(guī)定線性規(guī)劃的標(biāo)準(zhǔn)形式為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
Matlab中求解線性規(guī)劃的命令為:

[x, fval] = linprog(f, A, b)  % A和b對應(yīng)線性不等式約束
[x, fval] = linprog(f, A, b, Aeq, beq)  % Aeq和beq對應(yīng)線性等式約束
[x, fval] = linprog(f, A, b, Aeq, beq, lb, ub)  % lb和ub分別對應(yīng)決策變量的下界向量和上界向量

其中, x x x 返回決策向量的取值; f v a l fval fval 返回目標(biāo)函數(shù)的最優(yōu)值。

如果線性規(guī)劃問題的解為max形式,可以通過以下轉(zhuǎn)換,再應(yīng)用Matlab提供的方法:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
【例】 求解下列線性規(guī)劃問題。
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
將其轉(zhuǎn)換為Matlab標(biāo)準(zhǔn)形式:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
Matlab代碼實現(xiàn)為:

f = [-40;-30]  % 目標(biāo)函數(shù)中變量的系數(shù)矩陣
a = [1,1;-1,0;0,-1;240,120]  % 小于等于的約束條件中變量系數(shù)矩陣
b = [6;-1;-1;1200]  % 小于等于的約束條件中常數(shù)項矩陣

[x,y] = linprog(f, a, b)  % 從等式約束開始后都沒有,可以都不寫
y = -y  % 注意要還原成求最大值?。。。?

求解結(jié)果為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
【例】 求解下列線性規(guī)劃問題。
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
代碼如下:

clc;clear
c=[2;3;1];
a=[1,4,2;3,2,0];
b=[8;6];
[x,y]=linprog(c,-a,-b,[],[],zeros(3,1))  %這里沒有等式約束,對應(yīng)的矩陣為空矩陣

求解結(jié)果為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

1.4 投資的收益和風(fēng)險(模型建立與分析)

數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

1.4.1 符號規(guī)定和基本假設(shè)

符號規(guī)定:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
基本假設(shè):
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
注意,這里將M假設(shè)為1,可以方便后面的計算。(建模比賽中可以適當(dāng)進行假設(shè))

1.4.2 模型的分析與建立

(1)總體風(fēng)險用所投資的 s i s_i si? 中最大的一個風(fēng)險來衡量,即
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

(2)購買 s i ( i = 1 , 2 , . . . , n ) s_i(i=1,2,...,n) si?i=1,2,...,n) 所付交易費是一個分段函數(shù),即
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
而題目中所給的定值 u i u_i ui? (單位:元)相對總投資 M M M 很少, p i u i p_iu_i pi?ui? 更小,這樣購買 s i s_i si? 的凈收益可以簡化 ( r i ? p i ) x i (r_i-p_i)x_i (ri??pi?)xi? 。

(3)要使凈收益盡可能大,總體風(fēng)險盡可能小,這是一個多目標(biāo)規(guī)劃模型 。

目標(biāo)函數(shù)為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

約束條件為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

(4)模型簡化。

模型一: 在實際投資中,投資者承受風(fēng)險的程度不一樣,若給定風(fēng)險一個界限 a,使最大的一個風(fēng)險率為a,即 q i x i / M ≤ a ( i = 1 , 2 , … , n ) q_ix_i/M ≤ a (i=1,2,…,n) qi?xi?/Ma(i=1,2,,n),可找到相應(yīng)的投資方案。這樣以來就可以把多目標(biāo)規(guī)劃變成一個目標(biāo)的線性規(guī)劃。

即固定風(fēng)險水平,優(yōu)化收益:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
通俗理解,就是把原來多目標(biāo)優(yōu)化中第二個 m i n min min 目標(biāo)函數(shù)轉(zhuǎn)變?yōu)榧s束條件,只要風(fēng)險小于 a a a 都是投資者可接受的風(fēng)險范圍。

模型二: 若投資者希望總盈利至少達到水平 k k k 以上,在風(fēng)險最小的情況下尋求相應(yīng)的投資組合。

即固定盈利水平,極小化風(fēng)險:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
和模型一類似,這里將 m a x max max 目標(biāo)函數(shù)轉(zhuǎn)換為了只要總收益大于 k k k ,投資者都可以接受。

模型三: 投資者在權(quán)衡資產(chǎn)風(fēng)險和預(yù)期收益兩方面時,希望選擇一個令自己滿意的投資組合。因此對風(fēng)險收益分別賦予權(quán)重 s s s ( 1 ? s ) (1-s) (1?s) , s s s 稱為投資偏好系數(shù)。

數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
這里可以簡單理解成投資者是更注重哪一個目標(biāo),投資者傾向的那個權(quán)重設(shè)置的更大即可。

上述模型對應(yīng)的兩條思路也是在數(shù)學(xué)建模中經(jīng)常會使用到的:①將多目標(biāo)轉(zhuǎn)換為單目標(biāo)規(guī)劃;②將多目標(biāo)函數(shù)賦予相應(yīng)的權(quán)重進行搜索。

1.4.3 模型一的求解

模型一為:

數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
注意:這里將原目標(biāo)函數(shù) m a x max max 轉(zhuǎn)換成了Matlab標(biāo)準(zhǔn)型的 m i n min min 形式,就要在所有值前面加負(fù)號。
【數(shù)值細(xì)節(jié)解釋】 x 0 x_0 x0? 對應(yīng)的-0.05代表的是題目中假定的同期銀行存款利率 r 0 = 0.5 r_0=0.5 r0?=0.5 ,既無交易費又無風(fēng)險的條件。 x 1 x_1 x1? 對應(yīng)的是當(dāng)投資第一個資產(chǎn) s 1 s_1 s1? 時,其對應(yīng)的 ? ( r i ? p i ) x i -(r_i-p_i)x_i ?(ri??pi?)xi? 值。同理可得其他值。

由于 α α α 是任意給定的風(fēng)險度,不同的投資者有不同的風(fēng)險度。下面從 α = 0 α=0 α=0 開始,以步長 △ α = 0.001 △α=0.001 α=0.001 進行循環(huán)搜索。Matlab求解代碼如下:

clc,clear
a=0;
hold on
while a<0.05
    c=[-0.05,-0.27,-0.19,-0.185,-0.185];
    A=[zeros(4,1),diag([0.025,0.015,0.055,0.026])];  % 生成對角矩陣
    b=a*ones(4,1);  % 不等式約束右邊的值
    Aeq=[1,1.01,1.02,1.045,1.065];
    beq=1;
    LB=zeros(5,1);  % 下界
    [x,Q]=linprog(c,A,b,Aeq,beq,LB);
    Q=-Q;  % 注意求得是max?。。。。。。。。。。。?    plot(a,Q,'*k');
    a=a+0.001;  % 以步長α=0.001進行循環(huán)搜索
end
xlabel('a'),ylabel('Q')

運行結(jié)果為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

1.4.4 結(jié)果分析

風(fēng)險 α α α 與收益 Q Q Q 之間的關(guān)系如上圖所示,我們可以看出:
  (1) 風(fēng)險大,收益也大。
  (2) 當(dāng)投資越分散時,投資者承擔(dān)的風(fēng)險越小,這與題意一致。冒險的投資者會出現(xiàn)集中投資的情況,保守的投資者則盡量分散投資。
  (3) 在 a = 0.006 a=0.006 a=0.006 附近有一個轉(zhuǎn)折點,在這一點左邊,風(fēng)險增加很少時,利潤增長很快;在這一點右邊,風(fēng)險增加很大時,利潤增長很緩慢。所以對于風(fēng)險和收益沒有特殊偏好的投資者來說,應(yīng)該選擇曲線的轉(zhuǎn)折點作為最優(yōu)投資組合,大約是 a = 0.6 a=0.6 a=0.6%, Q = 20 Q=20 Q=20%。
  
所對應(yīng)的投資方案我們可以在代碼中加入a=0.6%查看具體的 x x x Q Q Q

     while a == 0.006
        disp(x);
        disp(Q);
        break;
    end

數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

得到具體的投資方案為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

二、整數(shù)規(guī)劃

2.1 引例

數(shù)學(xué)規(guī)劃中的變量(部分或全部)限制為整數(shù)時,稱為整數(shù)規(guī)劃。若在線性規(guī)劃模型中,變量限制為整數(shù),則稱為整數(shù)線性規(guī)劃。目前所流行的求解整數(shù)規(guī)劃的方法,往往只適用于整數(shù)線性規(guī)劃。目前還沒有一種方法能有效地求解一切整數(shù)規(guī)劃。

整數(shù)規(guī)劃的分類:
如不加特殊說明,則一般指整數(shù)線性規(guī)劃。整數(shù)線性規(guī)劃模型大致分為兩類:
1)變量全限制為整數(shù)時,稱純(完全)整數(shù)規(guī)劃。
2)變量部分限制為整數(shù)時,稱混合整數(shù)規(guī)劃。

整數(shù)規(guī)劃特點:
1)原線性規(guī)劃有最優(yōu)解,當(dāng)自變量限制為整數(shù)后,其整數(shù)規(guī)劃解出現(xiàn)下述情況。
  ①原線性規(guī)劃最優(yōu)解全是整數(shù),則整數(shù)規(guī)劃最優(yōu)解與線性規(guī)劃最優(yōu)解一致。
 ?、谡麛?shù)規(guī)劃無可行解。
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
③有可行解(當(dāng)然就存在最優(yōu)解),但最優(yōu)解值變差。
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
2)整數(shù)規(guī)劃最優(yōu)解不能按照實數(shù)最優(yōu)解簡單取整而獲得。

求解方法分類:

方法 說明
分支定界法 可求純或混合整數(shù)線性規(guī)劃
割平面法 可求純或混合整數(shù)線性規(guī)劃
隱枚舉法 求解“0-1”整數(shù)規(guī)劃。 分為過濾隱枚舉法和分支隱枚舉法。
匈牙利法 解決指派問題(0-1規(guī)劃特殊情形)
蒙特卡洛法 求解各種類型規(guī)劃

注:蒙特卡羅算法請看之前的筆記:數(shù)學(xué)建模十大算法01-蒙特卡洛算法(Monte Carlo)

2.2 “0-1 型”整數(shù)規(guī)劃

0-1型整數(shù)規(guī)劃是整數(shù)規(guī)劃中的特殊情形,它的變量 x j x_j xj? 僅取值0或1。這時 x j x_j xj? 稱為0-1變量,或稱二進制變量。 x j x_j xj? 僅取值0或1這個條件可由下述約束條件 0 ≤ x j ≤ 1 且 x j 為整數(shù) 0≤x_j≤1且 x_j 為整數(shù) 0xj?1xj?為整數(shù)所代替,是和一般整數(shù)規(guī)劃的約束條件形式一致的。在實際問題中,如果引人0-1變量,就可以把有各種情況需要分別討論的數(shù)學(xué)規(guī)劃問題統(tǒng)一在一個問題中討論了。下面先介紹引入0-1變量的實際問題。

2.2.1 相互排斥的約束條件

有兩種運輸方式可供選擇,但只能選擇一運輸方式,或者用車運輸,或者用船運輸。
用車運輸?shù)募s束條件為 5 x 1 + 4 x 2 ≤ 24 5x_1+ 4x_2≤24 5x1?+4x2?24,用船運輸?shù)募s束條件為 7 x 1 + 3 x 2 ≤ 45 7x_1 +3x_2 ≤45 7x1?+3x2?45。即有兩個相互排斥的約束條件 5 x 1 + 4 x 2 ≤ 24 或 7 x 1 + 3 x 2 ≤ 45 5x_1+ 4x_2≤24 或 7x_1 +3x_2 ≤45 5x1?+4x2?247x1?+3x2?45
為了統(tǒng)一在一個問題中,引入0-1變量:

數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

則上述約束條件可改寫為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

把相互排斥的約束條件改成普通的約束條件,未必需要引進充分大的正實數(shù),例如相互排斥的約束條件:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
如果有 m m m 個互相排斥的約束條件:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

2.2.2 指派問題的數(shù)學(xué)模型

擬分配 n n n 人去做 n n n 項工作,每人做且僅做1項工作,若分配第 i i i 人去做第 j j j 項工作,需花費 c i j c_{ij} cij? 單位時間,問應(yīng)該如何分配工作才能使工人花費的總時間最少?

思路: 只需要給出矩陣 C = c i j C = c_{ij} C=cij? (指派問題的系數(shù)矩陣)。

引入0-1變量:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
上述指派問題的數(shù)學(xué)模型為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
上述指派問題的可行解可以用一個矩陣表示,其每行、每列均有且只有一個元素為1,其余元素均為0;還可以用 1 , . . . , n 1,...,n 1,...,n 中的一個置換表示。

Matlab中指派問題可用以下語法格式實現(xiàn):

[x,fval]=intlinprog(f,intcon,a,b,aeq,beq,lb,ub)

對應(yīng)下列數(shù)學(xué)模型:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

【例】 求解下列指派問題,已知指派矩陣為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
這里需要把二維決策變量 x i j ( i , j = 1 , . . . , 5 ) x_{ij}(i,j=1,...,5) xij?(i,j=1,...,5) 變?yōu)橐痪S決策變量 y k ( k = 1 , . . . , 25 ) y_k(k=1,...,25) yk?(k=1,...,25)。可以理解成將每行每列只有一個“1”轉(zhuǎn)換為一維考慮。

數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

Matlab實現(xiàn)代碼如下:

clc,clear
c = [3 8 2 10 3; 8 7 2 9 7; 6 4 2 7 5; 8 4 2 3 5; 9 10 6 9 10];
c = c(:);  % 將矩陣c中的每列(!?。。┖喜⒊梢粋€長的列向量
a = zeros(10,25);
intcon = 1:25;

for i = 1:5
    a(i,(i-1)*5+1:5*i) = 1;  % 第i行,連續(xù)5個值為1----> 
    a(5+i,i:5:25) = 1;  %5+i行,每隔5個賦值1---->
end

b = ones(10,1);
lb = zeros(25,1);
ub = ones(25,1);
x = intlinprog(c,intcon,[],[],a,b,lb,ub)

把5個物品放入一個5×5的方陣中,且每行、每列都必須且只能有一個物品。使用混合整數(shù)線性規(guī)劃的函數(shù)intlinprog求解,就要把這5x5的位置看成25個優(yōu)化變量,每個變量只能取0或1。a和b表示等式約束,10行表示10個等式,其中前5個表示每行有一個物品,后5行表示每列有一個物品。

最終求得的最優(yōu)指派方案為:用x = reshape(x,[5,5])查看:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

【例】 求解如下的混合整數(shù)規(guī)劃問題:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
Matlab代碼如下:

clc,clear
f=[-3;-2;-1]; intcon=3;  % 整數(shù)變量的地址
a=ones(1,3); b=7;
aeq = [4 2 1]; beq=12;
lb=zeros(3,1); ub=[inf;inf;1];  % x(3)0-1變量
x=intlinprog(f,intcon,a,b,aeq,beq,lb,ub)
z=dot(f,x)  % 目標(biāo)函數(shù)的最優(yōu)值為-12

求解結(jié)果為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
【例】 某公司新購置了某種設(shè)備6臺,欲分配給下屬的4個企業(yè),已知各企業(yè)獲得這種設(shè)備后年創(chuàng)利潤如表所列(單位:千萬元)。問應(yīng)如何分配這些設(shè)備能使年創(chuàng)總利潤最大,最大利潤是多少?
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
思路:用 j = 1 , 2 , 3 , 4 j=1,2,3,4 j=1,2,3,4 分別表示甲乙丙丁四個企業(yè), c i j c_{ij} cij? 表示第 i ( i = 1 , . . . , 6 ) i(i=1,...,6) i(i=1,...,6) 臺設(shè)備分配給第 j j j 個企業(yè)創(chuàng)造的利潤,引進0-1變量:

數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

則問題的數(shù)學(xué)模型為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
Matlab代碼如下:(和上述代碼不同,這里用的是基于問題的求解方法

% 非常規(guī)指派問題
clc,clear
prob = optimproblem('ObjectiveSense','max');  % 基于問題的求解方法:ObjectiveSense可以是max和min,代表優(yōu)化最大值還是最小值,默認(rèn)是min
x = optimvar('x',6,4,'TYPE','integer','LowerBound',0,'UpperBound',1);  % x是變量名,x為64列。該函數(shù)所屬類型為int。下界為0,上界為1.
c = [4 2 3 4;6 4 5 5;7 6 7 6;7 8 8 6;7 9 8 6;7 10 8 6];
M=c.*x;
prob.Objective = sum(sum(M));  % 目標(biāo)函數(shù),目標(biāo)函數(shù)需要得到一個標(biāo)量數(shù)值,不是矩陣向量
% 約束條件 .con是標(biāo)簽,可以自己命名,多個約束條件時,必須標(biāo)簽不能一樣。
prob.Constraints.con2 =sum(x)>=1;  % 每列求和,結(jié)果大于等于1
prob.Constraints.con1 =sum(x,2)==1;  % 每行求和,結(jié)果等于1
[sol,flav,flag] = solve(prob);  % fval是最優(yōu)值,sol.x是決策變量的值,當(dāng)多個決策變量時,可以sol.y,flag在線性規(guī)劃中不用在意,在非線性規(guī)劃中注意不能為負(fù)值。
xx = sol.x
sum(sum(c.*xx))

Python實現(xiàn)代碼如下所示:

# 決策變量
n = 8
# nonneg參數(shù),變量是否為非負(fù)
x = cp.Variable(n,nonneg = True)

# 約束1
A1 = np.array([[1,1,1,0,0,0,0,0],
              [0,1,0,1,0,0,0,0],
              [0,0,1,0,1,0,0,0],
              [0,0,0,1,0,1,0,0],
              [0,0,0,0,1,1,0,0],
              [1,0,0,0,0,0,0,0],
              [0,1,0,1,0,1,0,0]])
b1 = np.array([1,1,1,1,1,1,1])

# 約束2
A2 = np.ones((8, 8))
for i in range(A2.shape[0]):
    for j in range(A2.shape[1]):
        if i == j:
            pass
        else:
            A2[i, j] = A2[i, j]*0

b2 = np.array([0,0,0,0,0,0,0,0])
# 約束3
A3 = np.ones((8, 8))
for i in range(A3.shape[0]):
    for j in range(A3.shape[1]):
        if i == j:
            pass
        else:
            A3[i, j] = A3[i, j]*0
b3 = np.array([1,1,1,1,1,1,1,1])

# 目標(biāo)函數(shù)
c = np.array([1,1,1,1,1,1,1,1])

# 定義問題,添加約束條件
prob = cp.Problem(cp.Minimize(c.T @ x),
                  [A1 @ x >= b1,
                  A2 @ x >= b2,
                  A3 @ x <= b3])

# 求解
ans = prob.solve(solver=cp.GLOP)
# 輸出結(jié)果
print("目標(biāo)函數(shù)最小值:", ans)
# 對x向量各元素取整數(shù)后再輸出
print(x.value)

運行結(jié)果為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

更多用Python實現(xiàn)的例題可參考:數(shù)學(xué)建模算法與應(yīng)用—整數(shù)規(guī)劃(cvxpy包)

指派問題的求解可以使用匈牙利算法、拍賣算法等算法,這里就不討論了。

三、非線性規(guī)劃

3.1 引例

如果目標(biāo)函數(shù)或約束條件中包含非線性函數(shù),就稱這種規(guī)劃問題為非線性規(guī)劃問題。簡而言之,就是至少有一個變量不是一次方。

一般說來,解非線性規(guī)劃要比解線性規(guī)劃問題困難得多。而且,也不像線性規(guī)劃有單純形法這一通用方法,非線性規(guī)劃目前還沒有適于各種問題的一般算法,各個方法都有自己特定的適用范圍。

3.2 Matlab求解

Matlab中非線性規(guī)劃的的數(shù)學(xué)模型寫成以下形式:

數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
Matlab中的命令是:

[x, fval] = fmincon(fun, x0, A, b, Aeq, beq, lb, ub, nonlcon)

其中,各項的含義如下表:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
注意:這里的fun是單獨函數(shù)文件里面定義的目標(biāo)函數(shù)。

【例】 求下列非線性規(guī)劃:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

第一步:編寫M函數(shù)fun1.m定義目標(biāo)函數(shù):
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
第二步:編寫M函數(shù)fun2.m定義非線性約束條件:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
第三步:編寫主程序文件如下:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
求得最優(yōu)情況下,x和y的取值為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

3.3 數(shù)學(xué)建模中的應(yīng)用

非線性規(guī)劃適用的典型賽題有:
題目中提到“怎么安排/分配”、“盡量多(少)”、“最多(少)”、“利潤最大”、“最合理”等詞,且變量要非一次方。

  • 投資規(guī)劃: 組合投資、總收益率最大/最大投資方案
  • 角度調(diào)整: 飛行管理避免相撞;影院最佳視角等;設(shè)計三角函數(shù)為非線性
  • 生產(chǎn)安排: 原材料、設(shè)備有限制,總利潤最大(目標(biāo)函數(shù)或約束條件含有非線性變量)

★【例】飛行管理問題。
在約10000m高空的某邊長160km的正方形區(qū)域內(nèi),經(jīng)常有若干架飛機作水平飛行。區(qū)域內(nèi)每架飛機的位置和速度向量均由計算機記錄其數(shù)據(jù),以便進行飛行管理。當(dāng)一架欲進入該區(qū)域的飛機到達區(qū)域邊緣時,記錄其數(shù)據(jù)后,要立即計算并判斷是否會與區(qū)域內(nèi)的飛機發(fā)生碰撞。如果會碰撞,則應(yīng)計算如何調(diào)整各架(包括新進入的)飛機飛行的方向角,以避免碰撞。現(xiàn)假定條件如下:
   
  (1) 不碰撞的標(biāo)準(zhǔn)為任意兩架飛機的距離大于8km。
  (2) 飛機飛行方向角調(diào)整的幅度不應(yīng)超過30°。
  (3) 所有飛機飛行速度均為800km/h。
  (4) 進入該區(qū)域的飛機在到達區(qū)域邊緣時,與區(qū)域內(nèi)飛機的距離應(yīng)在60km以上。
  (5) 最多需考慮6架飛機。
  (6) 不必考慮飛機離開此區(qū)域后的狀況。
  
請對這個避免碰撞的飛行管理問題建立數(shù)學(xué)模型,列出計算步驟,對以下數(shù)據(jù)進行計
算(方向角誤差不超過0.01度),要求飛機飛行方向角調(diào)整的幅度盡量小。
設(shè)該區(qū)域4個頂點的坐標(biāo)為(0,0)、(160,0)、(160,160)、(0,160)。記錄數(shù)據(jù)見表3.1。
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
注:方向角指飛行方向與 x x x 軸正向的夾角。

為方便以后的討論,引進如下記號:

數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

模型一: 目標(biāo)函數(shù)為所有飛機的調(diào)整量絕對值之和的最小值。

根據(jù)相對運動的觀點在考察兩架飛機 i i i j j j 的飛行時,可以將 i i i 視為不動,而飛機 j j j 以相對速度
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
相對于飛機 i i i 運動,對上式進行適當(dāng)?shù)挠嬎?,得?br>數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
不妨設(shè) θ j ≥ θ i θ_j ≥ θ_i θj?θi? ,此時相對飛行方向角為,如圖所示:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
由于兩架飛機的初始距離為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
因此只要當(dāng)相對非新方向角 β i j β_{ij} βij? 滿足:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
時,兩架飛機就不可能碰撞。
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
本問題中的優(yōu)化目標(biāo)函數(shù)可以有不同的形式:如使所有飛機的最大調(diào)整量最小,所有飛機的調(diào)整量絕對值之和最小等。這里以所有飛機的調(diào)整量絕對值之和最小為目標(biāo)函數(shù),可以得到如下的數(shù)學(xué)規(guī)劃模型:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
Matlab代碼如下所示:

clc,clear
x0=[150 85 150 145 130 0];
y0=[140 85 155 50 150 0];
q=[243 236 220.5 159 230 52];
xy0=[x0; y0];
d0=dist(xy0);   %求矩陣各個列向量之間的距離
d0(find(d0==0))=inf;
a0=asind(8./d0)  %以度為單位的反函數(shù)
xy1=x0+i*y0
xy2=exp(i*q*pi/180)
for m=1:6
     for n=1:6
         if n~=m
         b0(m,n)=angle((xy2(n)-xy2(m))/(xy1(m)-xy1(n))); 
         end
     end
end
b0=b0*180/pi;
dlmwrite('txt1.txt',a0,'delimiter', '\t','newline','PC');
dlmwrite('txt1.txt','~','-append');       %往純文本文件中寫LINGO數(shù)據(jù)的分割符
dlmwrite('txt1.txt',b0,'delimiter', '\t','newline','PC','-append','roffset', 1)

求得 α i j 0 α^0_{ij} αij0? 的值如表所示:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
求得 β i j 0 β^0_{ij} βij0? 的值如表所示:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
該題還有其他思路,可以參考:【數(shù)學(xué)建?!客ㄟ^調(diào)整飛行角度使飛機順利飛行(Matlab)

四、多目標(biāo)規(guī)劃

4.1 引例

簡單理解就是:既要……,又要……。
【例】某工廠生產(chǎn)產(chǎn)品Ⅰ和產(chǎn)品Ⅱ,有關(guān)數(shù)據(jù)下,若只追求最大化利潤,得到模型:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
但現(xiàn)在有3個目標(biāo):①盡量使產(chǎn)品Ⅰ的產(chǎn)量不超過產(chǎn)品Ⅱ的產(chǎn)量;②盡可能充分利用所有設(shè)備;③盡可能使利潤不少于56w。

絕對約束: 模型自帶的約束條件,必須滿足,否則是不可行解。
目標(biāo)約束: 模型中對不等式右端追求的值允許有偏差。

上述三個目標(biāo)使我們要盡可能實現(xiàn)的目標(biāo)。目標(biāo)1是“不超過”,也就是盡量“≤”;目標(biāo)2是“充分利用”,也就是盡量“=”;目標(biāo)3是“不少于”,也就是盡量“>”。

需要衡量每個目標(biāo)的完成情況,并主觀上區(qū)分三個目標(biāo)的重要性,使得整體的完成情況盡量好。

衡量每個目標(biāo)的完成情況:正負(fù)偏差變量,絕對約束目標(biāo)約束,優(yōu)先因子。
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
加上與目標(biāo)值差值,減去超過目標(biāo)值的部分。即多退少補,把目標(biāo)函數(shù)變成了等式約束條件。

優(yōu)先因子: 主觀上確定優(yōu)先因子 P k P_k Pk? ,優(yōu)先滿足那個目標(biāo)。

數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
回到最原始的例子,得到多目標(biāo)規(guī)劃模型:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
其中,第二個等式代表第一個目標(biāo):盡量使產(chǎn)品Ⅰ的產(chǎn)量不超過Ⅱ的產(chǎn)量。第三個等式表示第二個目標(biāo):盡可能充分利用所有設(shè)備。第四個等式表示第三個目標(biāo):盡可能使利潤不少于56萬。注意這里的優(yōu)化函數(shù)中P體現(xiàn)了重要性。

4.2 Matlab求解

fgoalattain函數(shù)或者序貫算法或者用Lingo求解。

語法格式如下:

[X,FVAL] = fgoalattain(fun,x0,goal,a,b,Aeq,Beq,LB,UB,nonlcon);
  1. X 為最終解 , FVAL為最終解對應(yīng)的函數(shù)值。 注意:求最大值時,結(jié)果FVAL需要取反
  2. fun是定義的決策函數(shù),通常通過M文件或者匿名函數(shù)進行定義。 注意:當(dāng)所求為最大值時,系數(shù)需要取反。
  3. goal為欲達到的目標(biāo),通常通過linprog函數(shù)先計算得到每個決策函數(shù)目標(biāo)值
  4. a 為約束條件中不等式組的系數(shù)矩陣 ,a的列數(shù)等于f的列數(shù)。 注意:當(dāng)不等號為 > 或 ≥ 時,矩陣需要取反
  5. b 為約束條件中不等式組右邊的值。 注意:當(dāng)不等號為 > 或 ≥ 時,矩陣需要取反
  6. Aeq 為約束條件中等式組的系數(shù)矩陣 ,Aeq的列數(shù)等于f的列數(shù)
  7. Beq 為約束條件中等式組右邊的值
  8. LB、UB是解的范圍
  9. nonlcon 為定義的向量函數(shù)

【例】 求解多目標(biāo)線性規(guī)劃問題。
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言
Matlab求解代碼如下:

a = [-1,-1,0,0;0,0,-1,-1;3,0,2,0;0,3,0,2];  % 不等式約束左邊x系數(shù)
b = [-30;-30;120;48];  % 不等式約束右邊值
c1 = [-100,-90,-80,-70];  % 第一個目標(biāo)函數(shù)的系數(shù)
c2 = [0,3,0,2];  % 第二個目標(biāo)函數(shù)的系數(shù)
fun = @(x)[c1;c2]*x;  % 目標(biāo)函數(shù)
[x1,g1] = linprog(c1,a,b,[],[],zeros(4,1));  % 求解第一個目標(biāo)
[x2,g2] = linprog(c2,a,b,[],[],zeros(4,1));  % 求解第二個目標(biāo)

g3 = [g1,g2];  % ★★
[x,fval] = fgoalattain(fun,rand(4,1),g3,abs(g3),a,b,[],[],zeros(4,1))  % abs(g3)為權(quán)重項

運行結(jié)果為:
數(shù)學(xué)規(guī)劃算法,數(shù)學(xué)建模十大算法,算法,matlab,開發(fā)語言

參考資料

[1] 數(shù)學(xué)建?!麛?shù)規(guī)劃筆記
[2] 數(shù)學(xué)建模算法與應(yīng)用—整數(shù)規(guī)劃(cvxpy包)
[3] 數(shù)學(xué)建模3.9—多目標(biāo)規(guī)劃文章來源地址http://www.zghlxwxcb.cn/news/detail-538426.html

到了這里,關(guān)于數(shù)學(xué)建模十大算法03—線性規(guī)劃、整數(shù)規(guī)劃、非線性規(guī)劃、多目標(biāo)規(guī)劃的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 數(shù)學(xué)建模(二)線性規(guī)劃

    數(shù)學(xué)建模(二)線性規(guī)劃

    課程推薦:6 線性規(guī)劃模型基本原理與編程實現(xiàn)_嗶哩嗶哩_bilibili 目錄 一、線性規(guī)劃的實例與定義 1.1 線性規(guī)劃的實例 1.2 線性規(guī)劃的定義 1.3 最優(yōu)解 1.4 線性規(guī)劃的Mathlab標(biāo)準(zhǔn)形式 1.5 使用linprog函數(shù) 二、線性規(guī)劃模型建模實戰(zhàn)與代碼 2.1 問題提出 2.2 基本假設(shè) 2.3 模型的分析與建

    2024年02月12日
    瀏覽(26)
  • 數(shù)學(xué)建?!€性規(guī)劃類

    數(shù)學(xué)建?!€性規(guī)劃類

    [x,y]=linprog(c,A,b,Aeq,beq,lb,ub) 例如: max需要加負(fù)號變成min、=需要加負(fù)號變成= matlab (1)基于求解器 (2)基于問題 con中根據(jù)符號分類 python (1)絕對值 (2)min(max(q*x)) (見風(fēng)投案例模型二) 【0】題目描述 【1】模型一 模型一:設(shè)定風(fēng)險度的最大接受值,在不太冒險的情況下

    2024年02月13日
    瀏覽(24)
  • 數(shù)學(xué)建模整理-線性規(guī)劃、整數(shù)規(guī)劃、非線性規(guī)劃

    數(shù)學(xué)建模整理-線性規(guī)劃、整數(shù)規(guī)劃、非線性規(guī)劃

    在人們的生產(chǎn)實踐中,經(jīng)常會遇到如何利用現(xiàn)有資源來安排生產(chǎn),以取得最大經(jīng)濟 效益的問題。若目標(biāo)函數(shù)及約束條件均為線性函數(shù),則稱為線性規(guī)劃(Linear Programming 簡記 LP)。 可行解 :滿足約束條件的解。 可行預(yù) :所有可行解構(gòu)成的集合稱為問題的可行域,記為R。 圖解法

    2024年02月06日
    瀏覽(33)
  • 數(shù)學(xué)建模| 線性規(guī)劃(Matlab)

    線性規(guī)劃:約束條件和目標(biāo)函數(shù)都是線性的。簡單點說,所有的決策變量在目標(biāo)函數(shù)和約束條件中都是一次方。 Matlab函數(shù): 參數(shù)解釋: func 表示目標(biāo)函數(shù)。 A 表示不等式約束條件系數(shù)矩陣,b 表示不等式約束條件常數(shù)矩陣。 Aeq 表示等式約束條件系數(shù)矩陣,beq 表示等式約束條

    2024年02月07日
    瀏覽(30)
  • 數(shù)學(xué)建?!痉蔷€性規(guī)劃】

    數(shù)學(xué)建模【非線性規(guī)劃】

    一、非線性規(guī)劃簡介 通過分析問題判斷是用線性規(guī)劃還是非線性規(guī)劃 線性規(guī)劃:模型中所有的變量都是一次方 非線性規(guī)劃:模型中至少一個變量是非線性 非線性規(guī)劃在形式上與線性規(guī)劃非常類似,但在數(shù)學(xué)上求解卻困難很多 線性規(guī)劃有通用的求解準(zhǔn)確解的方法(單純形法

    2024年02月19日
    瀏覽(30)
  • 數(shù)學(xué)建模——非線性規(guī)劃

    數(shù)學(xué)建模——非線性規(guī)劃

    目錄 基本概念 凸規(guī)劃 判別定理 二次規(guī)劃模型 非線性規(guī)劃的求解 無約束極值問題 有約束極值問題 基于求解器的解法 基于問題的求解 其他 非線性規(guī)劃:描述目標(biāo)函數(shù)或約束條件條件的數(shù)學(xué)表達式中,至少有一個是非線性函數(shù)。 記是n維歐式空間中的一個點(n維向量),,

    2024年02月06日
    瀏覽(23)
  • MATLAB-數(shù)學(xué)建模-線性規(guī)劃-1

    目錄 1.1? 線性規(guī)劃模型的一般形式: 1.2? 線性規(guī)劃模型? ? ? ? ? minz=f(x) ? ? ? ? s.t.? ?? (i=1,2,···,m) 1和2組成的模型屬于約束優(yōu)化? f(x)稱為目標(biāo)函數(shù),稱為約束條件?? 決策變量 、 目標(biāo)函數(shù) 、 約束條件 構(gòu)成了線性規(guī)劃的3個基本要素 min? ? u=cx s.t.? ? ? Ax b ? ? ? ?

    2024年02月09日
    瀏覽(20)
  • 一、數(shù)學(xué)建模之線性規(guī)劃篇

    一、數(shù)學(xué)建模之線性規(guī)劃篇

    1.定義 2.例題 3.使用軟件及解題 1.線性規(guī)劃 (Linear Programming,簡稱LP)是一種數(shù)學(xué)優(yōu)化技術(shù),線性規(guī)劃作為運籌學(xué)的一個重要分支,專門研究在給定一組線性約束條件下,如何找到一個最優(yōu)的決策,使得目標(biāo)函數(shù)取得最大或最小值。 線性規(guī)劃屬于運籌學(xué) (Operations Research)這

    2024年02月12日
    瀏覽(22)
  • 數(shù)學(xué)建模 | 第一章 線性規(guī)劃例題

    數(shù)學(xué)建模 | 第一章 線性規(guī)劃例題

    例1.1 某機床廠生產(chǎn)甲、乙兩種機床,每臺銷售后的利潤分別為 4000 元與 3000 元。生產(chǎn)甲機床需用A、B機器加工,加工時間分別為每臺2小時和1小時;生產(chǎn)乙機床需用A、B、C三種機器加工,加工時間為每臺各一小時。若每天可用于加工的機器時數(shù)分別為A機器10小時、B機器8小時和

    2024年02月03日
    瀏覽(32)
  • 【數(shù)學(xué)建?!俊秾崙?zhàn)數(shù)學(xué)建模:例題與講解》第二講-線性規(guī)劃(含Matlab代碼)

    【數(shù)學(xué)建模】《實戰(zhàn)數(shù)學(xué)建模:例題與講解》第二講-線性規(guī)劃(含Matlab代碼)

    如果這篇文章對你有幫助,歡迎點贊與收藏~ 線性規(guī)劃(Linear Programming,LP)是一種在數(shù)學(xué)規(guī)劃領(lǐng)域中應(yīng)用廣泛的最優(yōu)化問題解決方法。其基本思想是在一系列約束條件下,通過建立線性數(shù)學(xué)模型來描述目標(biāo)函數(shù),以求得使目標(biāo)函數(shù)最大或最小的決策變量值。線性規(guī)劃在運籌學(xué)

    2024年02月04日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包