lingo从入门到高手 Lingo教程 下载本文

任务 A B C D E F G H I J K 9 时间 45 11 9 50 15 12 12 12 12 8

MODEL:

(F) !装配线平衡模型;

(A) (B) (C) SETS:

(G) !任务集合,有一个完成时间属性T;

(J) TASK/ A B C D E F G H I J K/: T;

(H) !任务之间的优先关系集合(A 必须

(D) (E) 完成才能开始B,等等);

(I) PRED( TASK, TASK)/ A,B B,C C,F

C,G F,J G,J

J,K D,E E,H E,I H,J I,J /; ! 工作站集合; STATION/1..4/;

TXS( TASK, STATION): X;

! X是派生集合TXS的一个属性。如果X(I,K)=1,则表示第I个任务 指派给第K个工作站完成; ENDSETS DATA:

!任务A B C D E F G H I J K的完成时间估计如下; T = 45 11 9 50 15 12 12 12 12 8 9; ENDDATA

! 当任务超过15个时,模型的求解将变得很慢;

!每一个作业必须指派到一个工作站,即满足约束①;

@FOR( TASK( I): @SUM( STATION( K): X( I, K)) = 1);

!对于每一个存在优先关系的作业对来说,前者对应的工作站I必须小于后 者对应的工作站J,即满足约束②;

@FOR( PRED( I, J): @SUM( STATION( K): K * X( J, K) - K * X( I, K)) >= 0); !对于每一个工作站来说,其花费时间必须不大于装配线周期; @FOR( STATION( K):

@SUM( TXS( I, K): T( I) * X( I, K)) <= CYCTIME); !目标函数是最小化转配线周期; MIN = CYCTIME;

!指定X(I,J) 为0/1变量; @FOR( TXS: @BIN( X)); END

计算的部分结果为

Global optimal solution found at iteration: 1255 Objective value: 50.00000

Variable Value Reduced Cost CYCTIME 50.00000 0.000000 X( A, 1) 1.000000 0.000000 X( A, 2) 0.000000 0.000000 X( A, 3) 0.000000 45.00000 X( A, 4) 0.000000 0.000000 X( B, 1) 0.000000 0.000000 X( B, 2) 0.000000 0.000000

(K)

页 第37

X( B, 3) 1.000000 11.00000 X( B, 4) 0.000000 0.000000 X( C, 1) 0.000000 0.000000 X( C, 2) 0.000000 0.000000 X( C, 3) 0.000000 9.000000 X( C, 4) 1.000000 0.000000 X( D, 1) 0.000000 0.000000 X( D, 2) 1.000000 0.000000 X( D, 3) 0.000000 50.00000 X( D, 4) 0.000000 0.000000 X( E, 1) 0.000000 0.000000 X( E, 2) 0.000000 0.000000 X( E, 3) 1.000000 15.00000 X( E, 4) 0.000000 0.000000 X( F, 1) 0.000000 0.000000 X( F, 2) 0.000000 0.000000 X( F, 3) 0.000000 12.00000 X( F, 4) 1.000000 0.000000 X( G, 1) 0.000000 0.000000 X( G, 2) 0.000000 0.000000 X( G, 3) 0.000000 12.00000 X( G, 4) 1.000000 0.000000 X( H, 1) 0.000000 0.000000 X( H, 2) 0.000000 0.000000 X( H, 3) 1.000000 12.00000 X( H, 4) 0.000000 0.000000 X( I, 1) 0.000000 0.000000 X( I, 2) 0.000000 0.000000 X( I, 3) 1.000000 12.00000 X( I, 4) 0.000000 0.000000 X( J, 1) 0.000000 0.000000 X( J, 2) 0.000000 0.000000 X( J, 3) 0.000000 8.000000 X( J, 4) 1.000000 0.000000 X( K, 1) 0.000000 0.000000 X( K, 2) 0.000000 0.000000 X( K, 3) 0.000000 9.000000 X( K, 4) 1.000000 0.000000

例7.3 旅行售货员问题(又称货郎担问题,Traveling Salesman Problem)

有一个推销员,从城市1出发,要遍访城市2,3,?,n各一次,最后返回城市1。已知从城市i到j的旅费为ij,问他应按怎样的次序访问这些城市,使得总旅费最少?

可以用多种方法把TSP表示成整数规划模型。这里介绍的一种建立模型的方法,是把该问题的每个解(不一定是最优的)看作是一次“巡回”。

在下述意义下,引入一些0-1整数变量:

ncxij?1,巡回路线是从???0,其它情况i到j,且i?j其目标只是使i,j?1为最小。

这里有两个明显的必须满足的条件:

访问城市i后必须要有一个即将访问的确切城市;访问城市j前必须要有一个刚刚访问过的确切城市。用下面的两组约束分别实现上面的两个条件。

n?cijxij

?xj?1ij?1,i?1,2,?,n

页 第38

n

到此我们得到了一个模型,它是一个指派问题的整数规划模型。但以上两个条件对于TSP来说并不充分,仅仅是必要条件。例如:

以上两个条件都满足,但它显然不是TSP的解,它存在

6 3 两个子巡回。

这里,我们将叙述一种在原模型上附加充分的约束条件以避免产生子巡回的方法。把额外变量4 1 ui(i?2,3,?,n)附加到问题中。可把这些变量看作是连2

续的(最然这些变量在最优解中取普通的整数值)。现5 在附加下面形式的约束条件

i?1?xij?1,j?1,2,?,n。

为了证明该约束条件有预期的效果,必须证明:(1)任何含子巡回的路线都不满足该约束条件;(2)全部巡回都满足该约束条件。

首先证明(1),用反证法。假设还存在子巡回,也就是说至少有两个子巡回。那么至少存在一个子巡回中不含城市1。把该子巡回记为i1i2?iki1,则必有

ui1?ui2?n?n?1ui21?ui3?n?n?1?uik?ui1?n?n?1ui?uj?nxij?n?1,2?i?j?n把这k个式子相加,有

n?n?1,矛盾!

故假设不正确,结论(1)得证。

下面证明(2),采用构造法。对于任意的总巡回1i1?in?11,可取

ui?访问城市i的顺序数,取值范围为{0,1,?,n?2}。

u?uj?n?2,2?i?j?n因此,i。下面来证明总巡回满足该约束条件。 (ⅰ)总巡回上的边

?ui1?ui2?n?n?1?n?1??ui2?ui3?n?n?1?n?1????u?in?2?uin?1?n?n?1?n?1

(ⅱ)非总巡回上的边

??uir?uj?n?2?n?1,r?1,2,?,n?2,j?{2,3,?,n}?{ir,ir?1}?j?{2,3,?,n}?{ir}??uin?1?uj?n?2?n?1,

从而结论(2)得证。

这样我们把TSP转化成了一个混合整数线性规划问题。

页 第39

显然,当城市个数较大(大于30)时,该混合整数线性规划问题的规模会很大,从而给求解带来很大问题。TSP已被证明是NP难问题,目前还没有发现多项式时间的算法。对于小规模问题,我们求解这个混合整数线性规划问题的方式还是有效的。

TSP是一个重要的组合优化问题,除了有直观的应用外,许多其它看似无联系的优化问题也可转化为TSP。例如:

问题1 现需在一台机器上加工n个零件(如烧瓷器),这些零件可按任意先后顺序在机器上加工。我们希望加工完成所有零件的总时间尽可能少。由于加工工艺的要求,加工零件j时机器必须处于相应状态j(如炉温)。设起始未加工任何零件时机器处于状态s0,且当所有零件加工完成后需恢复到s0状态。已知从状态si调整到状态j需要时间ij。零件j本身

p加工时间为j。为方便起见,引入一个虚零件0,其加工时间为0,要求状态为s0,则{0,1,2,?,n}的一个圈置换π就表示对所有零件的一个加工顺序,在此置换下,完成所有加工所需要的总时间为 nnns(j?i)cs??min????s.t.?????????nz?i,j?1i?jn?cijxij?xi?1nij?1,?1,j?1,2,?,ni?1,2,?,n2?i?j?n?xj?1ijui?uj?nxij?n?1,xij?0,1,ui?0,i,j?1,2,?,ni?2,3,?,n?(c?i?0ni(i)?p?(i))??c?i?0i(i)??j?0pj.

由于

?j?0pj是一个常数,故该零件的加工顺序问题变成TSP。

!旅行售货员问题; model: sets:

city / 1.. 5/: u; link( city, city): dist, ! 距离矩阵; x; endsets

n = @size( city);

data: !距离矩阵,它并不需要是对称的;

dist = @qrand(1); !随机产生,这里可改为你要解决的问题的数据; enddata

!目标函数;

min = @sum( link: dist * x); @FOR( city( K): !进入城市K;

@sum( city( I)| I #ne# K: x( I, K)) = 1; !离开城市K;

@sum( city( J)| J #ne# K: x( K, J)) = 1; );

页 第40