lingo求解多目标规划--例题教学教材
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
l i n g o求解多目标规
划--例题
实验二:目标规划
一、实验目的
目标规划是由线性规划发展演变而来的,线性规划考虑的是只有一个目标函数的问题,而实际问题中往往需要考虑多个目标函数,这些目标不仅有主次关系,而且有的还相互矛盾。这些问题用线性规划求解就比较困难,因而提出了目标规划。熟悉目标规划模型的建立,求解过程及结果分析。
二、目标规划的一般模型
设)...2,1(n j x j =是目标规划的决策变量,共有m 个约束是国内刚性约束,可能是等式约束,也可能是不等式约束。设有l 个柔性目标约束,其目标规划约束的偏差是),...,2,1(,l i d d i i =-+。设有q 个优先级别,分别为q p p p ,...,21。在同一
个优先级k p 中,有不同的权重,分别记为),...,2,1(,l j w w kj kj =-+。因此目标规划模
型的一般数学表达式为:
min ∑∑=++--=+=l
j j kj j kj q k k d w d w p z 11);(
s.t. ,,...2,1,),(1m i b x a n
j i j ij =≥=≤∑=
.
,...2,1,0,,
,...,2,1,,
,...2,1,1l i d d n x o x l i g d d x c
i i j i n j i i j ij =≥=≥==-++-=+-∑
三、实验设备及分组
实验在计算机中心机房进行,使用微型电子计算机,每人一机(一组)。
四、实验内容及步骤
1、打开LINGO,并利用系统菜单和向导在E盘创建一个项目。目录和项目名推荐使用学生自己的学号。
2、以此题为例,建立数学模型,并用说明语句进行说明,增强程序的可读性。
例2.1:
某工厂生产Ⅰ、Ⅱ两种产品,需要用到A,B,C三种设备,已知有关数据见下表。企业的经营目标不仅仅是利润,还需要考虑多个方面:(1)力求使利润不低于1500元;
(2)考虑到市场需求,Ⅰ、Ⅱ两种产品的产量比应尽量保持1:2;
(3)设备A为贵重设备,严格禁止超时使用;
(4)设备C可以适当加班,但要控制;设备B即要求充分利用,又尽可能不加班。在重要性上,设备C是设备B的3倍。
此题中只有设备A是刚性约束,其余都是柔性约束。首先,最重要的指标是企业的利润,将它的优先级列为第一级;其次是Ⅰ、Ⅱ两种产品的产量保持1:2的比例,列为第二级;再次,设备B、C的工作时间要有所控制,列为第
三级。在第三级中,设备B 的重要性是设备C 的3倍,因此它们的权重不一样,设备B 的系数是设备C 的3倍。
该计划问题可用数学模型表示为:
目标函数 min )33()(433322
211++-+--+++++=d d d p d d p d p z 满足约束条件 2122x x + 12≤
15003002001121=-+++-d d x x
0222
21=-+-+-d d x x 14x 1633=-++-d d
155442=-++-d d x
3,2,1,0,,,21=≥+-i d d x x i i
LINGO 程序为:
model :
sets :
!集合定义部分(从“sets:”开始,到“endsets ”结束):定义集合变量及其元素(含义类似数组的下标)和属性(含义类似于数组)。
level/1..3/:p,z,goal;
!level 说明的是目标规划的优先级,有三个变量p ,z ,和goal 。其中p 表示优先级,goal 表示相应优先级时的最优目标值。
!“1 ..3”的意思是从1到3的所有整数。
!基本集合的定义格式为:setname[/member_ list/][:attribute_list];其中
setname 为定义的集合名,member_list 为元素列表,attribute_list 为属性列表。在“[]”中的内容,表示是可选的项,即该项可以有也可以没有。
variable/1..2/:x;
!x 为决策变量向量。
h_con_num/1..1/:b;
!在目标规划中,约束有两类。一类是对资源有严格限制的,同线性规划的处理相同,用严格的等式或者不等式约束来处理,称此约束为刚性约束(hard constraint )。b 表示的是刚性约束的资源向量。
s_con_num/1..4/:g,dplus,dminus;
!另一类约束是可以不严格限制的,连同原线性规划的目标,构成柔性约束(soft
constraint )。g 表示的是柔性约束的资源向量,dplus,dminus 是偏差变量。在目标规划中,用偏差变量(deviational variables )来表示实际值与目标值之间的差异,dplus 为超出目标的差值,称为正偏差变量,dminus 为未达到目标的差值,称为负偏差变量。 h_cons(h_con_num,variable):A;
!刚性约束的价值向量。
s_cons(s_con_num,variable):c;
!柔性约束的价值向量。
obj(level,s_con_num):wplus,wminus;
!柔性约束在不同优先级下的权重。
endsets
data:
!数据输入部分(从“data:”开始,到“enddata”结束):作用在于对集合的属性(数组)输入必要的常数数据。
p=? ? ?;
!常数列表中的数据之间可以用“,”或者“空格”或者“回车”分开。如果想在运行时才对参数赋值,可以在数据段使用输入语句,但这仅用于对单个变量赋值,而不能用于属性变量(数值)。输入语句格式为“变量名=?;”。
goal=? ? 0;
b=12;
g=1500 0 16 15;
a=2 2;
c=200 300 2 -1 4 0 0 5;
!LINGO中的数据是按列赋值的,而不是按行赋值的。
wplus=0 0 0 0
0 1 0 0
0 0 3 1;
wminus=1 0 0 0
0 1 0 0
0 0 3 0;
enddata
min=@sum(level:p*z);
!目标函数(“min=”后面所接的表达式)是用求和函数“@sum(集合下标:关于集合属性的表达式)”的方式定义的。这个函数的功能是对语句中冒号“:”后面的表达式,按照“:”前面的集合指定的下标(元素)进行求和。这里“@sum”相当于求和符号“∑”。
@for(level(i):
z(i)=@sum(s_con_num(j):wplus(i,j)*dplus(j))
+@sum(s_con_num(j):wminus(i,j)*dminus(j)));
!约束是用循环函数“@for(集合(下标):关于集合的属性的约束关系)”的方式定义的。意思是对冒号“:”前面的集合的每个元素(下标),冒号“:”后面的约束关系式都要成立。
@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));
!限制0〈=z(i)〈=goal(i)
);