cplex入门系列(五)--- 线性目标规划

一、线性目标规划介绍

线性规划在实践中得到了广泛的应用,但是存在两方面的不足:一是不能处理多目标优化的问题;二是其约束条件过于刚性化,不允许约束资源有丝毫差错。目标规划就是为了解决上述问题不足,而创建的一类数学模型。
在处理多目标问题分析各类目标的重要性时,引入了赋予个目标优先因子和加权系数等概念,进一步完善了数学模型,这里仅介绍有优先等级和加权系数的线性目标规划,下面所提到的目标规划均指线性目标规划。

二、目标规划的数学模型

在实际工厂决策时,需要考虑市场等一系列其他条件。

  • 根据市场信息,产品Ⅰ的销售量有下降的趋势,故考虑产品Ⅰ的产量不大于产品Ⅱ。

  • 超过计划供应的原材料时,需要高价采购,会使成本大幅度增加。

  • 应尽可能充分利用设备台班,但不希望加班;
    应尽可能达到并超过利润指标56元。
    这样考虑产品决策,称为多目标决策问题。目标规划方法是解这类决策问题的方法之一。下面引入与建立目标规划数学模型有关的概念。

  • 正负偏差变量d^+,d^−:设x_1,x_2为决策变量,此外,引进正偏差变量d^+表示决策值超过目标值的部分;负偏差变量d^-表示决策值未达到目标值的部分。因为决策值不可能既要超过目标值同事又未达到目标值,即恒有d^+⋅d^−=0

  • 绝对约束和目标约束:绝对约束是指必须严格满足的等式约束和不等式约束;如线性规划问题的所有约束条件,不能满足这些约束条件的解称为非可行解,所以它们是硬约束。目标约束时目标规划特有的,可把约束右端项看做要追求的目标值。在达到此目标值时允许发生在偏差或负偏差,因此在这些约束中加入正负偏差变量,它们是软约束。线性规划问题的目标函数,在给定目标值和加入正负偏差变量后可变换为目标约束。也可以根据问题的需要将绝对约束变换为目标约束。

  • 优先因子(优先等级)与权系数:一个规划问题常常有若干目标。但决策者在要求达到这些目标时,是由主次或轻重缓急的。要求第一位达到的目标赋予优先因子P_1,次位的目标赋予优先因子P_2,\dots,并规定P_k>>P_{k+1},k=1,2,\dots,K。表示P_kP_{k+1}有更大的优先权。即首先保证P_1级目标的实现,这是可不考虑次级目标;而P_2级目标是在实现P_1级目标的基础上考虑的;以此类推。若要区别具有相同优先因子的两个目标的差别,这是可以分别赋予它们不同的权系数\omega_j,这些都由决策者按具体情况而定。

  • 目标规划的目标函数:目标规划的目标函数(准则函数)是按照个目标约束的正、负偏差变量和赋予相应的优先因子及权系数而构造的。当每一目标值确定后,决策者的要求是尽可能缩小偏离目标值。因此目标规划的目标函数只能是。其基本形式有三种:

    • 要求恰好达到目标值,即正负偏差变量都要尽可能地小,这时:min z = f(d^++d^-)
    • 要求不超过目标值,即允许达不到目标值,就是正偏差变量要尽可能地小。这时min z = f(d^+)
    • 要求超过目标值,即超过量不限,但是必须是负偏差变量要尽可能地小,这时min z = f(d^-)

对每一个具体目标规划问题,可根据决策者的要求和赋予个目标的优先因子来构造目标函数。而在建立目标规划的数学模型时,需要确定目标值、优先等级、权系数等,它都具有一定的主观性和模糊性,可以用专家评定法给以量化。

三、解目标规划的图解法

对只具有两个决策变量的目标规划的数学模型,可以使用图解法来分析求解。
先在平面直角坐标系的第一象限画出各约束条件。绝对约束条件的作图和线性规划相同。

四、解目标规划的单纯形法

目标规划的数学模型结构与线性规划的数学模型结构形式上并没有本质的区别,所以可用单纯形法求解。但是要考虑目标规划的数学模型一些特点,现做以下规定:

  • 因目标规划问题的目标函数都是求最小化,所以以c_j-z_j\geq0(j=1,2,\dots,n)为最优准则。
  • 因非基变量的检验数中含有不同等级的优先因子,即c_j-z_j=\sum{\alpha}_{kj}P_{k},j=1,2,\dots,n;k=1,2,\dots,KP_1>>P_2>>\dots>>P_K;从每个检验数的整体来看:检验数的正负首先决定于的P_1系数\alpha_{1j}的的正负。若\alpha_{1j}=0,这时此检验数的正负就决定于P_2的系数\alpha_{2j}的正负,下面可以类推。

