日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

备战数学建模48-数学规划模型终结篇(全)(攻坚战13)

發(fā)布時(shí)間:2023/12/10 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 备战数学建模48-数学规划模型终结篇(全)(攻坚战13) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

數(shù)學(xué)規(guī)劃是運(yùn)籌學(xué)的一個(gè)分支,其用來研究在給定約束條件下,如何按照某一目標(biāo)函數(shù),尋求最優(yōu)方案,準(zhǔn)確地說就是求解目標(biāo)函數(shù)在某一條件下的極值問題,規(guī)劃類問題是數(shù)學(xué)建模中很重要的問題,常見的有線性規(guī)劃,非線性規(guī)劃,整數(shù)規(guī)劃,0-1規(guī)劃,最大最小化模型,多目標(biāo)規(guī)劃等。

目錄

一、概述

1.1、數(shù)學(xué)規(guī)劃的概念和表現(xiàn)形式

1.2、數(shù)學(xué)規(guī)劃的分類

二、線性規(guī)劃類問題

2.1、Matlab線性規(guī)劃問題的求解

2.2、線性規(guī)劃問題的典型案例1生產(chǎn)決策問題

2.3、線性規(guī)劃問題典型案例2投料問題

三、非線性規(guī)劃類問題

3.1、非線性規(guī)劃問題的求解

3.2、非線性規(guī)劃典型例題選址問題

四、整數(shù)規(guī)劃類問題

4.1、整數(shù)規(guī)劃類問題求解

4.2、?整數(shù)規(guī)劃典型例題1之背包問題

4.3、?整數(shù)規(guī)劃典型例題2之指派問題

4.4、整數(shù)規(guī)劃典型例題3之鋼管切割問題

五、最大最小化模型

5.1、最大最小化模型的一般形式

5.2、最大最小化問題經(jīng)典例題

六、多目標(biāo)規(guī)劃問題

6.1、多目標(biāo)規(guī)劃處理方法

6.2、多目標(biāo)規(guī)劃經(jīng)典案例


一、概述

1.1、數(shù)學(xué)規(guī)劃的概念和表現(xiàn)形式

數(shù)學(xué)規(guī)劃就可以理解為求目標(biāo)函數(shù)在約束條件下的極值問題,數(shù)學(xué)規(guī)劃的一般形式包含目標(biāo)函數(shù),決策變量和約束條件三部分。

1.2、數(shù)學(xué)規(guī)劃的分類

一般將規(guī)劃類問題分為線性規(guī)劃,非線性規(guī)劃,整數(shù)規(guī)劃和0-1規(guī)劃,具體如下:

二、線性規(guī)劃類問題

2.1、Matlab線性規(guī)劃問題的求解

我們看一下下面的三個(gè)線性規(guī)劃問題,基本上大同小異,我們可以使用matlab的linprog函數(shù)求解。

對(duì)于matlab求解線性規(guī)劃問題,有如下問題需要注意,c表示目標(biāo)函數(shù),A,b表示不等式約束,Aeq,beq表示等式約束,lb,ub分別表示上下界,x0表示初始。

上面三個(gè)題目的matlab求解代碼如下:

c = [-5 -4 -6]'; % 加單引號(hào)表示轉(zhuǎn)置 A = [1 -1 1;3 2 4;3 2 0]; b = [20 42 30]'; lb = [0 0 0]'; [x fval] = linprog(c, A, b, [], [], lb) % ub我們直接不寫,則意味著沒有上界的約束 c = [0.04 0.15 0.1 0.125]'; A = [-0.03 -0.3 0 -0.15;0.14 0 0 0.07]; b = [-32 42]'; Aeq = [0.05 0 0.2 0.1]; beq = 24; lb = [0 0 0 0]'; [x fval] = linprog(c, A, b, Aeq, beq, lb) c = [-2 -3 5]'; A = [-2 5 -1;1 3 1]; b = [-10 12]; Aeq = ones(1,3); beq = 7; lb = zeros(3,1); [x fval] = linprog(c, A, b, Aeq, beq, lb) fval = -fval % 注意這個(gè)fval要取負(fù)號(hào)(原來是求最大值,我們添加負(fù)號(hào)變成了最小值問題)

2.2、線性規(guī)劃問題的典型案例1生產(chǎn)決策問題

我們看一下下面這個(gè)例題,一個(gè)生產(chǎn)決策的問題,就是根據(jù)決策變量寫出目標(biāo)函數(shù)和約束條件,最后求解目標(biāo)函數(shù)的最大值即可。

?

?matlab求解上述線性規(guī)劃問題的代碼如下,就是使用linprog函數(shù)求解:

