?模型簡(jiǎn)介
? 本質(zhì)
既要XXX,又要XXX
? 回顧:(非)線性規(guī)劃都是一個(gè)目標(biāo)函數(shù),例如工業(yè)生產(chǎn)產(chǎn)品,追求最大化利潤(rùn)等等。
? 例如:某工廠生產(chǎn)產(chǎn)品Ⅰ和產(chǎn)品Ⅱ,有關(guān)數(shù)據(jù)如下,若只追求最大化利潤(rùn),得到模型:

? 多目標(biāo)
現(xiàn)在設(shè)有3個(gè)目標(biāo):
? 1.盡量使產(chǎn)品Ⅰ的產(chǎn)量不超過產(chǎn)品Ⅱ的產(chǎn)量;
? 2.盡可能充分利用設(shè)備,但不希望加班
? 3.盡可能使利潤(rùn)不少于56萬
? 翻譯翻譯
? 目標(biāo)1是“不超過”,也就是盡量“?”
? 目標(biāo)2是“充分利用又不加班”,也就是盡量“=”
? 目標(biāo)3是“不少于”,也就是盡量“?”
? “盡可能”的意思是,能滿足最好
? 若滿足不了,就要在多個(gè)目標(biāo)中做出取舍
? 隱藏條件:原材料有限,生產(chǎn)總消耗無法超出原材料
? 解題思路
? 需要衡量每個(gè)目標(biāo)的完成情況;
? 如果三個(gè)目標(biāo)有一定沖突,要在主觀上區(qū)分三個(gè)目標(biāo)的重要性;
? 使得整體的完成情況盡量好。
? 多目標(biāo)規(guī)劃難在哪?
? 極端例題:盡量保證每天吃的肉不少5斤,且盡可能保持體重在100斤以下
? “既要”“又要”,但有時(shí)難以同時(shí)滿足所有目標(biāo)
? 如何衡量每個(gè)目標(biāo)的完成情況
? 正偏差變量為實(shí)際值超過目標(biāo)值的部分,
? 負(fù)偏差變量為實(shí)際值未達(dá)到目標(biāo)值的部分,(為整數(shù))
? 第3個(gè)目標(biāo)要求不少于目標(biāo)值,意味著負(fù)偏差變量越小越好
? 約束必須滿足么?
? 生產(chǎn)用的原材料用完了就沒了,所以“原材料有限”為絕對(duì)約束,必須滿足
? 有些目標(biāo)例如盡可能使利潤(rùn)不少于56萬,對(duì)追求的目標(biāo)值允許有偏差,稱為目標(biāo)約束
? 目標(biāo)太多,難以都滿足,應(yīng)該先滿足誰?
? 多個(gè)目標(biāo)可能難以同時(shí)滿足,到底哪個(gè)更重要?需要確定優(yōu)先因子
? 模型建立的基本原理:將目標(biāo)約束轉(zhuǎn)化為偏差變量表示的目標(biāo)函數(shù)和等式約束

?適用賽題
? 生產(chǎn)規(guī)劃:
使XXX最少/多/利潤(rùn)最大,且盡可能XXX,盡量XXX,在…基礎(chǔ)上優(yōu)化XXX;


?典型例題
? 某工廠生產(chǎn)產(chǎn)品Ⅰ和產(chǎn)品Ⅱ,有關(guān)數(shù)據(jù)如下,
? 1.盡量使產(chǎn)品Ⅰ的產(chǎn)量不超過產(chǎn)品Ⅱ的產(chǎn)量;
? 2.盡可能充分利用設(shè)備,但不希望加班
? 3.盡可能使利潤(rùn)不少于56萬

? 需要衡量每個(gè)目標(biāo)的完成情況,并區(qū)分三個(gè)目標(biāo)的重要性,使得整體的完成情況盡量好
? 引入三個(gè)概念:正負(fù)偏差變量,絕對(duì)約束和目標(biāo)約束,優(yōu)先因子
?三個(gè)概念
? 概念一:正負(fù)偏差變量,衡量每個(gè)目標(biāo)的完成情況

? 該目標(biāo)是“盡可能使利潤(rùn)不少于56萬”,超了好還是差了好?當(dāng)然超了好!而且超再多也不怕
? 即正偏差變量是多少,都無所謂;
? 而該目標(biāo)追求“盡量不少于”,意味著負(fù)偏差變量越小越好
? 目標(biāo)函數(shù)(根據(jù)偏差變量)
? 第1個(gè)目標(biāo)要求不超過目標(biāo)值,意味著正偏差變量 越小越好
? 利用優(yōu)先因子,從題目要求的目標(biāo)3中獲得目標(biāo)函數(shù):

? 第3個(gè)目標(biāo)要求不少于目標(biāo)值,意味著負(fù)偏差變量越小越好
? 利用優(yōu)先因子,從題目要求的目標(biāo)3中獲得目標(biāo)函數(shù):

