目录
·Matlab中的目标规划函数——fgoalattain、gamultiobj
·目标规划问题及其数学模型
1.目标规划问题的提出
例:某一工厂生产两种产品,受到原材料供应和设备工时的限制。在单件利润等有关数据已知的条件下,要求生产制定一个获利最大的生产计划。具体数据见表1-1。
表1-1
产品 | 1 | 2 | 限量/件 |
原材料/(Kg/件) | 5 | 10 | 60 |
设备工时(h/件) | 4 | 4 | 40 |
利润/(元/件) | 6 | 8 |
设产品1和产品2的产量分别为,
,当用线性规划来描述解决这个问题时,其数学模型为:
max
其最优解,即最优生产计划。
从线性规划的角度来看,问题似乎解决了,但是实际的要求中又与此有很大出入,财务部希望利润高,物资部希望材料消耗少,销售部门希望产品品种多样,适销对路;计划部门希望尽可能地大批量生产等等。也就是说,一个计划问题实际上是一个多目标决策的问题。
倘若一些限制条件是有弹性的,在一定条件下可以不用满足限制也可以,限制条件同时也有着优先级的区别等等。
由此分析,刚性约束或许并不符合实际,在计划实施的过程约束可以有一定的弹性。现代决策强调定量分析同定性分析相结合,强调硬技术同软技术相结合,强调矛盾与冲突的合理性;强调妥协与让步的必要性。
1961年,查恩斯(A.Charnes)和库伯(W.W.Cooper)提出目标规划(goal programming),得到广泛的重视和较快发展。目标规划在处理实际问题时,承认各项决策要求(可以时冲突的)的存在有其合理性;在做最终决策时,不强调其绝对意义的最优性。因此,目标函数被认为是一种更接近实际决策的决策工具。
二、目标规划的数学模型
假设在例1中,计划人员被要求考虑如下意见:
(1)由于产品2销售疲软,故希望产品2的产量不超过产品1的一半
(2)原材料严重短缺,生产中应避免过度消耗
(3)最好能节约4h设备工时
(4)计划利润不少于48元
面对这些意见,计划人员根据实际情况来对这些意见的优先级进行考虑,类似于这样的多目标决策问题就是典型的目标规划问题。
目标规划数学模型涉及下述基本概念:
1.偏差变量
对每一个决策目标,引入正负偏差变量和
,分别表示决策值超过或不足目标值的部分。按定义应有
2.绝对约束和目标约束
绝对约束是指必须严格满足的约束条件,如线性规划中的约束条件都是绝对约束,即硬性约束。目标约束是目标规划特有的概念,是一种软约束,目标约束中决策值和目标值之间的差异用偏差变量表示。
3.优先因子于权系数
不同目标的主次轻重有两种差别。一种差别是绝对的,可以用优先因子来表示。只有高级优先级满足的基础上才能满足低级优先级。t值越大,优先级越小。
4.目标规划的目标函数
目标规划的目标函数(又称为准则函数或达成函数)由各目标约束的偏差变量及相应的优先因子和权系数构成。由于目标规划追求的是尽可能地接近目标值,也就是使各个有关偏差变量尽可能小,所以其目标函数只能是极小化。应用时,有三种基本表达式:
(1)要求恰好达到目标值。这时,决策值超过或不足目标值都是不希望的,因此有
(2)要求不超过目标值,但允许不足目标值。这时,不希望决策值超过目标值,因此有
(3)要求不低于目标值,但允许超过目标值,但不希望决策值低于目标值,因此有
建立数学模型:
假设原材料不得超过(绝对约束);产品2的产量要求优先考虑(目标约束);设备工时其次考虑(目标约束);最后考虑计划利润的要求(目标约束)。
则可以建立如下目标规划模型:
根据题意,应有
·Matlab中的目标规划函数——fgoalattain、gamultiobj
1.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,fval,attainfactor,exitflag,output] = fgoalattain(problem)
fgoalattain可以用来形式如下的目标规划问题
PS:由于fgoalattain解的是极小化问题,因此当第i个目标fun(i)为最大时,fun(i)和goal(i)的系数需变为负
以例1来说,Matlab的代码如下:
fun函数
function f = fun(x)
f(1) = abs(x(1)-2*x(2)); %对产品2的目标
f(2) = abs(4*x(1)+4*x(2)-36);%对设备工时的目标
f(3) = -6*x(1)-8*x(2);%利润目标
end
main函数
goal = [0,0,-48];
weight = [10,2,1]; %权重,权重会对结果造成影响
A = [5,10];
b = 60;
Aeq = [];
beq = [];
lb = [0,0];
ub = [12,6];
x0 = [6,3];
[x,fval] = fgoalattain(@fun,x0,goal,weight,A,b,Aeq,beq,lb,ub)
运行结果
x =
6.0000 3.0000
fval =
0.0000 0.0000 -60.0000
当,
时,可以保证在权重goal=[10,2,1]情况下的最优解。此时可以保证所有目标。
对结果造成影响的变量是goal,不同的goal所计算的结果也会不同。具体情况具体分析。
2.gamultiobj
gamultiobj是Optimization Toolbox中使用遗传算法来解多目标问题的一个函数,其使用方法同fgoalattain类似
x = gamultiobj(fun,nvars)
x = gamultiobj(fun,nvars,A,b)
x = gamultiobj(fun,nvars,A,b,Aeq,beq)
x = gamultiobj(fun,nvars,A,b,Aeq,beq,lb,ub)
x = gamultiobj(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon)
x = gamultiobj(fun,nvars,A,b,Aeq,beq,lb,ub,options)
x = gamultiobj(fun,nvars,A,b,Aeq,beq,lb,ub,nonlcon,options)
x = gamultiobj(problem)
[x,fval] = gamultiobj(___)
[x,fval,exitflag,output] = gamultiobj(___)
[x,fval,exitflag,output,population,scores] = gamultiobj(___)
其中,nvars为变量个数
[x,fx] = gamultiobj(@fun,2,A,b,Aeq,beq,lb,ub)
运行结果
x =
0 0
7.2148 1.7851
0.0010 0.0005
3.2038 1.6019
12.0000 0.0001
5.4767 1.7765
4.1632 1.7633
10.7448 0.1866
9.5508 0.7411
6.1941 1.7506
0 0
3.6907 1.6531
12.0000 0
11.1880 0.2458
5.0110 1.7640
8.3720 1.5485
8.3708 1.2846
10.8537 0.4111
fx =
0 36.0000 0
3.6447 0.0004 -57.5696
0.0000 35.9941 -0.0098
0.0000 16.7770 -32.0384
11.9998 12.0003 -72.0006
1.9236 6.9872 -47.0722
0.6365 12.2940 -39.0856
10.3716 7.7259 -65.9621
8.0687 5.1673 -63.2331
2.6928 4.2212 -51.1695
0 36.0000 0
0.3846 14.6247 -35.3691
12.0000 12.0000 -72.0000
10.6964 9.7348 -69.0937
1.4831 8.9000 -44.1780
5.2750 3.6820 -62.6200
5.8016 2.6214 -60.5013
10.0314 9.0591 -68.4109
gamultiobj直接返回多个满足条件的解,如何选择看实际要求。
参考书籍:
胡运权,郭耀煌.运筹学教程[M].北京:清华大学出版社,2018:105-108