%% 生產(chǎn)決策問題 format long g %可以將Matlab的計(jì)算結(jié)果顯示為一般的長(zhǎng)數(shù)字格式(默認(rèn)會(huì)保留四位小數(shù),或使用科學(xué)計(jì)數(shù)法) % (1) 系數(shù)向量 c = zeros(9,1); % 初始化目標(biāo)函數(shù)的系數(shù)向量全為0 c(1) = 1.25 -0.25 -300/6000*5; % x1前面的系數(shù)是c1 c(2) = 1.25 -0.25 -321/10000*7; c(3) = -250 / 4000 * 6; c(4) = -783/7000*4; c(5) = -200/4000 * 7; c(6) = -300/6000*10; c(7) = -321 / 10000 * 9; c(8) = 2-0.35-250/4000*8; c(9) = 2.8-0.5-321/10000*12-783/7000*11; c = -c; % 我們求的是最大值,所以這里需要改變符號(hào) % (2) 不等式約束 A = zeros(5,9); A(1,1) = 5; A(1,6) = 10; A(2,2) = 7; A(2,7) = 9; A(2,9) = 12; A(3,3) = 6; A(3,8) = 8; A(4,4) = 4; A(4,9) = 11; A(5,5) = 7; b = [6000 10000 4000 7000 4000]'; % (3) 等式約束 Aeq = [1 1 -1 -1 -1 0 0 0 0;0 0 0 0 0 1 1 -1 0]; beq = [0 0]'; %(4)上下界 lb = zeros(9,1);% 進(jìn)行求解 [x fval] = linprog(c, A, b, Aeq, beq, lb) fval = -fval

2.3、線性規(guī)劃問題典型案例2投料問題

我們看一下下面的投料問題,我們可以使用matlab和lingo去求解線性規(guī)劃問題,對(duì)于這一題而言,lingo求解更為簡(jiǎn)單。

如下是matlab求解上述線性規(guī)劃問題的代碼:

%% 投料問題 clear,clc format long g %可以將Matlab的計(jì)算結(jié)果顯示為一般的長(zhǎng)數(shù)字格式(默認(rèn)會(huì)保留四位小數(shù),或使用科學(xué)計(jì)數(shù)法) % (1) 系數(shù)向量 a=[1.25 8.75 0.5 5.75 3 7.25]; % 工地的橫坐標(biāo) b=[1.25 0.75 4.75 5 6.5 7.25]; % 工地的縱坐標(biāo) x = [5 2]; % 料場(chǎng)的橫坐標(biāo) y = [1 7]; % 料場(chǎng)的縱坐標(biāo) c = []; % 初始化用來保存工地和料場(chǎng)距離的向量 (這個(gè)向量就是我們的系數(shù)向量) for j =1:2for i = 1:6c = [c; sqrt( (a(i)-x(j))^2 + (b(i)-y(j))^2)]; % 每循環(huán)一次就在c的末尾插入新的元素end end % (2) 不等式約束 A =zeros(2,12); A(1,1:6) = 1; A(2,7:12) = 1; b = [20,20]'; % (3) 等式約束 Aeq = zeros(6,12); for i = 1:6Aeq(i,i) = 1; Aeq(i,i+6) = 1; end % Aeq = [eye(6),eye(6)] % 兩個(gè)單位矩陣橫著拼起來 beq = [3 5 4 7 6 11]'; % 每個(gè)工地的日需求量 %(4)上下界 lb = zeros(12,1);% 進(jìn)行求解 [x fval] = linprog(c, A, b, Aeq, beq, lb) x = reshape(x,6,2)

lingo解決上述線性規(guī)劃問題的代碼如下:

model: sets: factory /1..6/ : a,b,d ; plant /1..2/ : x,y ; coo (factory,plant) : x1 ; endsetsdata: a = 1.25, 8.75, 0.5, 5.75, 3, 7.25 ; b = 1.25, 0.75, 4.75, 5, 6.5, 7.25 ; d = 3,5,4,7,6,11 ; x = 5, 2 ; y = 1, 7 ; enddatamin = @sum(coo(i,j) : x1(i,j) * @sqrt((a(i)-x(j)) * (a(i)-x(j)) + (b(i) - y(j)) * (b(i) - y(j)))) ; @for(factory(i) : @sum(plant(j) : x1(i,j)) = d(i)) ; @for(plant(j) : @sum(factory(i) : x1(i,j)) <= 20) ; @for(factory(i) : @for(plant(j) : x1(i,j) >= 0)) ; end

三、非線性規(guī)劃類問題

3.1、非線性規(guī)劃問題的求解

