1. 核心原理簡介
1.1 三個(gè)重要概念
(1) 正負(fù)偏差變量
【衡量每個(gè)目標(biāo)的完成情況】
設(shè)??為第i個(gè)目標(biāo)函數(shù)的實(shí)際值;
設(shè)??表示??的目標(biāo)值
- 正偏差變量
? 【表示實(shí)際值超過目標(biāo)值的部分】
?
- ?負(fù)偏差變量?【表示實(shí)際值未達(dá)到目標(biāo)值的部分】
?
?實(shí)例說明:
目標(biāo)函數(shù)實(shí)際值 目標(biāo)值 正偏差變量
負(fù)偏差變量
意義 收入50萬 不少于60萬 0 10 未到達(dá)還有10萬 收入70萬 10 0 超出10萬
?(2)?絕對約束與目標(biāo)約束
- 絕對約束
【必須要滿足的條件】
- 目標(biāo)約束
【允許有偏差→利用正負(fù)偏差變量】
實(shí)例說明:【含有“盡可能”、“盡量”等關(guān)鍵詞】
盡可能使利潤不低于56萬
(3)優(yōu)先因子
【類似“權(quán)重”】
給每一個(gè)目標(biāo)一個(gè)優(yōu)先因子P,僅僅是確定各目標(biāo)的求解次序
?1.2 序貫算法
【將之前的單目標(biāo)最優(yōu)解變成下一個(gè)目標(biāo)的約束條件,然后迭代這個(gè)過程】
1.根據(jù)模型中各個(gè)目標(biāo)的優(yōu)先級(優(yōu)先因子),確定各目標(biāo)的求解次序
2.求第一級單目標(biāo)規(guī)劃的最優(yōu)值(注意要先給最優(yōu)解附一個(gè)初值)
3.以第一 級單目標(biāo)等于最優(yōu)值為新的約束條件,求第二級目標(biāo)最優(yōu)值記為
4.依次遞推,直到所有目標(biāo)都求完或不存在可行解為止
2. 實(shí)例建模過程
2.1 實(shí)例
某工廠生產(chǎn)產(chǎn)品1和產(chǎn)品2,有關(guān)數(shù)據(jù)如下,請給出方案,設(shè)計(jì)每天生產(chǎn)產(chǎn)品1、2各多少時(shí),滿足下面的要求:
現(xiàn)在的要求是:
2.2 建模過程
?(1)分析問題(翻譯成數(shù)學(xué)語言)
- 根據(jù)原材料擁有量
- 根據(jù)生產(chǎn)能力
- 根據(jù)具體要求(因?yàn)閹в小?strong>盡可能”關(guān)鍵詞,為目標(biāo)約束)
(2)引入正負(fù)變差變量?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
【以上不等式變形順序?qū)?yīng)】
- 第一個(gè)不等式:因?yàn)槭恰?,所以要求正偏差變量要最?/li>
- 第二個(gè)不等式:因?yàn)槭?,所以要求正偏差和負(fù)偏差都要小,所以求和要最小
- 第三個(gè)不等式:因?yàn)槭恰?,所以要求?fù)偏差變量要最小
所以得到目標(biāo)函數(shù):
?
P僅僅是優(yōu)先因子,僅僅決定后面多目標(biāo)求解順序,而不是真正意義上的權(quán)重值
根據(jù)1中原理介紹偏差變量,目標(biāo)函數(shù)看似沒有包含變量x,實(shí)則每一個(gè)偏差變量都要利用x計(jì)算?
(3)模型總結(jié)?
- 目標(biāo)函數(shù):
- ?約束條件:
?“多退少補(bǔ)”原則【將目標(biāo)約束中的不等式變成等式】
?表示:減去“超過”的,加上“未達(dá)到”
3. Matlab實(shí)現(xiàn)
?3.1 代碼
clc,clear
%初始化優(yōu)化問題框架
%創(chuàng)建優(yōu)化變量
%%2個(gè)產(chǎn)品【用x表示】【最小值=0】
x = optimvar('x',2,'LowerBound',0);
%%3個(gè)目標(biāo)函數(shù)的正偏差變量 【最小值=0】
dp = optimvar('dp',3,'LowerBound',0);
%%3個(gè)目標(biāo)函數(shù)的負(fù)偏差變量 【最小值=0】
dm = optimvar('dm',3,'LowerBound',0);
%創(chuàng)建優(yōu)化問題對象
p = optimproblem('ObjectiveSense','min');
%設(shè)置約束條件
%%設(shè)置絕對約束
p.Constraints.cons1 = (2*x(1)+x(2)<=11);
%%設(shè)置3個(gè)目標(biāo)約束
p.Constraints.cons2 = [x(1)-x(2)-dp(1)+dm(1)==0
x(1)+2*x(2)-dp(2)+dm(2)==10
8*x(1)+10*x(2)-dp(3)+dm(3)==56];
%設(shè)置目標(biāo)函數(shù)
obj = [dp(1);dm(2)+dp(2);dm(3)];
% 單級目標(biāo)函數(shù)的最優(yōu)值goal,初始設(shè)為足夠大的數(shù)
% 非常寬松的約束就等于沒有約束,確保第一級的正常運(yùn)算
goal=100000*ones(3,1);
%序貫算法(迭代最優(yōu))
for i=1:3
% 重要:更新上一級的最優(yōu)值,作為該級的約束條件;
p.Constraints.cons3=[obj<=goal];
p.Objective = obj(i);
%求解【 針對優(yōu)化問題使用solve,會自動(dòng)選擇求解方式】
[sx,fval] = solve(p);
%【下面兩行可注釋】只是展示每一次迭代結(jié)果
fprintf('第%d級目標(biāo)求解為:\n',i)
fval, xx=sx.x, sdm=sx.dm, sdp=sx.dp
%sx類似于python中創(chuàng)建的類【這里指優(yōu)化類】
%x(最后得到的優(yōu)化方案)、dm(負(fù)偏差變量)、dp(正偏差變量)為3個(gè)sx下的對象
goal(i) = fval;
end
3.2 結(jié)果展示
?表示:每天應(yīng)生產(chǎn)產(chǎn)品一2件,產(chǎn)品二4件
4. 總結(jié)
(1)問題函數(shù)optimproblem【用來創(chuàng)建優(yōu)化問題】
prob=optimproblem('ObjectiveSense','max');
ObjectiveSense是目標(biāo)類型,后面跟的‘max’為求最大優(yōu)化
默認(rèn)為求min
(2)?求解函數(shù)`optimvar`【一種類似于賦值的函數(shù)】
x=optimvar('x',1,2,'TYPE','integer','LowerBound',0,'UpperBound',inf);
第一個(gè)‘x’里面是變量名,后面 1 2 為變量的行 列
‘TYPE’,后面定義的是該函數(shù)所屬類型,比如說integer整數(shù)型,double雙精度型號等
‘LowerBound'下界;'UpperBound'上界
(3)?設(shè)置約束條件prob.Constraints.cons1
p.Constraints.cons1 = ( 2*x(1)+x(2)<=11 )
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];
-
p為優(yōu)化問題創(chuàng)建的對象
(4)?設(shè)置目標(biāo)函數(shù)pro.Objective
obj=[dp(1); dm(2)+dp(2); dm(3)];
p.Objective=obj(i);
-
p為優(yōu)化問題創(chuàng)建的對象
(5)?sovle函數(shù)求解
[sx,fval]=solve(p);
p為優(yōu)化問題創(chuàng)建的對象
sx為最優(yōu)值變量(理想)文章來源:http://www.zghlxwxcb.cn/news/detail-657514.html
fval為在最優(yōu)變量下的目標(biāo)函數(shù)值文章來源地址http://www.zghlxwxcb.cn/news/detail-657514.html
到了這里,關(guān)于數(shù)學(xué)建模|多目標(biāo)規(guī)劃+序貫算法|簡要原理+實(shí)例matalb代碼實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!