解目标规划问题的单纯形法的计算步骤如下:

  • 建立初始单纯形表,在表中将检验数行按优先因子个数分别列成K行,置k=1,即对应优先因子行中的第一行开始计数。
  • 检查该行中是否存在负数,且对应列的前k-1行的系数是零。若有负数取其中最小者对应的变量为换入变量,转第三步。若无负数,转第五步;
  • 按最小比值规则确定换出变量,当存在两个和两个以上相同的最小比值时,选取具有较高优先级别的变量为换出变量。
  • 按单纯形法进行基变换运算,建立新的计算表,返回第二步。
  • 当k=K时,计算结束。表中的解即为满意解。否则置k=k+1,返回第二步。

五、项目实战

5.1 案例一
某研究所领导在考虑本单位职工的升级调资方案时,依次遵循以下优先级顺序规定:
(1) 不超过年工资总额3000万元;
(2)提级时,每级的人数不超过定编规定的人数;
(3)Ⅱ,Ⅲ级的升级面尽可能达到现有人数的20%,且无越级提升。
此外,Ⅲ级不足编制的人数可录用新职工,又Ⅰ级的职工有10%要退休。
有关资料汇总于下表,问该领导应如何拟定一个满意的方案。

等级 工资额/(万元/年) 现有人数/人 编制人数
10.0 100 120
7.5 120 150
5.0 150 150
合计 370 420

解:使用线性目标规划来求解此问题,设x_1,x_2,x_3分别表示提升到Ⅰ、Ⅱ级和录用到Ⅲ级的新职工人数。对各目标确定的优先因子为:

  • P_1-- 不超过年工资总额3000万元;
  • P_2-- 每级的人数不超过定编规定的人数;
  • P_3-- Ⅱ、Ⅲ级的升级面尽可能达到现有人数的20%。