我們看一下非線性規(guī)劃的標(biāo)準(zhǔn)型,aeq和b為線性不等式約束,Aeq和beq是線性等式約束,c是非線性不等式約束,ceq是非線性等式約束。

?我們先看一下matlab求解上面的函數(shù)的思路,可以使用fmincon函數(shù)進(jìn)行求解,非線性規(guī)劃的需要選取一個(gè)很好的初始值,因?yàn)榉蔷€性規(guī)劃本來求出來的就是一個(gè)局部最優(yōu)解,我們想求一個(gè)相對(duì)的全局最優(yōu)解的話,可以通過嘗試大量的解,然后找一個(gè)最優(yōu)的,也可以通過蒙特卡洛模擬出初始解,通過初始解計(jì)算最優(yōu)解。option選項(xiàng)是設(shè)置求解非線性規(guī)劃的算法,不同的算法都可以嘗試對(duì)比一下。

另外第一個(gè)@fun中的fun是目標(biāo)函數(shù),需要用一個(gè)m函數(shù)文件來存儲(chǔ),另外的@nonlfun用來表示非線性約束,就是編寫一個(gè)函數(shù)文件來存儲(chǔ)非線性約束條件。

我們看一下上面的的三個(gè)例題的matlab代碼實(shí)現(xiàn),具體如下,先使用蒙特卡洛方法模擬出一個(gè)解,然后以該解作為初始值代入fmincon函數(shù)對(duì)非線性規(guī)劃進(jìn)行求解,第一個(gè)例題具體如下:

%% 使用蒙特卡羅的方法來找初始值(推薦) clc,clear; n=10000000; %生成的隨機(jī)數(shù)組數(shù) x1=unifrnd(-100,100,n,1); % 生成在[-100,100]之間均勻分布的隨機(jī)數(shù)組成的n行1列的向量構(gòu)成x1 x2=unifrnd(-100,100,n,1); % 生成在[-100,100]之間均勻分布的隨機(jī)數(shù)組成的n行1列的向量構(gòu)成x2 fmin=+inf; % 初始化函數(shù)f的最小值為正無窮(后續(xù)只要找到一個(gè)比它小的我們就對(duì)其更新) for i=1:nx = [x1(i), x2(i)]; %構(gòu)造x向量, 這里千萬別寫成了:x =[x1, x2]if ((x(1)-1)^2-x(2)<=0) & (-2*x(1)+3*x(2)-6 <= 0) % 判斷是否滿足條件result = -x(1)^2-x(2)^2 +x(1)*x(2)+2*x(1)+5*x(2) ; % 如果滿足條件就計(jì)算函數(shù)值if result < fmin % 如果這個(gè)函數(shù)值小于我們之前計(jì)算出來的最小值fmin = result; % 那么就更新這個(gè)函數(shù)值為新的最小值x0 = x; % 并且將此時(shí)的x1 x2更新為初始值endend end disp('蒙特卡羅選取的初始值為:'); disp(x0) A = [-2 3]; b = 6; [x,fval] = fmincon(@fun1,x0,A,b,[],[],[],[],@nonlfun1) fval = -fval

使用的目標(biāo)函數(shù)fun1和非線性約束函數(shù)nonlfun如下:

function f = fun1(x)% 注意:這里的f實(shí)際上就是目標(biāo)函數(shù),函數(shù)的返回值也是f% 輸入值x實(shí)際上就是決策變量,由x1和x2組成的向量% fun1是函數(shù)名稱,到時(shí)候會(huì)被fmincon函數(shù)調(diào)用, 可以任意取名% 保存的m文件和函數(shù)名稱得一致,也要為fun1.m % max f(x) = x1^2 +x2^2 -x1*x2 -2x1 -5x2f = -x(1)^2-x(2)^2 +x(1)*x(2)+2*x(1)+5*x(2) ; end function [c,ceq] = nonlfun1(x)% 注意:這里的c實(shí)際上就是非線性不等式約束,ceq實(shí)際上就是非線性等式約束% 輸入值x實(shí)際上就是決策變量,由x1和x2組成的一個(gè)向量% 返回值有兩個(gè),一個(gè)是非線性不等式約束c,一個(gè)是非線性等式約束ceq% nonlfun1是函數(shù)名稱,到時(shí)候會(huì)被fmincon函數(shù)調(diào)用, 可以任意取名,但不能和目標(biāo)函數(shù)fun1重名% 保存的m文件和函數(shù)名稱得一致,也要為nonlfun1.m % -(x1-1)^2 +x2 >= 0 c = [(x(1)-1)^2-x(2)]; % 千萬別寫成了: (x1-1)^2 -x2ceq = []; % 不存在非線性等式約束,所以用[]表示 end

