热度 1|
线性规划——LINGO程序集
程序一:
Model:
Max= 4.8*x11 + 4.8*x21 + 5.6*x12 + 5.6*x22 - 10*x1 - 8*x2 - 6*x3;
x11+x12 < x + 500;
x21+x22 < 1000;
0.5*x11 - 0.5*x21 > 0;
0.4*x12 - 0.6*x22 > 0;
x=x1+x2+x3;
(x1 - 500) * x2=0;
(x2 - 500) * x3=0;
@bnd(0,x1, 500);
@bnd(0,x2, 500);
@bnd(0,x3,500);
End
程序二:
Model:
SETS:
Points/1..4/: b, c, y, z; ! 端点数为4,即分段数为3;
ENDSETS
DATA:
b=0 500 1000 1500;
c=0 5000 9000 12000;
y=,,,0; ! 增加的虚拟变量y(4)=0;
ENDDATA
Max= 4.8*x11 + 4.8*x21 + 5.6*x12 + 5.6*x22 - @sum(Points: c*z);
x11+x12 < x + 500;
x21+x22 < 1000;
0.5*x11 - 0.5*x21 > 0;
0.4*x12 - 0.6*x22 > 0;
@sum(Points: b*z)=x;
@for(Points(i)|i#eq#1: z(i) <= y(i));
@for(Points(i)|i#ne#1: z(i) <= y(i-1)+y(i));
@sum(Points: y)=1;
@sum(Points: z)=1;
@for(Points: @bin(y));
End
程序三:
MODEL:
TITLE 瓶颈设备的多级生产计划;
! 从文本文件exam0502.LDT中读取数据;
SETS:
! PART = 项目集合, Setup = 生产准备费,Hold = 单件库存成本,
A = 对瓶颈资源的消耗系数;
PART/ @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT')/ : Setup, Hold, A;
! TIME = 计划期集合,Capacity = 瓶颈设备的能力;
TIME / @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT')/ : Capacity;
! USES = 项目结构关系,Req = 项目之间的消耗系数;
USES( PART, PART) : Req;
! PXT = 项目与时间的派生集合,Demand = 外部需求,
X = 产量(批量), Y = 0/1变量,INV = 库存;
PXT( PART, TIME): Demand, X, Y, Inv;
ENDSETS
! 目标函数;
[OBJ] Min = @sum(PXT(i,t):
setup(i)*Y(i,t) + hold(i)*Inv(i,t) );
! 物流平衡方程;
@FOR( PXT(i, t) | t #NE# 1 : [Bal]
Inv(i,t-1)+X(i,t)-Inv(i,t) = Demand(i, t) +
@SUM( USES(i,j): Req(i,j)*X(j,t)) );
@FOR( PXT(i, t) | t #eq# 1 : [Ba0]
X(i,t)-Inv(i,t) = Demand(i, t) +
@SUM( USES(i,j): Req(i,j)*X(j,t)) );
! 能力约束;
@FOR( TIME(t):
[Cap] @SUM( PART(i): A(i)*X(i,t) ) < Capacity(t) );
! 其他约束;
M = 25000;
@FOR( PXT(i,t): X(i,t) <= M*Y(i,t));
@FOR( PXT: @BIN(Y) );
DATA:
Demand = @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT');
Capacity = @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT');
Setup = @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT');
Hold = @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT');
A = @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT');
Req = @FILE( 'F:\lindo\lindo书\ch05\exam0502.LDT');
ENDDATA
程序四:
model:
Title 钢管下料 - 最小化钢管根数的LINGO模型;
SETS:
NEEDS/1..4/:LENGTH,NUM;
! 定义基本集合NEEDS及其属性LENGTH,NUM;
CUTS/1..3/:X;
! 定义基本集合CUTS及其属性X;
PATTERNS(NEEDS,CUTS):R;
! 定义派生集合PATTERNS(这是一个稠密集合)及其属性R;
ENDSETS
DATA:
LENGTH=4 5 6 8;
NUM=50 10 20 15;
CAPACITY=19;
ENDDATA
min=@SUM(CUTS(I): X(I) );
!目标函数;
@FOR(NEEDS(I): @SUM(CUTS(J): X(J)*R(I,J) ) >NUM(I) );
!满足需求约束;
@FOR(CUTS(J): @SUM(NEEDS(I): LENGTH(I)*R(I,J) ) <CAPACITY );
!合理切割模式约束;
@FOR(CUTS(J): @SUM(NEEDS(I): LENGTH(I)*R(I,J) ) >CAPACITY
-@MIN(NEEDS(I):LENGTH(I)) );
!合理切割模式约束;
@SUM(CUTS(I): X(I) ) >26; @SUM(CUTS(I): X(I) ) <31;
!人为增加约束;
@FOR(CUTS(I)|I#LT#@SIZE(CUTS):X(I)>X(I+1) );
!人为增加约束;
@FOR(CUTS(J): @GIN(X(J)) ) ;
@FOR(PATTERNS(I,J): @GIN(R(I,J)) );
end
程序五:
model:
Title 面试问题;
SETS:
! Person = 被面试者集合,Stage = 面试阶段的集合;
Person/@FILE(exam0505.txt)/;
Stage/@FILE(exam0505.txt)/;
! T = 已知的面试所需要的时间,X = 面试开始时间;
PXS(Person,Stage): T, X;
! Y(i,k) = 1: k排在i前,0:否则;
PXP(Person,Person)|&1 #LT# &2: Y;
ENDSETS
DATA:
T=@FILE(exam0505.txt);
ENDDATA
[obj] min =MAXT;
! MAXT是面试的最后结束时间;
MAXT >= @max(PXS(i,j)|j#EQ#@size(stage): x(i,j)+t(i,j));
! 只有参加完前一个阶段的面试后才能进入下一个阶段;
@for(PXS(i,j)|j #LT# @size(stage): [ORDER] x(i,j) + t(i,j) < x(i,j+1) );
! 同一时间只能面试1名同学;
@for(Stage(j):
@for(PXP(i,k): [SORT1] x(i,j) + t(i,j) - x(k,j) < MAXT*Y(i,k) );
@for(PXP(i,k): [SORT2] x(k,j) + t(k,j) - x(i,j) < MAXT*(1-Y(i,k)) );
);
@for(PXP: @bin(y));
End
程序六:
MODEL:
TITLE 飞机定位模型3;
SETS:
VOR/1..3/: x, y, cita, sigma,alpha;
ENDSETS
DATA:
x, y, cita, sigma =
746 1393 2.81347 0.0140
629 375 0.78714 0.0105
1571 259 5.39307 0.0227;
x4 y4 d4 sigma4 = 155 987 864.3 2.0;
ENDDATA
INIT:
xx, yy = 980.6926, 731.5666;
ENDINIT
! XX,YY表示飞机坐标;
@for(vor: @tan(alpha)=(xx-x)/(yy-y) );
min = @sum(VOR: ((alpha - cita)/sigma)^2 )
+ ((d4 - ((xx-x4)^2+(yy-y4)^2)^.5 )/sigma4 )^2;
END
程序七:
MODEL:
TITLE 交通流均衡;
SETS:
ROAD/AB,AC,BC,BD,CD/:Y;
CAR/2,3,4/;
LINK(CAR,ROAD): T, X;
ENDSETS
DATA:
! 行驶时间(分钟) ;
! T=20,52,12,52,20
30,53,13,53,30
40,54,14,54,40;
! 增加的总行驶时间(千辆车*分钟) ;
T= 20 52 12 52 20
50 55 15 55 50
70 57 17 57 70;
ENDDATA
[OBJ] MIN=@SUM(LINK: T*X); ! 目标函数;
! 四个节点的流量守恒条件;
[NODE_A] Y(@INDEX(AB))+Y(@INDEX(AC)) = 6;
[NODE_B] Y(@INDEX(AB))=Y(@INDEX(BC))+Y(@INDEX(BD));
[NODE_C] Y(@INDEX(AC))+Y(@INDEX(BC))=Y(@INDEX(CD));
[NODE_D] Y(@INDEX(BD))+Y(@INDEX(CD))=6;
! 每条道路上的总流量Y等于该道路上的分流量X的和;
@FOR( ROAD(I):
[ROAD_LIM] @SUM(CAR(J): X(J,I)) = Y(I) );
! 每条道路的分流量X的上下界设定;
@FOR(LINK(I,J)|I#EQ#1: @BND(0,X(I,J),2) );
@FOR(LINK(I,J)|I#GT#1: @BND(0,X(I,J),1) );
END
程序八:
MODEL:
Title 简单的投资组合模型;
SETS:
YEAR/1..12/;
STOCKS/ A, B, C/: Mean,X;
link(YEAR, STOCKS): R;
STST(Stocks,stocks): COV;
ENDSETS
DATA:
TARGET = 1.15;
! R是原始数据;
R =
1.300 1.225 1.149
1.103 1.290 1.260
1.216 1.216 1.419
0.954 0.728 0.922
0.929 1.144 1.169
1.056 1.107 0.965
1.038 1.321 1.133
1.089 1.305 1.732
1.090 1.195 1.021
1.083 1.390 1.131
1.035 0.928 1.006
1.176 1.715 1.908;
ENDDATA
CALC: !计算均值向量Mean与协方差矩阵COV;
@for(stocks(i): Mean(i) =
@sum(year(j): R(j,i)) / @size(year) );
@for(stst(i,j): COV(i,j) = @sum(year(k):
(R(k,i)-mean(i))*(R(k,j)-mean(j))) / (@size(year)-1) );
ENDCALC
[OBJ] MIN = @sum(STST(i,j): COV(i,j)*x(i)*x(j));
[ONE] @SUM(STOCKS: X) = 1;
[TWO] @SUM(stocks: mean*x) >= TARGET;
END
程序九:
MODEL:
Title 含有国库券的投资组合模型;
SETS:
STOCKS/ A, B, C, D/: Mean,X;
STST(Stocks,stocks): COV;
ENDSETS
DATA:
TARGET = 1.1; ! 1.15;
! Mean是收益均值,COV是协方差矩阵;
mean=1.089083 1.213667 1.234583 1.05;
COV=0.01080754 0.01240721 0.01307513 0
0.01240721 0.05839170 0.05542639 0
0.01307513 0.05542639 0.09422681 0
0 0 0 0;
ENDDATA
[OBJ] MIN = @sum(STST(i,j): COV(i,j)*x(i)*x(j));
[ONE] @SUM(STOCKS: X) = 1;
[TWO] @SUM(stocks: mean*x) >= TARGET;
END
程序十:
MODEL:
Title 考虑交易费的投资组合模型;
SETS:
STOCKS/ A, B, C/: C,Mean,X,Y,Z;
STST(Stocks,stocks): COV;
ENDSETS
DATA:
TARGET = 1.15;
! 股票的初始份额;
c=0.5 0.35 0.15;
! Mean是收益均值,COV是协方差矩阵;
mean=1.089083 1.213667 1.234583;
COV=0.01080754 0.01240721 0.01307513
0.01240721 0.05839170 0.05542639
0.01307513 0.05542639 0.09422681;
ENDDATA
[OBJ] MIN = @sum(STST(i,j): COV(i,j)*x(i)*x(j));
[ONE] @SUM(STOCKS: X+0.01*Y+0.01*Z) = 1;
[TWO] @SUM(stocks: mean*x) >= TARGET;
@FOR(stocks: [ADD] x = c - y + z);
END
程序十一:
MODEL:
Title 利用股票指数简化投资组合模型;
SETS:
STOCKS/A, B, C/: u, b, s2, x;
ENDSETS
DATA:
! mean0,s20,u,b,s2是线性回归的结果数据;
mean0=1.191458;
s20 = 0.02873661;
s2 = 0.005748320,0.01564263,0.03025165;
u = 0.5639761, -0.2635059,-0.5809590;
b = 0.4407264, 1.239802, 1.523798;
ENDDATA
[OBJ] MIN = s20*y*y + @sum(stocks: s2*x*x);
![OBJ] MIN = s20*@sqr(y) + @sum(stocks: s2*@sqr(x));
@sum(stocks: b*x)=y;
@sum(stocks: x)=1;
@sum(stocks: (u+b*mean0)*x)>1.15;
END
程序十二:
MODEL:
TITLE 新产品的市场预测;
SETS:
PROD/ A B C D/: P;
LINK(PROD, PROD): T;
ENDSETS
DATA: ! 转移概率矩阵;
T = .75 .1 .05 .1
.4 .2 .1 .3
.1 .2 .4 .3
.2 .2 .3 .3;
ENDDATA
@FOR(PROD(I)| I #LT# @SIZE(PROD):
!去掉了一个冗余约束;
P(I)=@SUM(LINK(J,I): P(J)* T(J,I)) );
@SUM(PROD: P) = 1;
@FOR(PROD(I):
@WARN( '输入矩阵的每行之和必须是1',
@ABS( 1 - @SUM(LINK(I,J): T(I,J)))
#GT# .000001); );
END
程序十三:
MODEL:
TITLE 产品属性的效用函数;
SETS:
PRICE /H, M, L/ : P;
SAFETY/2, 1, 0/ : Q;
M(safety, PRICE) : C0;
MM(M, M)|C0(&1,&2) #LT# C0(&3,&4): ERROR;
ENDSETS
DATA:
C0 = 7 8 9 3 4 6 1 2 5;
ENDDATA
@FOR( MM( i, j, k, l): ERROR( i, j, k, l) >=
1 + ( P( j) + Q( i)) - ( P( l) + Q( k)) );
[obj] MIN = @SUM(mm: ERROR);
END
程序十四:
MODEL:
TITLE 最小二乘法计算产品属性的效用函数;
SETS:
PRICE /H, M, L/ : P;
SAFETY/2, 1, 0/ : Q;
M(safety, PRICE) : C0, ERROR, sort;
ENDSETS
DATA:
C0 = 7 8 9 3 4 6 1 2 5;
ENDDATA
@FOR(M(i,j):sort(i,j)=p(j)+q(i);
ERROR(i,j)= sort(i,j) -C0(i,j) );
MIN = @SUM(M: @sqr(ERROR) );
![obj] MIN = @SUM(M: ERROR^2 );
@FOR(M(i,j): @FREE(ERROR) );
!@FOR(price: @gin(P) );
!@FOR(safety: @gin(Q) );
END
程序十五:
MODEL:
TITLE 机票销售计划;
SETS:
route /AH,AB,AC,HB,HC/:a,b,p,q,x,y;
ENDSETS
DATA:
a p b q =
33 | 190 | 56 | 90 |
24 | 244 | 43 | 193 |
12 | 261 | 67 | 199 |
44 | 140 | 69 | 80 |
16 | 186 | 17 | 103 |
; c1 c2 c3 = 120 100 110;
ENDDATA
[obj] Max = @SUM(route: p*x+q*y );
@SUM(route(i)|i#ne#4#and#i#ne#5:x(i)+y(i)) < c1;
@SUM(route(i)|i#eq#2#or#i#eq#4:x(i)+y(i)) < c2;
@SUM(route(i)|i#eq#3#or#i#eq#5:x(i)+y(i)) < c3;
@FOR(route: @bnd(0,x,a);@bnd(0,y,b) );
END
程序十六:
! 3 Warehouse, 4 Customer Transportation Problem;
sets:
Warehouse /1..3/: a;
Customer /1..4/: b;
Routes( Warehouse, Customer) : c, x;
endsets
! Here are the parameters;
data:
a = 30, 25, 21;
b = 15, 17, 22, 12;
c = 6, 2, 6, 7,
4, 9, 5, 3,
8, 8, 1, 5;
enddata
! The objective;
[OBJ] min = @sum( Routes: c * x);
! The supply constraints;
@for( Warehouse(i): [SUP]
@sum( Customer(j): x(i,j)) <= a(i));
! The demand constraints;
@for( Customer(j): [DEM]
@sum( Warehouse(i): x(i,j)) = b(j));
程序十七:
! Assignment Problem Model;
sets:
Flight/1..6/;
Assign(Flight, Flight): c, x;
endsets
! Here is income matrix;
data:
c = 20 15 16 5 4 7
17 15 33 12 8 6
9 12 18 16 30 13
12 8 11 27 19 14
-99 7 10 21 10 32
-99 -99 -99 6 11 13;
enddata
! Maximize valve of assignments;
max = @sum(Assign: c*x);
@for(Flight(i):
! Each i must be assigned to some j;
@sum(Flight(j): x(i,j)) = 1;
! Each I must receive an assignment;
@sum(Flight(j): x(j,i)) = 1;
);
程序十八:
! 2 plants, 3 warehouses and 4 customers
Transshipment Problem;
sets:
Plant /A, B/: produce;
Warhouse /x, y, z/;
Customer /1..4/: require;
LinkI ( Plant, Warhouse): cI, xI;
LinkII ( Warhouse, Customer): cII, xII;
endsets
! Here are the parameters;
data:
produce = 9, 8;
require = 3, 5, 4, 5;
cI = 1, 2, 100,
3, 1, 2;
cII = 5, 7, 100, 100,
9, 6, 7, 100,
100, 8, 7, 4;
enddata
! The objective;
[OBJ] min = @sum( LinkI: cI * xI) + @sum( LinkII: cII * xII);
! The supply constraints;
@for( Plant(i): [SUP]
@sum( Warhouse(j): xI(i,j)) <= produce(i));
! The warhouse constraints;
@for( Warhouse(j): [MID]
@sum( Plant(i): xI(i,j))=@sum( Customer(k): xII(j,k)));
! The demand constraints;
@for( Customer(k): [DEM]
@sum( Warhouse(j): xII(j,k)) = require(k));
! 2 plants, 3 warehouses and 4 customers
Transshipment Problem;
sets:
Plant /A,B/ : produce;
Warhouse /x,y,z/;
Customer /1..4/ : require;
Link ( Plant, Warhouse, Customer) : poss, cost, x;
endsets
! Here are the parameters;
data:
produce = 9, 8;
require = 3, 5, 4, 5;
poss = 1, 1, 0, 0,
1, 1, 1, 0,
0, 0, 0, 0,
1, 1, 0, 0,
1, 1, 1, 0,
0, 1, 1, 1;
cost = 6, 8, 0, 0,
11, 8, 9, 0,
0, 0, 0, 0,
8,10, 0, 0,
10, 7, 8, 0,
0,10, 9, 6;
enddata
! The objective;
[OBJ] min = @sum( Link: poss * cost * x);
! The supply constraints;
@for( Plant(i): [SUP]
@sum( Warhouse(j):
@sum( Customer(k): poss(i,j,k) * x(i,j,k)))<=produce(i));
! The demand constraints;
@for( Customer(k): [DEM]
@sum( Plant(i):
@sum( Warhouse(j): poss(i,j,k) * x(i,j,k))) = require(k));
程序十九:
! We have a network of 7 cities. We want to find
the length of the shortest route from city 1 to city 7;
sets:
! Here is our primitive set of seven cities;
cities/A, B1, B2, C1, C2, C3, D/;
! The Derived set "roads" lists the roads that
exist between the cities;
roads(cities, cities)/
A,B1 A,B2 B1,C1 B1,C2 B1,C3 B2,C1 B2,C2 B2,C3
C1,D C2,D C3,D/: w, x;
endsets
data:
! Here are the distances that correspond
to above links;
w = 2 4 3 3 1 2 3 1 1 3 4;
enddata
n=@size(cities); ! The number of cities;
min=@sum(roads: w*x);
@for(cities(i) | i #ne# 1 #and# i #ne# n:
@sum(roads(i,j): x(i,j)) = @sum(roads(j,i): x(j,i)));
@sum(roads(i,j)|i #eq# 1 : x(i,j))=1;
程序二十:
sets:
cities/1..11/;
roads(cities, cities): p, w, x;
endsets
data:
p = 0 1 1 1 0 0 0 0 0 0 0
0 0 1 0 1 0 0 0 0 0 0
0 1 0 1 1 1 1 0 0 0 0
0 0 1 0 0 0 1 0 0 0 0
0 1 1 0 0 1 0 1 1 0 0
0 0 1 0 1 0 1 0 1 0 0
0 0 1 1 0 1 0 0 1 1 0
0 0 0 0 1 0 0 0 1 0 1
0 0 0 0 1 1 1 1 0 1 1
0 0 0 0 0 0 1 0 1 0 1
0 0 0 0 0 0 0 0 0 0 0;
w = 0 2 8 1 0 0 0 0 0 0 0
2 0 6 0 1 0 0 0 0 0 0
8 6 0 7 5 1 2 0 0 0 0
1 0 7 0 0 0 9 0 0 0 0
0 1 5 0 0 3 0 2 9 0 0
0 0 1 0 3 0 4 0 6 0 0
0 0 2 9 0 4 0 0 3 1 0
0 0 0 0 2 0 0 0 7 0 9
0 0 0 0 9 6 3 7 0 1 2
0 0 0 0 0 0 1 0 1 0 4
0 0 0 0 0 0 0 9 2 4 0;
enddata
n=@size(cities);
min=@sum(roads:w*x);
@for(cities(i) | i #ne# 1 #and# i #ne# n:
@sum(cities(j): p(i,j)*x(i,j)) = @sum(cities(j): p(j,i)*x(j,i)));
@sum(cities(j): p(1,j)*x(1,j))=1;
程序二十一:
sets:
nodes/s,1,2,3,4,t/;
arcs(nodes, nodes)/
s,1 s,2 1,2 1,3 2,4 3,2 3,t 4,3 4,t/: c, f;
endsets
data:
c = 8 7 5 9 9 2 5 6 10;
enddata
max=flow;
@for(nodes(i) | i #ne# 1 #and# i #ne# @size(nodes):
@sum(arcs(i,j):f(i,j)) - @sum(arcs(j,i):f(j,i))=0);
@sum(arcs(i,j)|i #eq# 1 : f(i,j)) = flow;
@for(arcs: @bnd(0, f, c));
程序二十二:
sets:
nodes/s,1,2,3,4,t/;
arcs(nodes, nodes): p, c, f;
endsets
data:
p = 0 1 1 0 0 0
0 0 1 1 0 0
0 0 0 0 1 0
0 0 1 0 0 1
0 0 0 1 0 1
0 0 0 0 0 0;
c = 0 8 7 0 0 0
0 0 5 9 0 0
0 0 0 0 9 0
0 0 2 0 0 5
0 0 0 6 0 10
0 0 0 0 0 0;
enddata
max = flow;
@for(nodes(i) | i #ne# 1 #and# i #ne# @size(nodes):
@sum(nodes(j): p(i,j)*f(i,j)) = @sum(nodes(j):p(j,i)*f(j,i)) );
@sum(nodes(i):p(1,i)* f(1,i)) = flow;
@for(arcs:@bnd(0, f, c));
程序二十三:
sets:
nodes/s,1,2,3,4,t/:d;
arcs(nodes, nodes)/
s,1 s,2 1,2 1,3 2,4 3,2 3,t 4,3 4,t/: c, u, f;
endsets
data:
d = 14 0 0 0 0 -14;
c = 2 8 5 2 3 1 6 4 7;
u = 8 7 5 9 9 2 5 6 10;
enddata
min=@sum(arcs:c*f);
@for(nodes(i) | i #ne# 1 #and# i #ne# @size(nodes):
@sum(arcs(i,j):f(i,j)) - @sum(arcs(j,i):f(j,i))=d(i));
@sum(arcs(i,j)|i #eq# 1 : f(i,j))=d(1);
@for(arcs:@bnd(0,f,u));
程序二十四:
sets:
cities/1..10/:level; !level(i)= the level of city;
link(cities, cities):
distance, !The distance matrix;
x; ! x(i,j)=1 if we use link i,j;
endsets
data: !Distance matrix, it need not be symmetirc;
distance = 0 8 5 9 12 14 12 16 17 22
8 0 9 15 16 8 11 18 14 22
5 9 0 7 9 11 7 12 12 17
9 15 7 0 3 17 10 7 15 15
12 16 9 3 0 8 10 6 15 15
14 8 11 17 8 0 9 14 8 16
12 11 7 10 10 9 0 8 6 11
16 18 12 7 6 14 8 0 11 11
17 14 12 15 15 8 6 11 0 10
22 22 17 15 15 16 11 11 10 0;
enddata
n=@size(cities); !The model size;
! Minimize total distance of the links;
min=@sum(link(i,j)|i #ne# j: distance(i,j)*x(i,j));
!There must be an arc out of city 1;
@sum(cities(i)|i #gt# 1: x(1,i))>=1;
!For city i, except the base (city 1);
@for(cities(i) | i #gt# 1 :
! It must be entered;
@sum(cities(j)| j #ne# i: x(j,i))=1;
! level(j)=levle(i)+1, if we link j and i;
@for(cities(j)| j #gt# 1 #and# j #ne# i :
level(j) >= level(i) + x(i,j)
- (n-2)*(1-x(i,j)) + (n-3)*x(j,i);
);
! The level of city is at least 1 but no more n-1,
and is 1 if it links to base (city 1);
@bnd(1,level(i),999999);
level(i)<=n-1-(n-2)*x(1,i);
);
! Make the x's 0/1;
@for(link : @bin(x));
程序二十五:
sets:
cities/1..10/:level; !level(i)= the level of city;
link(cities, cities):
distance, !The distance matrix;
x; ! x(i,j)=1 if we use link i,j;
endsets
data: !Distance matrix, it need not be symmetirc;
distance = 0 8 5 9 12 14 12 16 17 22
8 0 9 15 16 8 11 18 14 22
5 9 0 7 9 11 7 12 12 17
9 15 7 0 3 17 10 7 15 15
12 16 9 3 0 8 10 6 15 15
14 8 11 17 8 0 9 14 8 16
12 11 7 10 10 9 0 8 6 11
16 18 12 7 6 14 8 0 11 11
17 14 12 15 15 8 6 11 0 10
22 22 17 15 15 16 11 11 10 0;
enddata
n=@size(cities); !The model size;
! Minimize total distance of the links;
min=@sum(link(i,j)|i #ne# j: distance(i,j)*x(i,j));
!There must be an arc out of city 1;
@sum(cities(i)|i #gt# 1: x(1,i))>=1;
!For city i, except the base (city 1);
@for(cities(i) | i #gt# 1 :
! It must be entered;
@sum(cities(j)| j #ne# i: x(j,i))=1;
! level(j)=levle(i)+1, if we link j and i;
@for(cities(j)| j #gt# 1 #and# j #ne# i :
level(j) >= level(i) + x(i,j)
- (n-2)*(1-x(i,j)) + (n-3)*x(j,i);
);
! The level of city is at least 1 but no more n-1,
and is 1 if it links to base (city 1);
@bnd(1,level(i),999999);
level(i)<=n-1-(n-2)*x(1,i);
);
! Make the x's 0/1;
@for(link : @bin(x));
程序二十六:
sets:
cities/1..10/:level; !level(i)= the level of city;
link(cities, cities):
distance, !The distance matrix;
x; ! x(i,j)=1 if we use link i,j;
endsets
data: !Distance matrix, it need not be symmetirc;
distance = 0 8 5 9 12 14 12 16 17 22
8 0 9 15 16 8 11 18 14 22
5 9 0 7 9 11 7 12 12 17
9 15 7 0 3 17 10 7 15 15
12 16 9 3 0 8 10 6 15 15
14 8 11 17 8 0 9 14 8 16
12 11 7 10 10 9 0 8 6 11
16 18 12 7 6 14 8 0 11 11
17 14 12 15 15 8 6 11 0 10
22 22 17 15 15 16 11 11 10 0;
enddata
n=@size(cities); !The model size;
! Minimize total distance of the links;
min=@sum(link(i,j)|i #ne# j: distance(i,j)*x(i,j));
!For city i;
@for(cities(i) :
! It must be entered;
@sum(cities(j)| j #ne# i: x(j,i))=1;
! It must be departed;
@sum(cities(j)| j #ne# i: x(i,j))=1;
! level(j)=levle(i)+1, if we link j and i;
@for(cities(j)| j #gt# 1 #and# j #ne# i :
level(j) >= level(i) + x(i,j)
- (n-2)*(1-x(i,j)) + (n-3)*x(j,i);
);
);
! Make the x's 0/1;
@for(link : @bin(x));
! For the first and last stop;
@for(cities(i) | i #gt# 1 :
level(i)<=n-1-(n-2)*x(1,i);
level(i)>=1+(n-2)*x(i,1);
);
程序二十九:
sets:
events/1..8/: d;
operate(events, events)/
! A B C D E 0 F G H I 0 J K;
1,2 1,3 1,4 3,4 2,5 3,5 4,6 5,6 5,8 5,7 6,7 7,8 6,8
/: a, m, b, et, dt, x;
endsets
data:
a = 3 8 8 2 3 0 8 18 26 18 0 12 11;
m = 5 9 11 4 4 0 16 20 33 25 0 15 21;
b = 7 16 14 6 5 0 18 28 52 32 0 18 25;
d = 1 0 0 0 0 0 0 -1;
limit = 52;
enddata
@for(operate:
et = (a+4*m+b)/6;
dt = (b-a)^2/36;
);
max = Tbar;
Tbar = @sum(operate: et*x);
@for(events(i):
@sum(operate(i,j): x(i,j)) - @sum(operate(j,i): x(j,i))
=d(i);
);
S^2=@sum(operate: dt*x);
p=@psn((limit-Tbar)/S);
@psn((days-Tbar)/S) = 0.95;
程序三十:
sets:
Level/1..3/: P, z, Goal;
Variable/1..2/: x;
H_Con_Num/1..1/: b;
S_Con_Num/1..4/: g, dplus, dminus;
H_Cons(H_Con_Num, Variable): A;
S_Cons(S_Con_Num, Variable): C;
Obj(Level, S_Con_Num): Wplus, Wminus;
endsets
data:
P= ? ? ?;
Goal = ? ? 0;
b = 12;
g= 1500 0 16 15;
A = 2 2;
C = 200 300 2 -1 4 0 0 5;
Wplus = 0 0 0 0
0 1 0 0
0 0 3 1;
Wminus = 1 0 0 0
0 1 0 0
0 0 3 0;
enddata
min=@sum(Level: P * z);
@for(Level(i):
z(i)=@sum(S_Con_Num(j): Wplus(i,j)*dplus(j))
+@sum(S_Con_Num(j): Wminus(i,j)*dminus(j)));
@for(H_Con_Num(i):
@sum(Variable(j): A(i,j) * x(j)) <= b(i));
@for(S_Con_Num(i):
@sum(Variable(j): C(i,j)*x(j))
+ dminus(i) - dplus(i) = g(i);
);
@for(Level(i) | i #lt# @size(Level):
@bnd(0, z(i), Goal(i));
);
程序三十一:
sets:
Level/1..4/: P, z, Goal;
Variable/1..2/: x;
S_Con_Num/1..4/: g, dplus, dminus;
S_Cons(S_Con_Num, Variable): C;
Obj(Level, S_Con_Num): Wplus, Wminus;
endsets
data:
P= ? ? ? ?;
Goal = ?, ?, ?, 0;
g= 27500 800 320 900;
C = 25 10 1 0 0 1 1 0;
Wplus = 0 0 0 0
0 0 0 1
0 0 0 0
0 1 3 0;
Wminus = 1 0 0 0
0 0 0 0
0 2 1 0
0 0 0 0;
enddata
min=@sum(Level: P * z);
@for(Level(i):
z(i)=@sum(S_Con_Num(j): Wplus(i,j)*dplus(j))
+@sum(S_Con_Num(j): Wminus(i,j)*dminus(j)));
@for(S_Con_Num(i):
@sum(Variable(j): C(i,j)*x(j))
+ dminus(i) - dplus(i) = g(i);
);
@for(Level(i) | i #lt# @size(Level):
@bnd(0, z(i), Goal(i));
);
程序三十二:
sets:
Level/1..5/: P, z, Goal;
Variable/1..3/: x;
S_Con_Num/1..8/: g, dplus, dminus;
S_Cons(S_Con_Num, Variable): C;
Obj(Level, S_Con_Num): Wplus, Wminus;
endsets
data:
P= ? ? ? ? ?;
Goal = ?, ?, ?, ?, 0;
g= 1700 50 50 80 100 120 100 1900;
C = 5 8 12 1 0 0 0 1 0 0 0 1 1 0 0 0 1 0 0 0 1 5 8 12;
Wplus = 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0;
Wminus = 1 0 0 0 0 0 0 0
0 20 18 21 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 20 18 21 0
0 0 0 0 0 0 0 0;
enddata
min=@sum(Level: P * z);
@for(Level(i):
z(i)=@sum(S_Con_Num(j): Wplus(i,j)*dplus(j))
+@sum(S_Con_Num(j): Wminus(i,j)*dminus(j)));
@for(S_Con_Num(i):
@sum(Variable(j): C(i,j)*x(j))
+ dminus(i) - dplus(i) = g(i);
);
@for(Level(i) | i #lt# @size(Level):
@bnd(0, z(i), Goal(i));
);
程序三十二:
sets:
Level/1..8/: P, z, Goal;
S_Con_Num/1..13/: dplus, dminus;
Plant /1..3/: a;
Customer /1..4/: b;
Routes(Plant, Customer): c, x;
endsets
data:
P= ? ? ? ? ? ? ? ?;
Goal = ? ? ? ? ? ? ? 0;
a = 300 200 400;
b = 200 100 450 250;
c = 5 2 6 7
3 5 4 6
4 5 2 3;
enddata
min=@sum(Level: P * z);
z(1) = dminus(9);
z(2) = dminus(1);
z(3) = dminus(2)+dminus(3)+dminus(4)+dminus(5);
z(4) = dminus(6)+dminus(7)+dminus(8)+dminus(9);
z(5) = dplus(10);
z(6) = dplus(11);
z(7) = dminus(12)+dplus(12);
z(8) = dplus(13);
@for(Plant(i):
@sum(Customer(j): x(i,j)) <= a(i));
x(3,1)+dminus(1)-dplus(1)=100;
@for(Customer(j):
@sum(Plant(i): x(i,j))+dminus(1+j)-dplus(1+j)=0.8*b(j);
@sum(Plant(i): x(i,j))+dminus(5+j)-dplus(5+j)=b(j);
);
@sum(Routes: c*x)+dminus(10)-dplus(10)=3245;
x(2,4)+dminus(11)-dplus(11)=0;
@sum(Plant(i): x(i,1))-20/45*@sum(Plant(i): x(i,3))
+dminus(12)-dplus(12)=0;
@sum(Routes: c*x)+dminus(13)-dplus(13)=2950;
@for(Level(i)|i #lt# @size(Level):
@bnd(0,z(i),Goal(i));
);
程序三十三:
sets:
optA/1..3/: x;
optB/1..3/: y;
AXB(optA,optB) : Ca, Cb;
endsets
data:
Ca = 14 13 12
13 12 12
12 12 13;
Cb = 13 14 15
14 15 15
15 15 14;
enddata
Va=@sum(AXB(i,j): Ca(i,j)*x(i)*y(j));
Vb=@sum(AXB(i,j): Cb(i,j)*x(i)*y(j));
@for(optA(i):
@sum(optB(j) : Ca(i,j)*y(j))<=Va);
@for(optB(j):
@sum(optA(i) : Cb(i,j)*x(i))<=Vb);
@sum(optA : x)=1; @sum(optB : y)=1;
@free(Va); @free(Vb);
程序三十四:
sets:
order/1..99/: TC, EOQ;
endsets
@for(order(i):
EOQ(i)=D/i;
TC(i)=0.5*C_P*EOQ(i)+C_D*D/EOQ(i);
);
TC_min=@min(order: TC);
Q=@sum(order(i): EOQ(i)*(TC_min #eq# TC(i)));
N=D/Q;
data:
C_D = 12000;
D = 96000;
C_P = 3.6;
enddata
程序三十五:
sets:
order/1..99/: TC, EOQ, EOS;
endsets
@for(order(i):
EOQ(i)=D/i;
EOS(i)=C_P/(C_p+C_S)*EOQ(i);
TC(i)=0.5*C_P*(EOQ(i)-EOS(i))^2/EOQ(i)+C_D*D/EOQ(i)
+0.5*C_S*EOS(i)^2/EOQ(i);
);
TC_min=@min(order: TC);
Q=@sum(order(i): EOQ(i)*(TC_min #eq# TC(i)));
S=@sum(order(i): EOS(i)*(TC_min #eq# TC(i)));
N=D/Q;
data:
C_D = 12000;
D = 96000;
C_P = 3.6;
C_S = 13.2;
Enddata
程序三十六:
sets:
range/1..4/: B, C, C_P, EOQ, Q, TC;
endsets
data:
D = 40000;
C_D = 9000;
R = .2;
B = 10000, 20000, 30000, 40000;
C = 35.225, 34.525, 34.175, 33.825;
enddata
@for(range:
C_P = R*C;
EOQ = ( 2*C_D*D/C_P)^0.5;
);
Q(1) = EOQ(1)-(EOQ(1)-B(1)+1)*(EOQ(1) #ge# B(1));
@for(range(i) | i #gt# 1:
Q(i)=EOQ(i)+(B(i-1)-EOQ(i))*(EOQ(i) #lt# B(i-1))
-(EOQ(i)- B(i)+1)*(EOQ(i) #ge# B(i));
);
@for(range(i):
TC(i)=0.5*C_P(i)*Q(i)+C_D*D/Q(i)+C(i)*D);
TC_min = @min(range: TC);
Q_star = @sum(range: Q*( TC #eq# TC_min));
T_star = Q_star/D;
程序三十七:
MODEL:
TITLE 飞行管理问题的非线性规划模型;
SETS:
Plane/1..6/: x0, y0, cita0, cita1, d_cita;
! cita0表示初始角度,cita1为调整后的角度,d_cita为调整的角度;
link(plane, plane)|&1 #LT# &2: b,c;
ENDSETS
DATA:
x0 y0 cita0 =
150 | 140 | 243 |
85 | 85 | 236 |
150 | 155 | 220.5 |
145 | 50 | 159 |
130 | 150 | 230 |
0 | 0 | 52 |
;
max_cita = 30;
T_max = 0.283;
V=800;
ENDDATA
INIT:
d_cita = 0 0 0 0 0 0;
ENDINIT
@for(plane: cita1 - cita0 = d_cita);
@for(link(i,j):
b(i,j) = -2*(x0(i) -x0(j))*@sin ((cita1(i)+cita1(j))*3.14159265/360)
+2*(y0(i) -y0(j))*@cos ((cita1(i)+cita1(j))*3.14159265/360);
c(i,j) = (x0(i) -x0(j)) ^2 + (y0(i) -y0(j)) ^2 - 64;
);
! 避免碰撞的条件;
! 右端点非负;
@for(link(i,j): [Right]
(2*V*T_max*@sin((cita1(i)-cita1(j))*3.14159265/360))^2
+ b(i,j)*(2*V*T_max*@sin((cita1(i)-cita1(j))*3.14159265/360))
+ c(i,j) > 0);
! 最小点非负;
@for(link(i,j): [Minimum] @if(
-b(i,j)/4/V/@sin((cita1(i)-cita1(j))*3.14159265/360) #gt#0 #and#
-b(i,j)/4/V/@sin((cita1(i)-cita1(j))*3.14159265/360) #lt#T_max ,
b(i,j)^2-4*c(i,j),-1) < 0);
@for(link: @free(b));
!调整角度上下限,单位为角度;
@for(plane: @bnd( - max_cita, d_cita, max_cita));
[obj] MIN = @SUM(plane: (d_cita)^2);
END
程序三十九:
model:
!铁路运输网的运费计算;
SETS:
! NOTES表示节点集合;
NODES /S1,S2,S3,S4,S5,S6,S7,
A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,
B1,B2,B3,B4,B5,B6,B7,B8,B9,B10,B11,B12,B13,B14,B15,B16,B17/;
! 派生集合ROADS表示的是网络中的直接连接的道路(弧),
由于并非所有节点间都有道路直接连接,所以将弧具体列出,这是稀疏集合;
ROADS(NODES, NODES)/
! 要铺设的管道;
A1,A2 A2,A3 A3,A4 A4,A5 A5,A6 A6,A7 A7,A8 A8,A9 A9,A10 A10,A11
A11,A12 A12,A13 A13,A14 A14,A15
! 公路网;
B1,A2 B2,A3 B5,A4 B4,A5 B6,A6 B7,A7 S1,A7 B8,A8 B9,A9,B10,A10,
B11,A11 B13,A12 B15,A13 S6,A14 B16,A14 B17,A15 S7,A15
! 铁路网;
B1,B3 B2,B3 B3,B5 B4,B6 B6,B7 B7,S1 B5,B8 B8,S1 B8,S2 B8,B9
B9,S3 B9,B10 B10,B12 B12,B11 B11,S5 B12,S4 B12,B14 B14,B13
B14,B15 B15,B16 B16,S6 B16,B17 B17,S7
! 距离W0( i, j) 是节点i到j的直接距离(已知);
/: W0;
! 属性W表示基本的权矩阵(直接距离),
D1(i,j)表示节点i到j的最优行驶路线的路长,
C1(i,j)表示节点i到j铁路运输的最小单位运价(万元);
LINK(NODES, NODES): W, D1, C1;
! 属性U表示迭代过程的权矩阵(临时标号);
NNN(Nodes,nodes,nodes):U;
ENDSETS
DATA:
! 针对铁路网计算时,将公路网的距离定为充分大(BIG=20000);
BIG=20000;
W0 = 20000 20000 20000 20000 20000 20000 20000 20000 20000 20000
20000 20000 20000 20000
20000 20000 20000 20000 20000 20000 20000 20000 20000 20000
20000 20000 20000 20000 20000 20000 20000
450 80 1150 306 195 20 1100 202 1200 720
690 520 170 88 462 690 160 70
320 160 70 290 30;
! 输出费用C1到文本文件中,以备后用;
@TEXT(TrainCost.txt)=@writefor(nodes(i): @writefor(nodes(j):
@format(c1(i,j),'5.0f')), @newline(1) );
ENDDATA
CALC:
! 无向网络,根据给定的直接距离具有对称性,得到初始距离矩阵;
@FOR(LINK(i,j)|@IN(ROADS,i,j): W(i,j) = W0(i, j); W(j,i) = W0(i,j); );
@FOR(LINK(i,j)|i#eq#j: W(i,j) = 0 );
! 所有无直接连接的节点间的距离定为充分大;
@FOR(LINK(i,j)|i#ne#j #and# #not#@IN(ROADS,i,j) #and#
#not#@IN(ROADS,j,i): W(i,j) = BIG;W(j,i) = BIG; );
!以下三个循环语句就是最短路计算公式(Floyd-Warshall算法);
! k=1的初值;
@FOR(NNN(i,j,k)|k#eq#1: U(i,j,k) = W(i,j) );
!迭代过程;
@For(nodes(k)|k#lt#@size(nodes): @FOR(LINK(i,j): U(i,j,k+1) =
@if(U(i,j,k) #le# U(i,k,k)+U(k,j,k),
U(i,j,k), U(i,k,k)+U(k,j,k))));
! 最后一次迭代得到D1;
@FOR(NNN(i,j,k)|k#eq#@size(nodes): D1(i,j) =
@if(U(i,j,k) #le# U(i,k,k)+U(k,j,k),
U(i,j,k), U(i,k,k)+U(k,j,k)) );
!以下就是按最短路D1查找相应运费C1的计算公式;
@FOR(LINK|D1#eq#0: C1=0);
@FOR(LINK|D1#gt#0 #and# D1#le#300: C1=20);
@FOR(LINK|D1#gt#300 #and# D1#le#350: C1=23);
@FOR(LINK|D1#gt#350 #and# D1#le#400: C1=26);
@FOR(LINK|D1#gt#400 #and# D1#le#450: C1=29);
@FOR(LINK|D1#gt#450 #and# D1#le#500: C1=32);
@FOR(LINK|D1#gt#500 #and# D1#le#600: C1=37);
@FOR(LINK|D1#gt#600 #and# D1#le#700: C1=44);
@FOR(LINK|D1#gt#700 #and# D1#le#800: C1=50);
@FOR(LINK|D1#gt#800 #and# D1#le#900: C1=55);
@FOR(LINK|D1#gt#900 #and# D1#le#1000: C1=60);
@FOR(LINK|D1#gt#1000: C1 = 60 + 5*@floor(D1/100-10)
+@if(@mod(D1,100)#eq#0,0,5) );
ENDCALC
End
程序四十:
model:
!公路运输网的运费计算;
SETS:
! NOTES表示节点集合;
NODES /S1,S2,S3,S4,S5,S6,S7,
A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,
B1,B2,B3,B4,B5,B6,B7,B8,B9,B10,B11,B12,B13,B14,B15,B16,B17/;
! 派生集合ROADS表示的是网络中的直接连接的道路(弧),
由于并非所有节点间都有道路直接连接,所以将弧具体列出,这是稀疏集合;
ROADS(NODES, NODES)/
! 要铺设的管道;
A1,A2 A2,A3 A3,A4 A4,A5 A5,A6 A6,A7 A7,A8 A8,A9 A9,A10 A10,A11
A11,A12 A12,A13 A13,A14 A14,A15
! 公路网;
B1,A2 B2,A3 B5,A4 B4,A5 B6,A6 B7,A7 S1,A7 B8,A8 B9,A9,B10,A10,
B11,A11 B13,A12 B15,A13 S6,A14 B16,A14 B17,A15 S7,A15
! 铁路网;
B1,B3 B2,B3 B3,B5 B4,B6 B6,B7 B7,S1 B5,B8 B8,S1 B8,S2 B8,B9
B9,S3 B9,B10 B10,B12 B12,B11 B11,S5 B12,S4 B12,B14 B14,B13
B14,B15 B15,B16 B16,S6 B16,B17 B17,S7
! 距离W0( i, j) 是节点i到j的直接距离(已知);
/: W0;
! 属性W表示基本的权矩阵(直接距离),
D2(i,j)表示节点i到j的最优行驶路线的路长,
C2(i,j)表示节点i到j公路运输的最小单位运价(万元);
LINK(NODES, NODES): W, D2, C2;
! 属性U表示迭代过程的权矩阵(临时标号);
NNN(Nodes,nodes,nodes):U;
ENDSETS
DATA:
! 针对公路网计算时,将铁路网的距离定为充分大(BIG=20000);
BIG=20000;
W0 = 104 301 750 606 194 205 201 680 480 300
220 210 420 500
3 2 600 10 5 10 31 12 42 70
10 10 62 110 30 20 20
20000 20000 20000 20000 20000 20000 20000 20000 20000 20000
20000 20000 20000 20000 20000 20000 20000 20000
20000 20000 20000 20000 20000;
! 输出费用C2到文本文件中,以备后用(因为有小数,格式也变化了);
@TEXT(TruckCost.txt)=@writefor(nodes(i): @writefor(nodes(j):
c2(i,j),@newline(1)) );
ENDDATA
CALC:
! 无向网络,根据给定的直接距离具有对称性,得到初始距离矩阵;
@FOR(LINK(i,j)|@IN(ROADS,i,j): W(i,j) = W0(i, j); W(j,i) = W0(i,j); );
@FOR(LINK(i,j)|i#eq#j: W(i,j) = 0 );
! 所有无直接连接的节点间的距离定为充分大;
@FOR(LINK(i,j)|i#ne#j #and# #not#@IN(ROADS,i,j)
#and# #not#@IN(ROADS,j,i): W(i,j) = BIG;W(j,i) = BIG; );
!以下三个循环语句就是最短路计算公式(Floyd-Warshall算法);
! k=1的初值;
@FOR(NNN(i,j,k)|k#eq#1: U(i,j,k) = W(i,j) );
!迭代过程;
@For(nodes(k)|k#lt#@size(nodes): @FOR(LINK(i,j): U(i,j,k+1) =
@if(U(i,j,k) #le# U(i,k,k)+U(k,j,k),
U(i,j,k), U(i,k,k)+U(k,j,k))));
! 最后一次迭代得到D1;
@FOR(NNN(i,j,k)|k#eq#@size(nodes): D2(i,j) =
@if(U(i,j,k) #le# U(i,k,k)+U(k,j,k),
U(i,j,k), U(i,k,k)+U(k,j,k)) );
!以下就是按最短路D2查找相应运费C2的计算公式;
@FOR(LINK: C2=.1*D2);
ENDCALC
End
程序四十一:
model:
!铁路公路混合运输网的运费计算;
SETS:
! NOTES表示节点集合;
NODES /S1,S2,S3,S4,S5,S6,S7,
A1,A2,A3,A4,A5,A6,A7,A8,A9,A10,A11,A12,A13,A14,A15,
B1,B2,B3,B4,B5,B6,B7,B8,B9,B10,B11,B12,B13,B14,B15,B16,B17/;
! 派生集合ROADS表示的是网络中的直接连接的道路(弧),
由于并非所有节点间都有道路直接连接,所以将弧具体列出,这是稀疏集合;
ROADS(NODES, NODES)/
! 要铺设的管道;
A1,A2 A2,A3 A3,A4 A4,A5 A5,A6 A6,A7 A7,A8 A8,A9 A9,A10 A10,A11
A11,A12 A12,A13 A13,A14 A14,A15
! 公路网;
B1,A2 B2,A3 B5,A4 B4,A5 B6,A6 B7,A7 S1,A7 B8,A8 B9,A9,B10,A10,
B11,A11 B13,A12 B15,A13 S6,A14 B16,A14 B17,A15 S7,A15
! 铁路网;
B1,B3 B2,B3 B3,B5 B4,B6 B6,B7 B7,S1 B5,B8 B8,S1 B8,S2 B8,B9
B9,S3 B9,B10 B10,B12 B12,B11 B11,S5 B12,S4 B12,B14 B14,B13
B14,B15 B15,B16 B16,S6 B16,B17 B17,S7 /;
! 属性W表示基本的权矩阵(由C1、C2得到),
C1(i,j)表示节点i到j铁路运输的最小单位运价(万元),
C2(i,j)表示节点i到j公路运输的最小单位运价(万元),
C(i,j)表示节点i到j混合运输的最小单位运价(万元);
LINK(NODES, NODES): W, C1, C2, C;
! 属性U表示迭代过程的权矩阵(临时标号);
NNN(Nodes,nodes,nodes):U;
ENDSETS
DATA:
! 读出前面刚刚计算得到的结果;
C1=@File(TrainCost.txt);
C2=@File(TruckCost.txt);
! 输出费用C到文本文件中,以备后用;
@TEXT(FinalCost.txt)=@writefor(nodes(i)|i#le#7:
@writefor(nodes(j)|j#ge#8 #and# j#le#22:
@format(c(i,j),'6.1f')), @newline(1) );
ENDDATA
CALC:
! 得到初始距离矩阵;
@FOR(LINK: W = @if(C1#le#C2, C1,C2) );
@FOR(LINK(i,j)|i#eq#j: W(i,j) = 0 );
!以下三个循环语句就是最短路计算公式(Floyd-Warshall算法);
! k=1的初值;
@FOR(NNN(i,j,k)|k#eq#1: U(i,j,k) = W(i,j) );
!迭代过程;
@For(nodes(k)|k#lt#@size(nodes): @FOR(LINK(i,j): U(i,j,k+1) =
@if(U(i,j,k) #le# U(i,k,k)+U(k,j,k),
U(i,j,k), U(i,k,k)+U(k,j,k))));
! 最后一次迭代得到D1;
@FOR(NNN(i,j,k)|k#eq#@size(nodes): C(i,j) =
@if(U(i,j,k) #le# U(i,k,k)+U(k,j,k),
U(i,j,k), U(i,k,k)+U(k,j,k)) );
ENDCALC
End
程序四十二:
MODEL:
TITLE 钢管购运计划;
SETS:
SUPPLY/S1..S7/:S,P,f;
NEED/A1..A15/:b,y,z;
LINK(Supply, need): C, X;
ENDSETS
DATA:
S=800 800 1000 2000 2000 2000 3000;
P=160 155 155 160 155 150 160;
b=104, 301, 750, 606, 194, 205, 201, 680, 480, 300, 220, 210, 420, 500,;
c=@text(finalcost.txt);
@TEXT(FinalResult.txt)=@writefor(supply(i):
@writefor(need(j):@format(x(i,j),'5.0f')), @newline(1) );
@TEXT(FinalResult.txt)=@writefor(need:@format(y,'5.0f') );
@TEXT(FinalResult.txt)=@write(@newline(1));
@TEXT(FinalResult.txt)=@writefor(need:@format(z,'5.0f') );
ENDDATA
[obj] MIN=@sum(link(i,j):(c(i,j)+p(i))*x(i,j))
+0.05*@sum(need(j):y(j)^2+y(j)+z(j)^2+z(j));
! 约束;
@for(supply(i): [con1] @sum(need(j):x(i,j)) <= S(i)*f(i) );
@for(supply(i): [con2] @sum(need(j):x(i,j)) >= 500*f(i));
@for(need(j): [con3] @sum(supply(i):x(i,j)) = y(j)+z(j));
@for(need(j)|j#NE#15: [con4] z(j)+y(j+1)=b(j));
y(1)=0; z(15)=0;
@for(supply: @bin(f));
@for(need: @gin(y));
END
程序四十三:
model:
title CUMCM-2003B-01;
sets:
cai / 1..10 /:crate,cnum,cy,ck,flag;
xie / 1 .. 5 /:xsubject,xnum;
link( xie,cai ):distance,lsubject,number,che,b;
endsets
data:
crate=30 28 29 32 31 33 32 31 33 31;
xsubject= 1.2 1.3 1.3 1.9 1.3 ;
distance= 5.26 5.19 4.21 4.00 2.95 2.74 2.46 1.90 0.64 1.27
1.90 0.99 1.90 1.13 1.27 2.25 1.48 2.04 3.09 3.51
5.89 5.61 5.61 4.56 3.51 3.65 2.46 2.46 1.06 0.57
0.64 1.76 1.27 1.83 2.74 2.60 4.21 3.72 5.05 6.10
4.42 3.86 3.72 3.16 2.25 2.81 0.78 1.62 1.27 0.50;
cy = 1.25 1.10 1.35 1.05 1.15 1.35 1.05 1.15 1.35 1.25;
ck = 0.95 1.05 1.00 1.05 1.10 1.25 1.05 1.30 1.35 1.25;
enddata
!目标函数;
min=@sum( cai (i):
@sum ( xie (j):
number (j,i)*154*distance (j,i)));
!卡车每一条路线上最多可以运行的次数;
@for (link (i,j):
b(i,j)=@floor((8*60-(@floor((distance(i,j)/28*60*2+3+5)/5)-1)*5)/(distance(i,j)/28*60*2+3+5)));
!每一条路线上的最大总车次的计算;
@for( link (i,j):
lsubject(i,j)=(@floor((distance(i,j)/28*60*2+3+5)/5))*b(i,j));
!计算各个铲位的总产量;
@for (cai(j):
cnum(j)=@sum(xie(i):number(i,j)));
!计算各个卸点的总产量;
@for (xie(i):
xnum(i)=@sum(cai(j):number(i,j)));
!道路能力约束;
@for (link (i,j):
number(i,j)<=lsubject(i,j));
!电铲能力约束;
@for (cai (j) :
cnum(j) <= flag(j)*8*60/5 );
!电铲数量约束 ---- added by Xie Jinxing, 2003-09-07;
@sum(cai(j): flag(j) ) <=7;
!卸点能力约束;
@for (xie (i):
xnum (i)<=8*20);
!铲位产量约束;
@for (cai (i): number(1,i)+number(2,i)+number(5,i)<=ck(i)*10000/154);
@for (cai (i): number(3,i)+number(4,i)<=cy(i)*10000/154);
!产量任务约束;
@for (xie (i):
xnum (i)>= xsubject (i)*10000/154);
!铁含量约束;
@sum(cai (j):
number(1,j)*(crate(j)-30.5) )<=0;
@sum(cai (j):
number(2,j)*(crate(j)-30.5) )<=0;
@sum(cai (j):
number(5,j)*(crate(j)-30.5) )<=0;
@sum(cai (j):
number(1,j)*(crate(j)-28.5) )>=0;
@sum(cai (j):
number(2,j)*(crate(j)-28.5) )>=0;
@sum(cai (j):
number(5,j)*(crate(j)-28.5) )>=0;
!关于车辆的具体分配;
@for (link (i,j):
che (i,j)=number (i,j)/b(i,j));
!各个路线所需卡车数简单加和;
hehe=@sum (link (i,j): che (i,j));
!整数约束;
@for (link (i,j): @gin(number (i,j)));
@for (cai (j): @bin(flag (j)));
!车辆能力约束;
hehe<=20;
ccnum=@sum(cai (j): cnum(j) );
end
程序四十四“:
model:
title CUMCM-2000D-a;
sets:
pp/p1..p7/; !也表示R1~R7;
qq/q1..q7/; !也表示S1~S7;
point/1..4/;
wave(pp,qq): a;
cross(pp,qq,pp,qq)|&3 #LT# @size(pp) #and# &4 #LT# @size(qq): dy, b, c;
CXP(cross,point): y;
endsets
Data:
! BIG是正常情况下不可能出现的交点坐标,这里只作为标记;
BIG=300;
@ole('F:\lindo\lindo书\ch12\exam1204.xls','bb','cc') = b c;
Enddata
calc:
! 计算波线PiQj的长度;
@for(wave(i,j):
a(i,j) = @sqrt(@sqr(240)+@sqr(40*j-40*i)) );
! 当i=j时,计算波线PiQj与小方块单元(k,l)的交线在y坐标上的投影长度;
@for(cross(i,j,k,l)|i #EQ #j #AND# i#EQ#1:
dy(i,j,k,l) = @if(k #EQ# i,40,BIG);
);
@for(cross(i,j,k,l)|i #EQ #j #AND# i#EQ#@size(pp):
dy(i,j,k,l) = @if(k #EQ# i-1,40,BIG);
);
@for(cross(i,j,k,l)|i #EQ #j #AND# i#NE#1 #AND# i#NE#@size(pp):
dy(i,j,k,l) = @if(k #EQ# i-1 #OR# k #EQ# i,20,BIG);
);
! 当i,j不相等时,计算波线PiQj与小方块单元(k,l)的交点的y坐标;
@for(cross(i,j,k,l)|i #NE# j:
@for(point(n)|n #EQ# 1:
y(i,j,k,l,n) = @if(l-1 #LE# 6*(k-i)/(j-i) #AND# l #GE# 6*(k-i)/(j-i),
240*(k-i)/(j-i),BIG);
);
@for(point(n)|n #EQ# 2:
y(i,j,k,l,n) = @if(l-1 #LE# 6*(k+1-i)/(j-i) #AND# l #GE# 6*(k+1-i)/(j-i),
240*(k+1-i)/(j-i),BIG);
);
@for(point(n)|n #EQ# 3:
y(i,j,k,l,n) = @if(0 #LE# 6*(i-k)-(i-j)*(l-1) #AND# 6 #GE# 6*(i-k)-(i-j)*(l-1),
40*(l-1),BIG);
);
@for(point(n)|n #EQ# 4:
y(i,j,k,l,n) = @if(0 #LE# 6*(i-k)-(i-j)*l #AND# 6 #GE# 6*(i-k)-(i-j)*l,
40*l,BIG);
);
);
! 当i,j不相等时,计算波线PiQj与小方块单元(k,l)的交线在y坐标上的投影长度;
@for(cross(i,j,k,l)|i #NE# j:
dy(i,j,k,l) = @max(point(n): @if(y(i,j,k,l,n) #LT# BIG, y(i,j,k,l,n),0))
- @min(point(n): y(i,j,k,l,n))
);
!计算波线PiQj与小方块单元(k,l)的交线长度;
@for(cross(i,j,k,l):
b(i,j,k,l) = @if(@abs(dy(i,j,k,l)) #LT# BIG,
a(i,j) * dy(i,j,k,l) / 240, 0) );
@for(cross(i,j,k,l):
c(i,j,k,l) = b(j,i,l,7-k) );
endcalc
@for(cross: @free(dy));
End
程序四十六:
model:
title CUMCM-2000D-b;
sets:
pp/p1..p7/; !也表示R1~R7;
qq/q1..q7/; !也表示S1~S7;
wave(pp,qq): a,t1,t2;
cell(pp,qq)|&1 #LT# @size(pp) #and# &2 #LT# @size(qq): x;
cross(wave,cell): b, c;
endsets
Data:
t1=
0.0611 | 0.0895 | 0.1996 | 0.2032 | 0.4181 | 0.4923 | 0.5646 |
0.0989 | 0.0592 | 0.4413 | 0.4318 | 0.4770 | 0.5242 | 0.3805 |
0.3052 | 0.4131 | 0.0598 | 0.4153 | 0.4156 | 0.3563 | 0.1919 |
0.3221 | 0.4453 | 0.4040 | 0.0738 | 0.1789 | 0.0740 | 0.2122 |
0.3490 | 0.4529 | 0.2263 | 0.1917 | 0.0839 | 0.1768 | 0.1810 |
0.3807 | 0.3177 | 0.2364 | 0.3064 | 0.2217 | 0.0939 | 0.1031 |
0.4311 | 0.3397 | 0.3566 | 0.1954 | 0.0760 | 0.0688 | 0.1042 |
;
t2=
0.0645 | 0.0602 | 0.0813 | 0.3516 | 0.3867 | 0.4314 | 0.5721 |
0.0753 | 0.0700 | 0.2852 | 0.4341 | 0.3491 | 0.4800 | 0.4980 |
0.3456 | 0.3205 | 0.0974 | 0.4093 | 0.4240 | 0.4540 | 0.3112 |
0.3655 | 0.3289 | 0.4247 | 0.1007 | 0.3249 | 0.2134 | 0.1017 |
0.3165 | 0.2409 | 0.3214 | 0.3256 | 0.0904 | 0.1874 | 0.2130 |
0.2749 | 0.3891 | 0.5895 | 0.3016 | 0.2058 | 0.0841 | 0.0706 |
0.4434 | 0.4919 | 0.3904 | 0.0786 | 0.0709 | 0.0914 | 0.0583 |
;
v1=2880;
v2=320;
b c=@ole('exam1204.xls','bb','cc');
Enddata
! 计算波线PiQj的长度,也等于波线RiSj的长度;
@for(wave(i,j):
a(i,j) = (240^2+(40*j-40*i)^2) ^0.5 );
!计算误差的平方和;
min=@sum(wave(i,j):
(t1(i,j) - (a(i,j)-@sum(cell(k,l): b(i,j,k,l)*x(k,l)))/v1
- @sum(cell(k,l): b(i,j,k,l)*x(k,l))/v2 )^2
+ (t2(i,j) - (a(i,j)-@sum(cell(k,l): c(i,j,k,l)*x(k,l)))/v1
- @sum(cell(k,l): c(i,j,k,l)*x(k,l))/v2 )^2
);
!@for(cell(i,j)|i#EQ#1: x(i,j)=0);
@for(cell: @bin(x));
End
程序四十七:
model:
!7个工人,7个工作的分配问题;
sets:
workers/w1..w7/;
jobs/j1..j7/;
links(workers,jobs): cost,volume;
endsets
!目标函数;
min=@sum(links: cost*volume);
!每个工人只能有一份工作;
@for(workers(I):
@sum(jobs(J): volume(I,J))=1;
);
!每份工作只能有一个工人;
@for(jobs(J):
@sum(workers(I): volume(I,J))=1;
);
data:
cost= 6 2 6 7 4 2 5
4 9 5 3 8 5 8
5 2 1 9 7 4 3
7 6 7 3 9 2 7
2 3 9 5 7 2 6
5 5 2 2 8 11 4
9 2 3 12 4 5 10;
enddata
end
程序四十八:
model:
title CUMCM-2003B-01;
sets:
cai / 1..10 /:crate,cnum,cy,ck,flag;
xie / 1 .. 5 /:xsubject,xnum;
link( xie,cai ):distance,lsubject,number,che,b;
endsets
data:
crate=30 28 29 32 31 33 32 31 33 31;
xsubject= 1.2 1.3 1.3 1.9 1.3 ;
distance= 5.26 5.19 4.21 4.00 2.95 2.74 2.46 1.90 0.64 1.27
1.90 0.99 1.90 1.13 1.27 2.25 1.48 2.04 3.09 3.51
5.89 5.61 5.61 4.56 3.51 3.65 2.46 2.46 1.06 0.57
0.64 1.76 1.27 1.83 2.74 2.60 4.21 3.72 5.05 6.10
4.42 3.86 3.72 3.16 2.25 2.81 0.78 1.62 1.27 0.50;
cy = 1.25 1.10 1.35 1.05 1.15 1.35 1.05 1.15 1.35 1.25;
ck = 0.95 1.05 1.00 1.05 1.10 1.25 1.05 1.30 1.35 1.25;
enddata
!目标函数;
min=@sum( cai (i):
@sum ( xie (j):
number (j,i)*154*distance (j,i)));
!max =@sum(link(i,j):number(i,j));
!max=xnum (3)+xnum (4)+xnum (1)+xnum (2)+xnum(5);
!min=@sum( cai (i):
! @sum ( xie (j):
! number (j,i)*154*distance (j,i)));
!xnum (1)+xnum (2)+xnum(5)=340;
!xnum (1)+xnum (2)+xnum(5)=341;
!xnum (3)=160;
!xnum (4)=160;
!卡车每一条路线上最多可以运行的次数;
@for (link (i,j):
b(i,j)=@floor((8*60-(@floor((distance(i,j)/28*60*2+3+5)/5)-1)*5)/(distance(i,j)/28*60*2+3+5)));
!b(i,j)=@floor(8*60/(distance(i,j)/28*60*2+3+5)));
!t(i,j)=@floor((distance(i,j)/28*60*2+3+5)/5);
!b(i,j)=@floor((8*60-(@floor((distance(i,j)/28*60*2+3+5)/5))*5)/(distance(i,j)/28*60*2+3+5)));
!每一条路线上的最大总车次的计算;
@for( link (i,j):
lsubject(i,j)=(@floor((distance(i,j)/28*60*2+3+5)/5))*b(i,j));
!计算各个铲位的总产量;
@for (cai(j):
cnum(j)=@sum(xie(i):number(i,j)));
!计算各个卸点的总产量;
@for (xie(i):
xnum(i)=@sum(cai(j):number(i,j)));
!道路能力约束;
@for (link (i,j):
number(i,j)<=lsubject(i,j));
!电铲能力约束;
@for (cai (j) :
cnum(j) <= flag(j)*8*60/5 );
!电铲数量约束 ---- added by Xie Jinxing, 2003-09-07;
@sum(cai(j): flag(j) ) <=7;
!卸点能力约束;
@for (xie (i):
xnum (i)<=8*20);
!铲位产量约束;
@for (cai (i): number(1,i)+number(2,i)+number(5,i)<=ck(i)*10000/154);
@for (cai (i): number(3,i)+number(4,i)<=cy(i)*10000/154);
!产量任务约束;
@for (xie (i):
xnum (i)>= xsubject (i)*10000/154);
!铁含量约束;
@sum(cai (j):
number(1,j)*(crate(j)-30.5) )<=0;
@sum(cai (j):
number(2,j)*(crate(j)-30.5) )<=0;
@sum(cai (j):
number(5,j)*(crate(j)-30.5) )<=0;
@sum(cai (j):
number(1,j)*(crate(j)-28.5) )>=0;
@sum(cai (j):
number(2,j)*(crate(j)-28.5) )>=0;
@sum(cai (j):
number(5,j)*(crate(j)-28.5) )>=0;
!关于车辆的具体分配;
@for (link (i,j):
che (i,j)=number (i,j)/b(i,j));
!各个路线所需卡车数简单加和;
hehe=@sum (link (i,j): che (i,j));
!整数约束;
@for (link (i,j): @gin(number (i,j)));
@for (cai (j): @bin(flag (j)));
!车辆能力约束;
hehe<=20;
ccnum=@sum(cai (j): cnum(j) );
end
程序四十八:
!最短路问题;
model:
data:
n=10;
enddata
sets:
cities/1..n/: F; !10个城市;
roads(cities,cities)/
1,2 1,3
2,4 2,5 2,6
3,4 3,5 3,6
4,7 4,8
5,7 5,8 5,9
6,8 6,9
7,10
8,10
9,10
/: D, P;
endsets
data:
D=
6 5
3 6 9
7 5 11
9 1
8 7 5
4 10
5
7
9;
enddata
F(n)=0;
@for(cities(i) | i #lt# n:
F(i)=@min(roads(i,j): D(i,j)+F(j));
);
!显然,如果P(i,j)=1,则点i到点n的最短路径的第一步是i --> j,否则就不是。
由此,我们就可方便的确定出最短路径;
@for(roads(i,j):
P(i,j)=@if(F(i) #eq# D(i,j)+F(j),1,0)
);
End
程序四十九:
!旅行售货员问题;
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;
);
!保证不出现子圈;
@for(city(I)|I #gt# 1:
@for( city( J)| J#gt#1 #and# I #ne# J:
u(I)-u(J)+n*x(I,J)<=n-1);
);
!限制u的范围以加速模型的求解,保证所加限制并不排除掉TSP问题的最优解;
@for(city(I) | I #gt# 1: u(I)<=n-2 );
!定义X为0\1变量;
@for( link: @bin( x));
End
Powered by Discuz! X2.5 © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 ) 论坛法律顾问:王兆丰
GMT+8, 2025-3-23 11:36 , Processed in 0.212092 second(s), 29 queries .