第四天:目标规划(goal programming)

     

目录

·目标规划问题及其数学模型

1.目标规划问题的提出

二、目标规划的数学模型

·Matlab中的目标规划函数——fgoalattain、gamultiobj

1.fgoalattain

2.gamultiobj


  

·目标规划问题及其数学模型

1.目标规划问题的提出

例:某一工厂生产两种产品,受到原材料供应和设备工时的限制。在单件利润等有关数据已知的条件下,要求生产制定一个获利最大的生产计划。具体数据见表1-1。

表1-1

产品12限量/件
原材料/(Kg/件)51060
设备工时(h/件)4440
利润/(元/件)68

         设产品1和产品2的产量分别为x_1x_2,当用线性规划来描述解决这个问题时,其数学模型为:

                                                max          z=6x_1+8x_2

st. 5x_1+10x_2<=60

4x_1+4x_2<=40

x_1,x_2>=0

 其最优解,即最优生产计划x_1=8,x_2=10,z=64

        从线性规划的角度来看,问题似乎解决了,但是实际的要求中又与此有很大出入,财务部希望利润高,物资部希望材料消耗少,销售部门希望产品品种多样,适销对路;计划部门希望尽可能地大批量生产等等。也就是说,一个计划问题实际上是一个多目标决策的问题。

        倘若一些限制条件是有弹性的,在一定条件下可以不用满足限制也可以,限制条件同时也有着优先级的区别等等。

        由此分析,刚性约束或许并不符合实际,在计划实施的过程约束可以有一定的弹性。现代决策强调定量分析同定性分析相结合,强调硬技术同软技术相结合,强调矛盾与冲突的合理性;强调妥协与让步的必要性。

        1961年,查恩斯(A.Charnes)和库伯(W.W.Cooper)提出目标规划(goal programming),得到广泛的重视和较快发展。目标规划在处理实际问题时,承认各项决策要求(可以时冲突的)的存在有其合理性;在做最终决策时,不强调其绝对意义的最优性。因此,目标函数被认为是一种更接近实际决策的决策工具。

二、目标规划的数学模型

假设在例1中,计划人员被要求考虑如下意见:

        (1)由于产品2销售疲软,故希望产品2的产量不超过产品1的一半

        (2)原材料严重短缺,生产中应避免过度消耗

        (3)最好能节约4h设备工时

        (4)计划利润不少于48元

面对这些意见,计划人员根据实际情况来对这些意见的优先级进行考虑,类似于这样的多目标决策问题就是典型的目标规划问题。

目标规划数学模型涉及下述基本概念:

1.偏差变量

        对每一个决策目标,引入正负偏差变量d^+d^-,分别表示决策值超过或不足目标值的部分。按定义应有d^+>=0,d^->=0,d^+d^-=0

2.绝对约束和目标约束

        绝对约束是指必须严格满足的约束条件,如线性规划中的约束条件都是绝对约束,即硬性约束。目标约束是目标规划特有的概念,是一种软约束,目标约束中决策值和目标值之间的差异用偏差变量表示。

3.优先因子于权系数

        不同目标的主次轻重有两种差别。一种差别是绝对的,可以用优先因子P_t来表示。只有高级优先级满足的基础上才能满足低级优先级。t值越大,优先级越小。

4.目标规划的目标函数

        目标规划的目标函数(又称为准则函数或达成函数)由各目标约束的偏差变量及相应的优先因子和权系数构成。由于目标规划追求的是尽可能地接近目标值,也就是使各个有关偏差变量尽可能小,所以其目标函数只能是极小化。应用时,有三种基本表达式:

        (1)要求恰好达到目标值。这时,决策值超过或不足目标值都是不希望的,因此有

min{f(d^++d^-)}

        (2)要求不超过目标值,但允许不足目标值。这时,不希望决策值超过目标值,因此有

 min{f(d^+)}

        (3)要求不低于目标值,但允许超过目标值,但不希望决策值低于目标值,因此有

min{f(d^-)}

         

建立数学模型:

假设原材料不得超过(绝对约束);产品2的产量要求优先考虑(目标约束);设备工时其次考虑(目标约束);最后考虑计划利润的要求(目标约束)。

则可以建立如下目标规划模型:

min{(P_1d_1^-,P_2d_2^+,P_3d_3^-)}

5x_1+10x_2<=60

x_1-2x_2+d_1^--d_1^+=0

4x_1+4x_2+d_2^--d_2^+=36

6x_1+8x_2+d_3^--d_3^+=48

x_1,x_2,d_i^-,d_i^+>=0(i=1,2,3)

根据题意,应有P_1>>P_2>>P_3

·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可以用来形式如下的目标规划问题

min(fun)

C(x)<=0

Ceq(x)=0

A*x<=0

Aeq*x=0

fun*weight<=goal

lb<=x<=ub

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

x_1=0.5,x_2=5.7时,可以保证在权重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

  • 7
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值