另外使用fmincon求解非線性規(guī)劃問題可以設(shè)置option選項(xiàng),就是設(shè)置求解算法,常見的求解算法有四種,分別如下:

% 使用interior point算法 (內(nèi)點(diǎn)法) option = optimoptions('fmincon','Algorithm','interior-point') [x,fval] = fmincon(@fun1,x0,A,b,[],[],[],[],@nonlfun1,option) fval = -fval% 使用SQP算法 (序列二次規(guī)劃法) option = optimoptions('fmincon','Algorithm','sqp') [x,fval] = fmincon(@fun1,x0,A,b,[],[],[],[],@nonlfun1,option) fval = -fval % 使用active set算法 (有效集法) option = optimoptions('fmincon','Algorithm','active-set') [x,fval] = fmincon(@fun1,x0,A,b,[],[],[],[],@nonlfun1,option) fval = -fval % 使用trust region reflective (信賴域反射算法) option = optimoptions('fmincon','Algorithm','trust-region-reflective') [x,fval] = fmincon(@fun1,x0,A,b,[],[],[],[],@nonlfun1,option) fval = -fval

第二個(gè)非線性規(guī)劃的例題求解過程如下,先使用蒙特卡洛模擬出一個(gè)解作為初始值,然后將初始值代入fmincon函數(shù)進(jìn)行求解,得出結(jié)果。

%% 使用蒙特卡羅的方法來找初始值(推薦) clc,clear; n=1000000; %生成的隨機(jī)數(shù)組數(shù) x1= unifrnd(0,2,n,1); % 生成在[0,2]之間均勻分布的隨機(jī)數(shù)組成的n行1列的向量構(gòu)成x1 x2 = sqrt(2-x1); % 根據(jù)非線性等式約束用x1計(jì)算出x2 x3 = sqrt((3-x2)/2); % 根據(jù)非線性等式約束用x2計(jì)算出x3 fmin=+inf; % 初始化函數(shù)f的最小值為正無窮(后續(xù)只要找到一個(gè)比它小的我們就對(duì)其更新) for i=1:nx = [x1(i), x2(i), x3(i)]; %構(gòu)造x向量, 這里千萬別寫成了:x =[x1, x2, x3]if (-x(1)^2+x(2)-x(3)^2<=0) & (x(1)+x(2)^2+x(3)^2-20<=0) % 判斷是否滿足條件result =sum(x.*x) + 8 ; % 如果滿足條件就計(jì)算函數(shù)值if result < fmin % 如果這個(gè)函數(shù)值小于我們之前計(jì)算出來的最小值fmin = result; % 那么就更新這個(gè)函數(shù)值為新的最小值x0 = x; % 并且將此時(shí)的x1 x2 x3更新為初始值endend end disp('蒙特卡羅選取的初始值為:'); disp(x0) lb = [0 0 0]; % 決策變量的下界 [x,fval] = fmincon(@fun2,x0,[],[],[],[],lb,[],@nonlfun2) % 注意 fun2.m文件和nonfun2.m文件都必須在當(dāng)前文件夾目錄下

下面是上述第2個(gè)非線性規(guī)劃的目標(biāo)函數(shù)和非線性約束函數(shù),如下:

function f = fun2(x)% f = x(1)^2+x(2)^2 +x(3)^2+8 ; f = sum(x.*x) + 8; % 可別忘了x實(shí)際上是一個(gè)向量,我們可以使用矩陣的運(yùn)算符號(hào)對(duì)其計(jì)算 end function [c,ceq] = nonlfun2(x)% 非線性不等式約束c = [-x(1)^2+x(2)-x(3)^2; % 一定要注意寫法的規(guī)范,再次強(qiáng)調(diào)這里的x是一個(gè)向量!不能把x(1)寫成x1x(1)+x(2)^2+x(3)^2-20];% 非線性等式約束ceq = [-x(1)-x(2)^2+2;x(2)+2*x(3)^2-3]; end

第三個(gè)非線性規(guī)劃的例題求解過程如下,先使用蒙特卡洛模擬出一個(gè)解,用該解作為初始值代入fmincon函數(shù)中求解該非線性規(guī)劃的解。代碼如下:

clear;clc n=10000000; %生成的隨機(jī)數(shù)組數(shù) x1=unifrnd(20,30,n,1); % 生成在[20,30]之間均勻分布的隨機(jī)數(shù)組成的n行1列的向量構(gòu)成x1 x2=x1 - 10; x3=unifrnd(-10,16,n,1); % 生成在[-10,16]之間均勻分布的隨機(jī)數(shù)組成的n行1列的向量構(gòu)成x3 fmax=-inf; % 初始化函數(shù)f的最大值為負(fù)無窮(后續(xù)只要找到一個(gè)比它大的我們就對(duì)其更新) for i=1:nx = [x1(i), x2(i), x3(i)]; %構(gòu)造x向量, 這里千萬別寫成了:x =[x1, x2, x3]if (-x(1)+2*x(2)+2*x(3)>=0) & (x(1)+2*x(2)+2*x(3)<=72) % 判斷是否滿足條件result = x(1)*x(2)*x(3); % 如果滿足條件就計(jì)算函數(shù)值if result > fmax % 如果這個(gè)函數(shù)值大于我們之前計(jì)算出來的最大值fmax = result; % 那么就更新這個(gè)函數(shù)值為新的最大值X = x; % 并且將此時(shí)的x1 x2 x3保存到一個(gè)變量中endend end disp(strcat('蒙特卡羅模擬得到的最大值為',num2str(fmax))) disp('最大值處x1 x2 x3的取值為:') disp(X) % 蒙特卡羅模擬得到的最大值為3445.6014 % 最大值處x1 x2 x3的取值為: % 22.5823101903968 12.5823101903968 12.1265223966757 A = [1 -2 -2; 1 2 2]; b = [0 72]; x0 = [ 22.58 12.58 12.13]; Aeq = [1 -1 0]; beq = 10; lb = [-inf 10 -inf]; ub = [inf 20 inf]; [x,fval] = fmincon(@fun3,x0,A,b,Aeq,beq,lb,ub,[]) % 注意沒有非線性約束,所以這里可以用[]替代,或者干脆不寫 fval = -fval

使用到的目標(biāo)函數(shù)代碼如下,由于沒有非線性約束,所以不用寫非線性函數(shù)。

function f = fun3(x)f = -prod(x); % 可別忘了x實(shí)際上是一個(gè)向量(prod表示連乘符號(hào),用法和sum類似) end

3.2、非線性規(guī)劃典型例題選址問題

我們看一下這個(gè)題目的第二問,關(guān)于選址問題的,就是現(xiàn)在的臨時(shí)料場(chǎng)不要了,新建兩個(gè)料場(chǎng),使得總的噸千米數(shù)最少,由于新料場(chǎng)的位置未知,那么這個(gè)題目就變成了一個(gè)非線性規(guī)劃的問題了。決策變量由原來的12個(gè)變成了16個(gè)。

?下面看一下matlab求解上述非線性規(guī)劃問題的代碼如下:

%% 選址問題 clear;clc format long g %可以將Matlab的計(jì)算結(jié)果顯示為一般的長(zhǎng)數(shù)字格式(默認(rèn)會(huì)保留四位小數(shù),或使用科學(xué)計(jì)數(shù)法) A =zeros(2,16); % 注意這里要改成16 A(1,1:6) = 1; A(2,7:12) = 1; b = [20,20]'; % (3) 等式約束 Aeq = zeros(6,16); % 注意這里要改成16 for i = 1:6Aeq(i,i) = 1; Aeq(i,i+6) = 1; end beq = [3 5 4 7 6 11]'; % 每個(gè)工地的日需求量 %(4)上下界 lb = zeros(16,1); % lb = [zeros(12,1); -inf*ones(4,1)]; 兩個(gè)新料場(chǎng)坐標(biāo)的下界可以設(shè)為-inf% 進(jìn)行求解 % 注意哦,這里我們只嘗試了這一個(gè)初始值,大家可以試試其他的初始值,有可能能夠找到更好的解。 % 未來我會(huì)在遺傳算法中再來看這個(gè)例題。 x0 = [3 5 0 7 0 1 0 0 4 0 6 10 5 1 2 7]; % 用第一問的結(jié)果作為初始值 [x,fval] = fmincon(@fun5,x0,A,b,Aeq,beq,lb) % 注意沒有非線性約束,所以這里可以用[]替代,或者干脆不寫 reshape(x(1:12),6,2) function f = fun5(xx) % 注意為了避免和下面的x同號(hào),我們把決策變量的向量符號(hào)用xx表示(注意xx的長(zhǎng)度為16)a=[1.25 8.75 0.5 5.75 3 7.25]; % 工地的橫坐標(biāo)b=[1.25 0.75 4.75 5 6.5 7.25]; % 工地的縱坐標(biāo)x = [xx(13) xx(15)]; % 新料場(chǎng)的橫坐標(biāo)y = [xx(14) xx(16)]; % 新料場(chǎng)的縱坐標(biāo)c = []; % 初始化用來保存工地和料場(chǎng)距離的向量 (這個(gè)向量就是我們的系數(shù)向量)for j =1:2for i = 1:6c = [c; sqrt( (a(i)-x(j))^2 + (b(i)-y(j))^2)]; % 每循環(huán)一次就在c的末尾插入新的元素endend% 下面我們要求噸千米數(shù),注意c是列向量,我們計(jì)算非線性規(guī)劃時(shí)給定的初始值x0是行向量f = xx(1:12) * c; end