? 第2個(gè)目標(biāo)的子目標(biāo)
? 第2個(gè)目標(biāo)中其實(shí)包含兩個(gè)子目標(biāo): “充分利用設(shè)備”和“不希望加班”
? 正偏差變量代表加班時(shí)間, 負(fù)偏差變量
代表沒有充分利用設(shè)備的時(shí)間
? “充分利用設(shè)備”意味著總生產(chǎn)時(shí)間不少于10,即? 10
? “不希望加班”意味著總生產(chǎn)時(shí)間不大于10,即? 10
? 同時(shí)滿足這兩條,就是對(duì)這兩個(gè)子目標(biāo)取交集,所以目標(biāo)2寫做: = 10
? 所以第2個(gè)目標(biāo)要求等于目標(biāo)值,意味著正負(fù)偏差都盡量小
? 利用優(yōu)先因子,從題目要求的目標(biāo)2中獲得目標(biāo)函數(shù):

? 第2個(gè)目標(biāo)細(xì)化
? 上一頁(yè)中,目標(biāo)函數(shù)min( +
)是基于目標(biāo)2中的兩個(gè)子目標(biāo)重要性相同的前提
? 現(xiàn)實(shí)中,“充分利用設(shè)備”和“不希望加班”還是存在重要性的差別
? 假如題目中提到“近期訂單較多”之類的語句,那么“不希望加班”的重要性就較低
? 此時(shí)可給 和
再分別賦權(quán)重,稱為權(quán)系數(shù),以區(qū)分重要性,例如目標(biāo)函數(shù)改為:

? 意味著“不加班”的重要性較低,讓步于“充分利用設(shè)備”
? 本課程例題不考慮該類情況,依舊使用min ( +
)
? 補(bǔ)充:類似的情況,比如在銷售時(shí)有“盡量把所有產(chǎn)品都賣完” 的目標(biāo),但不同產(chǎn)品利潤(rùn)不一樣,現(xiàn)實(shí)中當(dāng)然是先盡量把利潤(rùn)高的賣完,這種目標(biāo)就可根據(jù)利潤(rùn)比來給同一個(gè)目標(biāo)下的不同偏差變量設(shè)定權(quán)重
? 概念二:絕對(duì)約束和目標(biāo)約束
? 絕對(duì)約束
是模型中自帶的約束條件,必須滿足,否則是不可行解
? 例如 ? 11,使用材料的數(shù)量不能超過總量(總不能憑空變出來材料吧)
? 目標(biāo)約束
是模型中對(duì)不等式右端追求的值允許有偏差
? 以目標(biāo)3為例:盡可能使利潤(rùn)不少于56萬,也就是?? = ? 56
? “盡可能”三個(gè)字意味著允許有偏差,也就是多于56或少于56都行
? “偏差”就是加入正負(fù)偏差變量,變成: 8+ 10
+
=56
? 利用正負(fù)偏差變量,從目標(biāo)3中獲得等式約束條件(加上不足的減去多余的)

? 利用實(shí)際值與目標(biāo)值之間存在“偏差”,即正負(fù)偏差變量,多退少補(bǔ)
? 把目標(biāo)函數(shù)中的不等式約束變成了等式約束
? 實(shí)際值加上未達(dá)到的部分、減去超過的部分,就等于目標(biāo)值
? 概念三:優(yōu)先因子
? 三個(gè)目標(biāo):1.盡量使產(chǎn)品Ⅰ的產(chǎn)量不超過產(chǎn)品Ⅱ的產(chǎn)量;2.盡可能充分利用設(shè)備,但不希望加
班; 3.盡可能使利潤(rùn)不少于56
? 這三者可能難以同時(shí)滿足,到底哪個(gè)更重要?
? 例如,根據(jù)文獻(xiàn)或題目要求等,目標(biāo)1最重要,設(shè)最重要的目標(biāo)的優(yōu)先因子是p1
? 目標(biāo)2第二重要,設(shè)其優(yōu)先因子是p2
? 目標(biāo)3第三重要,設(shè)其優(yōu)先因子是p3
? 那么三個(gè)目標(biāo)重要性就是目標(biāo)1>目標(biāo)2>目標(biāo)3
? 注意:不同的求解方法下,優(yōu)先因子的作用是不同的
? 序貫算法中,優(yōu)先因子只是用來區(qū)分目標(biāo)的相對(duì)重要性,不需要其具體數(shù)值
? 而在線性加權(quán)法中,需要確定具體數(shù)值(該方法過于簡(jiǎn)單、適用性小,不建議使用)
? 序貫算法的具體操作會(huì)在第四部分代碼求解時(shí)講解
? 總結(jié)
? 題目:某工廠生產(chǎn)產(chǎn)品Ⅰ和產(chǎn)品Ⅱ,有關(guān)數(shù)據(jù)如下,有3個(gè)目標(biāo):
? 1.盡量使產(chǎn)品Ⅰ的產(chǎn)量不超過產(chǎn)品Ⅱ的產(chǎn)量;
? 2.盡可能充分利用設(shè)備且不加班;
? 3.盡可能使利潤(rùn)不少于56萬