先分别建立各目标约束。
年工资总额不超过3000万元
10(100-100{\times}0.1+x_1)+7.5(120-x_1+x_2)+5.0(150-x_2+x_3)+d_{1}^{-}-d_{1}^{+}=3000(万元)
每级的人数不超过定编规定的人数:
对Ⅰ级有:100(1-0.1)+x_1+d_{2}^{-}-d_{2}^{+}=120(人)
对Ⅱ级有:120-x_1+x_2+d_{3}^{-}-d_{3}^{+}=150(人)
对Ⅲ级有:150-x_2+x_3+d_{4}^{-}-d_{4}^{+}=150(人)
Ⅱ、Ⅲ级的升级面不大于现有人数的20%:
对Ⅱ级有:x_1+d_{5}^{-}-d_{5}^{+}=120{\times}0.2(人)
对Ⅲ级有:x_2+d_{6}^{-}-d_{6}^{+}=150{\times}0.2(人)
目标函数:min z = P_{1}d_{1}^{+}+P_2(d_{2}^{+}+d_{3}^{+}+d_{4}^{+})+P_3(d_{5}^{-}+d_{6}^{-})
经过整理后得到下列目标规划模型
min z = P_{1}d_{1}^{+}+P_2(d_{2}^{+}+d_{3}^{+}+d_{4}^{+})+P_3(d_{5}^{-}+d_{6}^{-})
\begin{equation} \left\{ \begin{array}{r1} 2.5x_1+2.5x_2+5.0x_3+d_{1}^{-}-d_{1}^{+}=450 \\ x_1+d_{2}^{-}-d_{2}^{+}=30\\ -x_1+x_2+d_{3}^{-}-d_{3}^{+}=30\\ -x_2+x_3+d_{4}^{-}-d_{4}^{+}=0\\ x_1+d_{5}^{-}-d_{5}^{+}=24\\ x_2+d_{6}^{-}-d_{6}^{+}=30\\ x_1,x_2,x_3,d_{i}^{-},d_{i}^{+}{\geq}0(i=1,2,\dots,6) \end{array} \right. \end{equation}
该问题最终还是转换成了一个LP的问题,如何使用cplex来进行求解了,这里我们需要自定义优先因子P_1,P_2,P_3,这里我们不妨分别取P_1=10,P_2=5,P_3=1来代表其优先级,权系数从这里看都是1,这里的正负偏差,我们可以当作决策变量来考虑,即目标规划模型转化为以下线性规划模型:
min z = 10d_{1}+0d_{2}+5(d_{3}+0d_{4}+d_{5}+0d_{6}+d_{7}+0d_{8})+1(0d_{9}+d_{10}+0d_{11}+1d_{12})
\begin{equation} \left\{ \begin{array}{r1} 2.5x_1+2.5x_2+5.0x_3+d_{2}-d_{1}=450 \\ x_1+d_{4}-d_{3}=30\\ -x_1+x_2+d_{6}-d_{5}=30\\ -x_2+x_3+d_{8}-d_{7}=0\\ x_1+d_{10}-d_{9}=24\\ x_2+d_{12}-d_{11}=30\\ x_1,x_2,x_3,d_{i}{\geq}0(i=1,2,\dots,12) \end{array} \right. \end{equation}

package com.opreation.research;
import ilog.concert.*;
import ilog.cplex.IloCplex;

import org.omg.PortableInterceptor.SYSTEM_EXCEPTION;

import java.util.HashSet;
import java.util.Random;

import static ilog.cplex.IloCplex.IntParam.SolnPoolIntensity;


/**
* @Description: 线性目标规划求解
* @Author 
* @Date 2022/7/28 14:18
*/
public class LPTest {
    
    public static void main(String[] args) throws IloException {
        try{
            
            
            // 1. 创建模型
            IloCplex cplex = new IloCplex();
            
            
            // 2. 定义优化参数
            // 定义基本参数
            IloNumVar[] x = cplex.numVarArray(3, 0, Double.MAX_VALUE);
            // 定义约束参数
            IloNumVar[] d = cplex.numVarArray(12, 0, Double.MAX_VALUE);
            double[] c = {10, 0, 5, 0, 5, 0, 5, 0, 0, 1, 0, 1};
            IloNumExpr cs1 = cplex.numExpr();
            for(int i=0;i<12;i++){
                cs1 = cplex.sum(cs1,cplex.prod(c[i], d[i]));
            }
            
            
            // 3. 设置目标函数
            cplex.addMinimize(cs1);
            // 4. 设置约束
            cplex.addEq(cplex.sum(cplex.prod(2.5,x[0]), cplex.prod(2.5,x[1]), cplex.prod(5,x[2]), d[1], cplex.prod(-1, d[0])), 450);
            cplex.addEq(cplex.sum(x[0], d[3], cplex.prod(-1, d[2])), 30);
            cplex.addEq(cplex.sum(cplex.prod(-1,x[0]), x[1], d[5], cplex.prod(-1, d[4])), 30);
            cplex.addEq(cplex.sum(cplex.prod(-1, x[1]), x[2], d[7], cplex.prod(-1, d[6])), 0);
            cplex.addEq(cplex.sum(x[0], d[9], cplex.prod(-1, d[8])), 24);
            cplex.addEq(cplex.sum(x[1], d[11], cplex.prod(-1, d[10])), 30);
            
            
            
            //            // 5. 模型求解及输出
            if(cplex.solve()){
                cplex.output().println("Solution status = " + cplex.getStatus());
                cplex.output().println("Solution Value = " + cplex.getObjValue());
                double[] val = cplex.getValues(x);
                double[] vald = cplex.getValues(d);
                for(int j=0;j<3;j++){
                    System.out.println("x" + (j+1) + " = " + val[j]);
                }
                
                for(int j=0;j<12;j++){
                    System.out.println("d" + (j+1) + " = " + vald[j]);
                }
                
            }
            cplex.end();
        } catch (IloException e){
            System.err.println("Concert exception caught: " + e);
        }
        
    }
}

运行结果:

Tried aggregator 1 time.
LP Presolve eliminated 1 rows and 8 columns.
Reduced LP has 5 rows, 7 columns, and 12 nonzeros.
Presolve time = 0.00 sec. (0.00 ticks)

Iteration log . . .
Iteration:     1   Dual objective     =             0.000000
Solution status = Optimal
Solution Value = 0.0
x1 = 24.0
x2 = 30.0
x3 = 0.0
d1 = 0.0
d2 = 315.0
d3 = 0.0
d4 = 6.0
d5 = 0.0
d6 = 24.0
d7 = 0.0
d8 = 30.0
d9 = 0.0
d10 = 0.0
d11 = 0.0
d12 = 0.0

结果分析:
在课本习题上给出的满意解是取值为0,此时变量x_1(晋升到Ⅰ级的人数/人)、x_2(晋升到Ⅱ级的人数/人)、x_3(新招收Ⅲ级的人数/人)、d_2(工资总额的结余额/万元)、d_4(Ⅰ级缺编人数/人)、d_6(Ⅱ级缺编人数/人)、d_8(Ⅲ级缺编人数/人)分别为24、30、30、16.5、6、24、0。
在cplex的给出的满意解取值为0,此时变量x_1(晋升到Ⅰ级的人数/人)、x_2(晋升到Ⅱ级的人数/人)、x_3(新招收Ⅲ级的人数/人)、d_2(工资总额的结余额/万元)、d_4(Ⅰ级缺编人数/人)、d_6(Ⅱ级缺编人数/人)、d_8(Ⅲ级缺编人数/人)分别为24、30、0、315、6、24、30。
这里cplex求出的满意解和书本上的满意解不一样,这边将cplex求出来的满意解代入计算一下:
z=10\times0+0\times315+5(0+0\times6+0+0\times24+0+0\times30)+1(0\times0+0+0\times0+1\times0)=0
\begin{equation} \left\{ \begin{array}{r1} 2.5\times24+2.5\times30+5.0\times0+315-0=450 \\ 24+6-0=30\\ -24+30+24-0=30\\ -30+0+30-0=0\\ 24+0-0=24\\ 30+0-0=30 \end{array} \right. \end{equation}
从上述计算结果可知,该问题有多个满意解,cplex求解出来的解和书本上的解都是满意解。
5.2 案例二
已知有三个产地给四个销地供应某种产品,产销地之间的供需量和单位运价表见下表。有关部门在研究调运方案时依次考虑以下七项目标,并规定其相应的优先等级:
P_1--- B_4是重点保证单位,必须全部满足其需要;
P_2--- A_3B_1提供的产量不少于100;
P_3--- 每个销地的供应量不小于其需要量的80%;
P_4--- 所定调运方案的总费用不超过最小运费调用方案的10%;
P_5--- 因路段的问题,尽量避免安排将A_2的产品往B_4;
P_6--- 给B_1B_3的供应率要相同;
P_7--- 力求总运费最省;
试求满意的调运方案。

产地 销地 产量
B_1 B_2 B_3 B_4
A_1 5 2 6 7 300
A_2 3 5 4 6 200
A_3 4 5 2 3 400
销量 200 100 450 250 900/1000

解:目标函数为:
minz=P_1d_{4}^{-}+P_2d_{5}^{-}+P_3(d_{6}^{-}+d_{7}^{-}+d_{8}^{-}+d_{9}^{-})+P_{4}d_{10}^{+}+P_5d_{11}^{+}+P_6(d_{12}^{-}+d_{12}^{+})+P_7d_{13}^{+}
供应约束
x_{11}+x_{12}+x_{13}+x_{14}{\leq}300\\ x_{21}+x_{22}+x_{23}+x_{24}{\leq}200\\ x_{31}+x_{32}+x_{33}+x_{34}{\leq}400
需求约束
x_{11}+x_{21}+x_{31}+d_1^{-}-d_{1}^{+}=200\\ x_{12}+x_{22}+x_{32}+d_2^{-1}-d_2^{+}=100\\ x_{13}+x_{23}+x_{33}+d_3^{-}-d_3^{+}=450\\ x_{14}+x_{24}+x_{34}+d_4{-}-d_4^{+}=250
A_3B_1提供的产品了不少于100:
x_{31}+d_5^{-}-d_5^{+}=100
每个销地的供应量不小于其需要量的80%:
x_{11}+x_{21}+x_{31}+d_6^{-1}-d_6^{+}=200{\times}0.8\\ x_{12}+x_{22}+x_{32}+d_7^{-}-d_7^{+}=100{\times}0.8\\ x_{13}+x_{23}+x_{33}+d_8^{-}-d_8^{-}=450{\times}0.8\\ x_{14}+x_{24}+x_{34}+d_9^{-}-d_9^{+}=250{\times}0.8
调运方案的总费用不超过最小运费调运方案的10%:
\sum_{i=1}^{3}\sum_{j=1}^{4}c_{ij}x_{ij}+d_10^{-}-d_10^{+}=2960(1+10\%)
力求总运费最省
\sum_{i=1}^{3}\sum_{j=1}^{4}c_{ij}x_{ij}+d_{13}^{-1}-d_{13}^{+}=2950
最终得到总运费为3360元。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,284评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,115评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,614评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,671评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,699评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,562评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,309评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,223评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,668评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,859评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,981评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,705评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,310评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,904评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,023评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,146评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,933评论 2 355

推荐阅读更多精彩内容