lingo求解上述非線性規(guī)劃問題的代碼如下:

model: sets: factory /1..6/ : a,b,d ; plant /1..2/ : x,y ; coo (factory,plant) : x1 ; endsetsdata: a = 1.25, 8.75, 0.5, 5.75, 3, 7.25 ; b = 1.25, 0.75, 4.75, 5, 6.5, 7.25 ; d = 3,5,4,7,6,11 ; enddatamin = @sum(coo(i,j) : x1(i,j) * @sqrt((a(i)-x(j))* (a(i)-x(j)) + (b(i) - y(j)) * (b(i) - y(j)))) ; @for(factory(i) : @sum(plant(j) : x1(i,j)) = d(i)) ; @for(plant(j) : @sum(factory(i) : x1(i,j)) <= 20) ; @for(factory(i) : @for(plant(j) : x1(i,j) >= 0)) ; end

四、整數(shù)規(guī)劃類問題

4.1、整數(shù)規(guī)劃類問題求解

整數(shù)規(guī)劃問題分為線性整數(shù)規(guī)劃和非線性整數(shù)規(guī)劃問題,我們主要還是考慮線性整數(shù)規(guī)劃,非線性的一般不使用matlab自帶的函數(shù)求解,一般用蒙特卡洛模擬或者啟發(fā)式算法求解。

在matlab中求解線性整數(shù)規(guī)劃問題,一般使用intlinprog函數(shù)求解,intcon指定決策變量為整數(shù)。

我們可以看一下下面的三個(gè)簡(jiǎn)單的例子,intlinprog的用法和linprog的用法很相似,主要是加上了一個(gè)整數(shù)約束intcon。

4.2、?整數(shù)規(guī)劃典型例題1之背包問題

我們看一下這個(gè)背包問題,就是典型的0-1整數(shù)規(guī)劃問題,目標(biāo)函數(shù)總利潤(rùn)最大,約束條件總重量不超過30.

求解上面整數(shù)規(guī)劃的matlab代碼如下:

%% 背包問題(貨車運(yùn)送貨物的問題) c = -[540 200 180 350 60 150 280 450 320 120]; % 目標(biāo)函數(shù)的系數(shù)矩陣(最大化問題記得加負(fù)號(hào)) intcon=[1:10]; % 整數(shù)變量的位置(一共10個(gè)決策變量,均為0-1整數(shù)變量) A = [6 3 4 5 1 2 3 5 4 2]; b = 30; % 線性不等式約束的系數(shù)矩陣和常數(shù)項(xiàng)向量(物品的重量不能超過30) Aeq = []; beq =[]; % 不存在線性等式約束 lb = zeros(10,1); % 約束變量的范圍下限 ub = ones(10,1); % 約束變量的范圍上限 %最后調(diào)用intlinprog()函數(shù) [x,fval]=intlinprog(c,intcon,A,b,Aeq,beq,lb,ub) fval = -fval

求解上面整數(shù)規(guī)劃的lingo代碼如下:

model: sets: factory /1..10/ : x,p,t ;endsetsdata: t = 6,3,4,5,1,2,3,5,4,2; p = 540, 200, 180, 350, 60, 150, 280, 450, 320, 120; enddata max = @sum(factory(i) : (p(i) * x(i))); @sum(factory(i) : t(i)*x(i)) <= 30 ; @for(factory(i) : @bin(x(i))) ;end

4.3、?整數(shù)規(guī)劃典型例題2之指派問題

我們看一下這個(gè)指派問題,就是指派隊(duì)員i參加j種游泳比賽,使得成績(jī)最好,即用時(shí)最短,目標(biāo)函數(shù)是用時(shí)最小,約束條件是最多只能參加一個(gè)比賽,每種比賽有且只有一人參加。參加表示為1,不參加表示為0.

?上述的整數(shù)規(guī)劃問題求解的lingo代碼如下:

model: sets: factory /1..5/ ; plant /1..4/ ; coo (factory,plant) : t,x ; endsets data: t = 66.8 75.6 87 58.657.2 66 66.4 5378 67.8 84.6 59.470 74.2 69.6 57.267.4 71 83.8 62.4 ; enddata min = @sum(coo(i,j) : (t(i,j) * x(i,j))) ; @for(factory(i) : @sum(plant(j) : x(i,j)) <= 1) ; @for(plant(j) : @sum(factory(i) : x(i,j)) = 1) ; @for(factory(i) : @for(plant(j) : @bin(x(i,j))));end

4.4、整數(shù)規(guī)劃典型例題3之鋼管切割問題

我們看一下下面的鋼管切割問題,使得切割使用的原材料最少,具體如下。

?

求解上述整數(shù)規(guī)劃問題的matlab代碼如下:

%% 鋼管切割問題 %% (1)枚舉法找出同一個(gè)原材料上所有的切割方法 for i = 0: 2 % 2.9m長(zhǎng)的圓鋼的數(shù)量for j = 0: 3 % 2.1m長(zhǎng)的圓鋼的數(shù)量for k = 0:6 % 1m長(zhǎng)的圓鋼的數(shù)量if 2.9*i+2.1*j+1*k >= 6 && 2.9*i+2.1*j+1*k <= 6.9disp([i, j, k])endendend end % 有同學(xué)使用比較老的MATLAB版本,會(huì)出現(xiàn)浮點(diǎn)數(shù)計(jì)算的誤差 % 只需要將上面的if這一行進(jìn)行適當(dāng)?shù)姆趴s即可。 % if 2.9*i+2.1*j+1*k >= 6-0.0000001 && 2.9*i+2.1*j+1*k <= 6.9+0.0000001 % 有興趣的同學(xué)可以百度下:浮點(diǎn)數(shù)計(jì)算誤差%% (2) 線性整數(shù)規(guī)劃問題的求解 c = ones(7,1); % 目標(biāo)函數(shù)的系數(shù)矩陣 intcon=[1:7]; % 整數(shù)變量的位置(一共7個(gè)決策變量,均為整數(shù)變量) A = -[1 2 0 0 0 0 1; 0 0 3 2 1 0 1;4 1 0 2 4 6 1]; % 線性不等式約束的系數(shù)矩陣 b = -[100 100 100]'; % 線性不等式約束的常數(shù)項(xiàng)向量 lb = zeros(7,1); % 約束變量的范圍下限 [x,fval]=intlinprog(c,intcon,A,b,[],[],lb)

五、最大最小化模型

5.1、最大最小化模型的一般形式

我們看一下最大最小化模型的一般形式,除了目標(biāo)函數(shù)之外,其余的和常規(guī)的規(guī)劃問題沒啥區(qū)別。

5.2、最大最小化問題經(jīng)典例題

我們看一下這個(gè)選址問題,其實(shí)就是選擇一個(gè)位置,距離其余位置的總和最小,或者說,距離其它位置的最大值最小。

?求解上述最大最小化模型的matlab代碼如下:

%% 最大最小化模型 : min{max[f1,f2,···,fm]} x0 = [6, 6]; % 給定初始值 lb = [3, 4]; % 決策變量的下界 ub = [8, 10]; % 決策變量的上界 [x,feval] = fminimax(@fun,x0,[],[],[],[],lb,ub) max(feval) function f = fun(x)a=[1 4 3 5 9 12 6 20 17 8];b=[2 10 8 18 1 4 5 10 8 9];% 函數(shù)向量f=zeros(10,1);for i = 1:10f(i) = abs(x(1)-a(i))+abs(x(2)-b(i)); end % f(1) = abs(x(1)-a(1))+abs(x(2)-b(1)); % f(2) = abs(x(1)-a(2))+abs(x(2)-b(2)); % f(3) = abs(x(1)-a(3))+abs(x(2)-b(3)); % f(4) = abs(x(1)-a(4))+abs(x(2)-b(4)); % f(5) = abs(x(1)-a(5))+abs(x(2)-b(5)); % f(6) = abs(x(1)-a(6))+abs(x(2)-b(6)); % f(7) = abs(x(1)-a(7))+abs(x(2)-b(7)); % f(8) = abs(x(1)-a(8))+abs(x(2)-b(8)); % f(9) = abs(x(1)-a(9))+abs(x(2)-b(9)); % f(10) = abs(x(1)-a(10))+abs(x(2)-b(10)); end

lingo求解上述最大最小化問題的代碼如下:

model: sets: factory /1..10/ : a, b; endsets data: a = 1 4 3 5 9 12 6 20 17 8 ; b = 2 10 8 18 1 4 5 10 8 9 ; enddata min = @sum(factory(i):(@abs(x-a(i)) + @abs(y-b(i)))); x>=3; x<=8; y>=4; y<=10; end