? 解題基本步驟
? 根據(jù)目標(biāo)約束寫出等式約束條件;
? 根據(jù)正負(fù)偏差變量和優(yōu)先因子,得到不同目標(biāo)的目標(biāo)函數(shù);

? 別忘了題目還有絕對(duì)約束: ? 11,因?yàn)樯a(chǎn)材料有限

因?yàn)槠钪泻衳所以目標(biāo)函數(shù)中是含有x變量的,得出最后求解偏差的式子
?代碼求解
? 求解多目標(biāo)規(guī)劃
? 通用解法:
? 根據(jù)優(yōu)先因子的先后次序,將問題分解成單目標(biāo)規(guī)劃
? 三個(gè)目標(biāo),每個(gè)目標(biāo)都可視為單目標(biāo)的線性規(guī)劃
? 常用解法:序貫算法
? 根據(jù)模型中各個(gè)目標(biāo)的優(yōu)先級(jí)(優(yōu)先因子),確定各目標(biāo)的求解次序(盡量減少主觀性不設(shè)置數(shù)值只設(shè)置p1,p2,p3等)
? 求第一級(jí)單目標(biāo)規(guī)劃的最優(yōu)值記為
? 以第一級(jí)單目標(biāo)等于最優(yōu)值為新的約束,求第二級(jí)目標(biāo)最優(yōu)值,記為
? 依次遞推,直到所有目標(biāo)都求完,或不存在可行解為止
? 多目標(biāo)規(guī)劃還涉及帕累托解等概念,以后補(bǔ)充。
? 代碼分析
? 求第一級(jí)目標(biāo)(i=1)時(shí)
? 目標(biāo)函數(shù)和約束條件,對(duì)于三個(gè)目標(biāo)的偏差變量都沒有約束
? 代碼中用小于等于一個(gè)很大的數(shù)來表示。但既然說沒有約束,那不寫這三個(gè)約束不就行了么?
? 為的是后面有約束時(shí)只要更新不等式右邊的數(shù)值即可,而不必增加新的約束,便于簡(jiǎn)化代碼

? 求第二級(jí)目標(biāo)(i=2)時(shí)
? 因?yàn)榈谝患?jí)求得最優(yōu)值= 0 ,把該條作為新約束加入約束條件里
? 因?yàn)槊恳粋€(gè)目標(biāo)都是最小化偏差變量,所以新加入的約束寫作? 0,等價(jià)于
= 0
? 思考:為什么取“?”等價(jià)于“=”?既然等價(jià),為什么不直接寫= 0?
? 這樣做是為了代碼簡(jiǎn)潔統(tǒng)一,只要更新不等式右邊的數(shù)值即可
? 此時(shí)的目標(biāo)函數(shù)和約束條件:

? 求第三級(jí)目標(biāo)(i=3)時(shí)
? 第二級(jí)求得最優(yōu)解+
= 0,把該條加入約束條件里
? 與上一頁(yè)所講的一樣,同樣以小于等于代替等于
? 此時(shí)的目標(biāo)函數(shù)和約束條件:

? 求解結(jié)果
? 三級(jí)都求完了,迭代結(jié)束,求得滿意解為 = 2,
= 4。得數(shù)為整數(shù),如果是小數(shù)可以使用整數(shù)規(guī)劃,多加一個(gè)約束條件,向下取整以保證滿足約束條件
? 在優(yōu)先考慮盡量使產(chǎn)品Ⅰ產(chǎn)量不超過產(chǎn)品Ⅱ,其次盡可能充分利用設(shè)備且不加班,最后盡可能使利潤(rùn)不少于56萬的情況下,應(yīng)該安排每天生產(chǎn)2臺(tái)設(shè)備Ⅰ,4臺(tái)設(shè)備Ⅱ。
? 注意多目標(biāo)規(guī)劃求得的叫做“滿意解”而不是“最優(yōu)解”
? 多目標(biāo)規(guī)劃沒有最優(yōu)的概念
? 因?yàn)樵谇蠼膺^程中,三個(gè)目標(biāo)的重要性的設(shè)定是具有主觀性的,比賽時(shí)應(yīng)盡量避免主觀性
? 假如改變?nèi)齻€(gè)目標(biāo)的重要性排序,那么求解結(jié)果也會(huì)變
本節(jié)課涉及的優(yōu)化變量optimvar、優(yōu)化問題optimproblem概念
MATLAB官方講解:
https://ww2.mathworks.cn/help/optim/ug/optimvar.html
https://ww2.mathworks.cn/help/optim/ug/optim.problemdef.optimizationproblem.solve.html?searchHighlight=solve&s_tid=srchtitle_solve_2
當(dāng)前模型:

