[工程优化]用CPLEX解决工程规划问题 (

来源:互联网 发布:单片机c语言编程入门 编辑:程序博客网 时间:2024/06/05 16:39

07 年写的,转眼已过十年。转到这里来。。


CPLEX 为ILOG公司开发的专门用来解线性规划方程的软件,乃当今世界上现存不多的顶尖的优化软件之一.如用之于工程规划,可使资本达到最高利用率.此物于运筹策划犹如孙子兵法之与用兵之道..$#$#@%@%$@$^@%$(狂想中...)

如何用CPLEX来优化工程规划?
当然,要先将工程规划问题转化成线性规划方程,然后用CPLEX解之,不多费话,举个例子先.

题曰:某XX公司有某XX工程,工程可大致分为{A,B,C,D,E}五大部分.各部分施工时间分别为{2,3,5,4,1}(单位:月),各部分之间的约束条件:
   1) A必须在B开始之前完工.
   2) A和E不可同时施工.
   3) C和D不可同时施工.
   4) A必须在C开始之前完工.

(a)非最优化策划
某答:
非常简单.(注:此君无运筹学概念)
 
        C
   ----------  
          
--------
  | A ------   
 |----         --
  |----------------------|--------> 时间
           11

 如上图所示, 工程以A开始, 以D结束,其间B和C同时进行,总共用时11个月..
 该规划看似十分完美, 符合所有条件, 好像是最优答案,如公司决策者冒然用之,可致公 司资本流失于无形之中...

(b)优化策划



(b-1)建立先行规划方程
   b-1-1 变量设定
    题中五个部分分别以Xa,Xb,Xc,Xd,Xe这5个整型变量代之,表示各工程的开始时间.
    加入1个整型变量:Xf 表示工程结束时间.
    另外加入2个布尔型变量 Xa,e   Xc,d
          Xae =1 表示A在E开始之前完工.
               =0 表示E在A开始之前完工.
          (变量Xa,e 将
A和E不可同时施工的条件转换成线性问题.)
          Xcd 同理.
  b-1-2 优化目标设定
    目标当然是让工程尽快完工.即最小化完工时间.
     (min)Xf    
  b-1-3 条件设定
    是建立线性规划方程中最重要的一个步骤.将所有用白话描写的限制转换成线性调 
    价.
     条件1:
A必须在B开始之前完工.
          描述:A的开始时间加上A的施工时间要小于或等于B的开始时间.写成线性规           划后如下:
             Xa + 2 <=Xb 
    条件2:
A和E不可同时施工.
          描述:次条件要分割成两个部分,即
A在E开始之前完工或者E在A开始之前完工.
          还有,这个条件属于NP_COMPLET型的问题,我们要用放松法来适当放大方程的          限制条件..(属于线性规划方程的问题,这里略过)
           
A在E开始之前完工:
                Xa+2-Xe<=(1-Xae)*11
                (注:乘11是用来适当放大
限制条件)
            
E在A开始之前完工        
                Xe+1-Xa<=Xae * 11
    条件3与条件2相似.
           Xc-Xd+5<=(1-Xcd)*11
           Xd-Xc+4<=Xcd * 11
    条件4与条件1类似.
           Xa+2<=Xc
    其他条件:
      Xa, Xb, Xc, Xd, Xe, Xf 为正整数.
      Xcd 和Xae 为布尔型.

(b-2)将方程以CPLEX格式书写:
  Xa->X1  Xb->X2  Xc->X3 Xd->X4  Xe->X5  Xf->X6
   Xae->X7 Xcd->X8
  
/文件名:opt1.lp
Minimize
 obj: x6
Subject To
 c1:  x2 - x6 <= -3
 c2:  x3 - x6 <= -5
 c3:  x4 - x6 <= -4
 c4:  x5 - x6 <= -1
 c5:  x1 - x6 <= -2
 c6:  x1 - x2 <= -2
 c7:  x1 - x3 <= -2
 c8:  x1 - x5 + 11 x7 <=9
 c9:  x5 - x1 - 11 x7 <=-1
 c10: x3 - x4 + 11 x8 <= 6
 c11: x4 - x3 - 11 x8 <= -4
Bounds
 0 <= x1 <= 65535
 0 <= x2 <= 65535
 0 <= x3 <= 65535
 0 <= x4 <= 65535
 0 <= x5 <= 65535
 0 <= x6 <= 65535
 0 <= x7 <= 1
 0 <= x8 <= 1


Binaries
x7 x8
End


(b-3)运行CPLEX
   用'read'命令读取"
opt1.lp".
   'optimize'命令计算结果.
   'display'显示各变量取址.等等...
  结果:
    Integeroptimal solution:  Objective=   9.0000000000e+000
 变量取值:
   VariableName          Solution Value
   x6                           9.000000
   x2                           6.000000
   x3                           4.000000
   x1                           1.000000
   All other variables in the range 1-8 arezero.

从上面结果中得到:工程耗时9个月(X6=9).
   X4=0说明:D在工程一开始就执行.
   X5=0 ->  E
也在工程一开始就执行.
   X1=1 ->  A在工程开始一个月后执行....等等..

规划图解:
 | E           B
  |--      ------    
  ----     

  |    ----------
  |--------       
  |------------------|------------> 时间
         9

总结:
 使用线性规划方程得出的规划(b)比原先手工规划(a)省时2个月.

0 0