注册地址 登录
数学建模社区-数学中国 返回首页

梦@di?~的个人空间 http://www.madio.net/?1219759 [收藏] [复制] [分享] [RSS]

日志

线性规划——LINGO程序集

热度 1已有 291 次阅读2014-8-18 16:43 |个人分类:lingo

线性规划——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) 是节点ij的直接距离(已知);   

   /: W0;             

属性W表示基本的权矩阵(直接距离),

 D1(i,j)表示节点ij的最优行驶路线的路长,

  C1(i,j)表示节点ij铁路运输的最小单位运价(万元);

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) 是节点ij的直接距离(已知);   

   /: W0;             

属性W表示基本的权矩阵(直接距离),

 D2(i,j)表示节点ij的最优行驶路线的路长,

  C2(i,j)表示节点ij公路运输的最小单位运价(万元);

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表示基本的权矩阵(由C1C2得到),

  C1(i,j)表示节点ij铁路运输的最小单位运价(万元),

  C2(i,j)表示节点ij公路运输的最小单位运价(万元),

  C(i,j)表示节点ij混合运输的最小单位运价(万元);

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与小方块单元(kl)的交线在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);

    );

ij不相等时,计算波线PiQj与小方块单元(kl)的交点的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);

    );

);

ij不相等时,计算波线PiQj与小方块单元(kl)的交线在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与小方块单元(kl)的交线长度;

@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 );

  !定义X0\1变量;

  @for( link: @bin( x));

End

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


路过

雷人

握手

鲜花

鸡蛋

发表评论 评论 (1 个评论)

回复 dsk1209 2014-9-16 18:28
写的很好,学习中,经过这段时间的学习,的确感受的到了数学建模的魅力,希望国人能够跳出应试,取得更加有创意的成果!一起努力

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2024-5-10 08:51 , Processed in 0.283599 second(s), 29 queries .

回顶部