六、多目標(biāo)規(guī)劃問題

6.1、多目標(biāo)規(guī)劃處理方法

多目標(biāo)規(guī)劃就是有多個(gè)目標(biāo)函數(shù),我們對(duì)多目標(biāo)規(guī)劃的解決方法是加權(quán)組合轉(zhuǎn)換成單目標(biāo)規(guī)劃問題求解,但是需要注意一些事項(xiàng):比如統(tǒng)一轉(zhuǎn)換成最大化或最小化問題還有就是如果有量綱問題,需要進(jìn)行消除量綱后 再加權(quán)處理。

6.2、多目標(biāo)規(guī)劃經(jīng)典案例

我們可以看一下這個(gè)例題,當(dāng)然這個(gè)例題很簡(jiǎn)單,直接加權(quán)轉(zhuǎn)換成一個(gè)線性規(guī)劃問題,然后求解即可,我們可以考慮改變兩個(gè)目標(biāo)函數(shù)的權(quán)重,然后進(jìn)行靈敏度分析,這個(gè)在建模中也是加分項(xiàng)。

求解上述多目標(biāo)規(guī)劃的matlab代碼如下:

%% 多目標(biāo)規(guī)劃問題 clc; clear; w1 = 0.4; w2 = 0.6; % 兩個(gè)目標(biāo)函數(shù)的權(quán)重 x1 = 5 x2 = 2 %w1 = 0.5; w2 = 0.5; % 兩個(gè)目標(biāo)函數(shù)的權(quán)重 x1 = 5 x2 = 2 %w1 = 0.3; w2 = 0.7; % 兩個(gè)目標(biāo)函數(shù)的權(quán)重 x1 = 1 x2 = 6 c = [w1/30*2+w2/2*0.4 ;w1/30*5+w2/2*0.3]; % 線性規(guī)劃目標(biāo)函數(shù)的系數(shù) A = [-1 -1]; b = -7; % 不等式約束 lb = [0 0]'; ub = [5 6]'; % 上下界 [x,fval] = linprog(c,A,b,[],[],lb,ub) f1 = 2*x(1)+5*x(2) f2 = 0.4*x(1) + 0.3*x(2)

通過改變權(quán)重進(jìn)行敏感度分析的模擬,具體的代碼如下:

%% 敏感性分析 clear;clc W1 = 0.1:0.001:0.5; W2 = 1- W1; n =length(W1); F1 = zeros(n,1); F2 = zeros(n,1); X1 = zeros(n,1); X2 = zeros(n,1); FVAL = zeros(n,1); A = [-1 -1]; b = -7; % 不等式約束 lb = [0 0]; ub = [5 6]; % 上下界 for i = 1:nw1 = W1(i); w2 = W2(i);c = [w1/30*2+w2/2*0.4 ;w1/30*5+w2/2*0.3]; % 線性規(guī)劃目標(biāo)函數(shù)的系數(shù)[x,fval] = linprog(c,A,b,[],[],lb,ub);F1(i) = 2*x(1)+5*x(2);F2(i) = 0.4*x(1) + 0.3*x(2);X1(i) = x(1);X2(i) = x(2);FVAL(i) = fval; end% 「Matlab」“LaTex字符匯總”講解:https://blog.csdn.net/Robot_Starscream/article/details/89386748 % 在圖上可以加上數(shù)據(jù)游標(biāo),按住Alt加鼠標(biāo)左鍵可以設(shè)置多個(gè)數(shù)據(jù)游標(biāo)出來。 figure(1) plot(W1,F1,W1,F2) xlabel('f_{1}的權(quán)重') ylabel('f_{1}和f_{2}的取值') legend('f_{1}','f_{2}')figure(2) plot(W1,X1,W1,X2) xlabel('f_{1}的權(quán)重') ylabel('x_{1}和x_{2}的取值') legend('x_{1}','x_{2}')figure(3) plot(W1,FVAL) % 看起來是兩個(gè)直線組合起來的下半部分 xlabel('f_{1}的權(quán)重') ylabel('綜合指標(biāo)的值')

我們可以看一下敏感度分析的結(jié)果,具體如下,通過改變權(quán)重,目標(biāo)函數(shù)f1的權(quán)重轉(zhuǎn)折點(diǎn),f1權(quán)重越小,說明生成A越大,對(duì)污染就越大,那么廠家更傾向于生成B類的。

總結(jié)

以上是生活随笔為你收集整理的备战数学建模48-数学规划模型终结篇(全)(攻坚战13)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。