? 代碼實(shí)現(xiàn)
clc, clear
% 使用優(yōu)化變量、優(yōu)化問題來求解
% 創(chuàng)建優(yōu)化變量x,dp和dm,類似于利用C++的類optimvar來創(chuàng)建對(duì)象x,dp,dm
% 可以用來為目標(biāo)函數(shù)和問題約束創(chuàng)建表達(dá)式;optimvar是matlab自帶的關(guān)鍵詞,意思是要定義優(yōu)化變量x(里外統(tǒng)一)
x = optimvar('x',2,'LowerBound',0); % 定義兩個(gè)變量x,最小值lowerbound(matlab自帶關(guān)鍵詞)都為0
dp = optimvar('dp',3,'LowerBound',0); % 定義3個(gè)正偏差變量dp,最小值都為0
dm = optimvar('dm',3,'LowerBound',0); % 定義3個(gè)負(fù)偏差變量dm,最小值都為0
% 創(chuàng)建求最小值的優(yōu)化問題p;optimproblem(自帶)創(chuàng)建優(yōu)化類問題
p=optimproblem('ObjectiveSense','min'); %objectivesense表示設(shè)置的問題類型(一個(gè)屬性),本句表示求解問題的最小值
%還有其他屬性,可自行查詢

% 設(shè)置優(yōu)化問題的約束條件
p.Constraints.cons1 = ( 2*x(1)+x(2)<=11 ); %constraints(關(guān)鍵詞)表示約束條件;cons1為約束條件的第一條,也可表示第一次寫入約束條件(可以寫一條,也可以寫多條,多條時(shí)換行即可,不需要加符號(hào))
% 注意,表示相等關(guān)系用的符號(hào)是"=="
p.Constraints.cons2=[x(1)-x(2)+dm(1)-dp(1)==0
x(1)+2*x(2)+dm(2)-dp(2)==10
8*x(1)+10*x(2)+dm(3)-dp(3)==56];

% 設(shè)置目標(biāo)函數(shù)obj
obj=[dp(1); dm(2)+dp(2); dm(3)];
% 單級(jí)目標(biāo)函數(shù)的最優(yōu)值goal,初始設(shè)為足夠大的數(shù)
% 非常寬松的約束就等于沒有約束,確保第一級(jí)的正常運(yùn)算
goal=100000*ones(3,1); %三行一列的矩陣,每個(gè)數(shù)都是100000
for i=1:3
% 重要:更新上一級(jí)的最優(yōu)值,作為該級(jí)的約束條件;
p.Constraints.cons3=[obj<=goal]; %增加一個(gè)新約束,<=在此處只有=的作用,有小于好處是在迭代中直接更改右邊的數(shù)值,簡(jiǎn)化編程過程,而小于號(hào)無影響是因?yàn)樯弦患?jí)已經(jīng)求出來的就是最優(yōu)解
p.Objective=obj(i);
[sx,fval]=solve(p); % 針對(duì)優(yōu)化問題使用solve,會(huì)自動(dòng)選擇求解方式*****很好用
fprintf('第%d級(jí)目標(biāo)求解為:\n',i)
fval, xx=sx.x, sdm=sx.dm, sdp=sx.dp %sx.x表示最優(yōu)解中x的數(shù)值,sx中還含有其他參數(shù)
goal(i)=fval; %更新迭代
end
代碼中的solve()用來求解優(yōu)化類問題,會(huì)自動(dòng)判斷問題類型并調(diào)用默認(rèn)求解器
求每一級(jí)目標(biāo)(i=1,2,3)時(shí)相應(yīng)變化的約束條件見PPT
三級(jí)都求完了,迭代結(jié)束,求得滿意解為。即應(yīng)該安排每天生產(chǎn)2臺(tái)設(shè)備Ⅰ,4臺(tái)設(shè)備Ⅱ。文章來源:http://www.zghlxwxcb.cn/news/detail-594120.html
注意多目標(biāo)規(guī)劃求得的叫做“滿意解”而不是“最優(yōu)解”,多目標(biāo)規(guī)劃的最終解沒有最優(yōu)的概念。因?yàn)樵谇蠼膺^程中,三個(gè)目標(biāo)的重要性的設(shè)定是具有主觀性的,假如改變?nèi)齻€(gè)目標(biāo)的重要性排序,那么求解結(jié)果也會(huì)變。文章來源地址http://www.zghlxwxcb.cn/news/detail-594120.html
到了這里,關(guān)于美賽BOOM數(shù)學(xué)建模BOOM1-4多目標(biāo)規(guī)劃的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!