【数学建模】多目标规划

多目标规划概念

线性规划只能解决一组线性约束条件下,一个目标的最大或最小值的问题。在实际决策中,衡量方案优劣要考虑多个目标,这些目标中,有主要的,也有次要的;有最大值的,也有最小值的;有定量的,也有定性;有相互补充的,也有相互对立的,线性规划则无能为力。

求解思路

加权系数法——为每一目标赋一个权系数, 把多目标模型转化成单一目标的模型。但困难是要确定合理的权系数,以反映不同目标之间的重要程度。
优先等级法—— 将各目标按其重要程度不同的优先等级,转化为单目标模型。
此外,主要目标法常用。
在目标规划中不提最优解的概念, 只提满意解的概念, 即寻求能够照顾到各个目标, 并使决策者感到满意的解, 由决策者来确定选取哪一个解。缺点是满意解的数目太多而难以将其一一求出。

有关数学概念

正、负偏差变量

在这里插入图片描述

绝对(刚性)约束和目标约束

绝对约束是指必须严格满足的等式约束和不等式约束,例如线性规划问题的所有约束条件。不能满足这些约束条件的解称为非可行解,所以它们是硬约束,钢性约束。

目标约束是目标规划特有的,可把约束右端项看作要追求的目标值。在达到此目标值时允许发生正或负偏差,因此在这些约束中加入正、负偏差变量,它们是软约束,柔性约束。

正负偏差变量的作用:可将绝对约束通过添加正、负偏差变量的方式转化为柔性约束。

例:
条件1:产品I的产量不大于产品II;
条件2:应尽可能充分利用设备, 但不希望加班;
条件3:应尽可能达到并超过计划利润指标56万元;

硬性约束:
x1<=x2;
x1+2x2<=10;
z=8
x1+10*x2;

通过添加正负偏差变量转化为柔性约束:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

优先因子(优先等级)与权系数

在这里插入图片描述

一般而言,要求排在前面的优先考虑,优先级更高,优先因子更大。

目标规划的目标函数

与线性规划的目标函数构造不同,目标规划方法的目标函数(准则函数)是按各目标约束的正、负偏差变量,并赋于相应的优先因子和权系数而构造的。当每一目标值确定后,决策者的要求是尽可能缩小偏离目标值。因此目标规划的目标函数只能是所有偏差变量的加权和。其基本形式有三种。

(1)第i个目标要求恰好达到目标值,即正、负偏差变量都要尽可能地小
在这里插入图片描述
(2)第i个目标要求不超过(不大于)目标值, 即允许达不到目标值,就是正偏差变量要尽可能地小
在这里插入图片描述
(3)第i个目标要求超过(不小于)目标值, 即超过量不限, 但必须是负偏差变量要尽可能地小

在这里插入图片描述

目标规划的一般数学模型

在这里插入图片描述
在这里插入图片描述
建立目标规划的数学模型时,需要确定目标值、优先等级、权系数等,它们都具有一定的主观性和模糊性,可以用专家评定法给以量化。

目标规划的续贯算法

根据优先级的先后次序, 将目标规划问题分解成一系列的单目标规划问题, 然后再依次求解。
注意:求下一级目标, 之前的目标规划全部作为约束条件。


所有目标一个一个的求,求出前面的目标后,在后面目标的求解中将前面目标的结果作为刚性约束。

例:某企业生产甲、乙两种产品,需要用到A,B,C三种设备,关于产品的赢利与使用设备的工时及限制如表2 所示。问该企业应如何安排生产,才能达到下列目标。
(1)力求使利润指标不低于1500 元;
(2)考虑到市场需求,甲、乙两种产品的产量比应尽量保持1:2;
(3)设备A为贵重设备,严格禁止超时使用;
(4)设备C可以适当加班,但要控制;设备B既要求充分利用,又尽可能不加班。在重要性上,设备B是设备C的3 倍。
在这里插入图片描述
解:由条件分析,得:
设备A是刚性约束, 其余是柔性约束;
首先, 最重要的指标是企业的利润, 因此将它的优先级列为第一级;
其次, 甲、乙两种产品的产量保持1:2的比例, 列为第二级;
再次, 设备B,C的工作时间要有所控制, 列为第三级;在第三级中, 设备B的重要性是设备C的三倍, 因此它们的权重不一样, 设备B前的系数是设备C前系数的3倍。

在这里插入图片描述

多目标规划的Lingo解法

序贯算法中每个单目标问题都是一个线性规划问题, 可以使用
Lingo软件进行求解。

以上例为例,利用lingo求解如下:

第一级:

model:
sets:
variable/1,2/:x;
s_con_num/1..4/:g,dplus,dminus; !目标约束项数;
s_con(s_con_num,variable):c;
!dplus=d+,dminus=d-,目标约束系数c=c(i,j);
endsets
data:
g=1500 0 16 15;c=200 300 2 -1 4 0 0 5; !默认按行赋值;
enddata
min=dminus(1); !一级目标函数;
2*x(1)+2*x(2)<=12;
@for(s_con_num(i):@sum(variable(j):c(i,j)*x(j)+dminus(i)-dplus(i))=g(i););
@for(variable:@gin(x)); !变量取整约束;
end

第二级:

model:
sets:
variable/1,2/:x;
s_con_num/1..4/:g,dplus,dminus;
s_con(s_con_num,variable):c;
endsets
data:
g=1500 0 16 15;c=200 300 2 -1 4 0 0 5;
enddata
min=dplus(2)+dminus(2); !二级目标函数;
2*x(1)+2*x(2)<=12;
@for(s_con_num(i):@sum(variable(j):c(i,j)*x(j)+dminus(i)-dplus(i))=g(i););
dminus(1)=0; !一级目标约束;
@for(variable:@gin(x));
end

第三级:

model:
sets:
variable/1,2/:x;
s_con_num/1..4/:g,dplus,dminus;
s_con(s_con_num,variable):c;
endsets
data:
g=1500 0 16 15;c=200 300 2 -1 4 0 0 5;
enddata
min=3*dplus(3)+3*dminus(3)+dplus(4); !三级目标函数;
2*x(1)+2*x(2)<=12;
@for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i););
dminus(1)=0;dplus(2)+dminus(2)=0; !一、二级目标约束;
@for(variable:@gin(x));
end

若三个阶段在一起求:

model:
sets:
level/1..3/:p,z,goal; !三个目标;
variable/1,2/:x;
s_con_num/1..4/:g,dplus,dminus;
s_con(s_con_num,variable):c;
h_con_num/1/:b;
h_con(h_con_num,variable):a;
obj(level,s_con_num)/1 1,2 2,3 3,3 4/:wplus,wminus; !权重;
endsets
data:
ctr=?;
goal=? ? 0;
b=12;
a=2 2;
g=1500 0 16 15;
c=200 300 2 -1 4 0 0 5;
wplus=0 1 3 1;
wminus=1 1 3 0;
enddata
min=@sum(level:p*z);
@for(level(i)|i#ne#ctr:p(i)=0);
@for(level(i):z(i)=@sum(obj(i,j):wplus(i,j)*dplus(j)+wminus(i,j)*dminus(j)););
@for(h_con_num(i):@sum(variable(j):a(i,j)*x(j))<=b(i););
@for(s_con_num(i):@sum(variable(j):c(i,j)*x(j))+dminus(i)-dplus(i)=g(i););
@for(level(i)|i#lt#@size(level):@bnd(0,z(i),goal(i)));
@for(variable:@gin(x));
end

多目标规划的matlab解法

通式总结:
在这里插入图片描述
在这里插入图片描述
fgoalattain()函数的用法:
x = fgoalattain(fun,x0,goal,weight)
x = fgoalattain(fun,x0,goal,weight,A,b)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon)
x = fgoalattain(fun,x0,goal,weight,A,b,Aeq,beq,lb,ub,nonlcon,options)
x = fgoalattain(problem)
[x,fval] = fgoalattain(___)
[x,fval,attainfactor,exitflag,output] = fgoalattain(___)
[x,fval,attainfactor,exitflag,output,lambda] = fgoalattain(___)

例:求解多目标线性规划问题
在这里插入图片描述
(1)定义目标函数:

function F=Fun16_5(x)
F=[-100*x(1)-90*x(2)-80*x(3)-70*x(4);3*x(2)+2*x(4)];
end

(2)goal由两个目标函数分别求出目标值合并而成;weight由abs(goal)取定

a=[-1 -1 0 0;0 0 -1 -1;3 0 2 0;0 3 0 2]
b=[-30,-30,120,48].'
c1=-[100,90,80,70]
c2=[0,3,0,2]
[x1,goal1]=linprog(c1,a,b,[],[],zeros(4,1))
[x2,goal2]=linprog(c2,a,b,[],[],zeros(4,1))
goal=[goal1;goal2]
[x,fval]=fgoalattain('Fun16_5',rand(4,1),goal,abs(goal),a,b,[],[],zeros(4,1))
  • 75
    点赞
  • 723
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值