Lindo Systems

MODEL:
!  TELEHUB3;
!  Find number of direct T1 and T3 lines between each node pair,
   and number of lines via the single hub(node 1).  A path via
   hub can have a mix of T1 and T3 lines;
! Keywords: telecommunications, network design, routing, hub network;
 SETS:
!  We assume node 1 is the hub;
  NODE/ HUB E1 E2 E3 E4 E5 /:;

  LINK( NODE, NODE) | &2 #GT# &1 :  DEMAND, VC1, FC1, 
                               VC3, FC3, T1, T3, USET1D, USET3D, USEH;
ENDSETS

DATA:
! Capacity of T1 and T3 lines;
   CAP1 = 10;  CAP3 = 100;

! Call volume by node pair;
!       E1   E2   E3   E4   E5;
DEMAND = 0    1    0    3    0 !HUB;
              5    4    1  215 !E1;
                   4    6  125 !E2;
                      558  171 !E3;
                           895;!E4;
! Fixed cost of a T1 line;
FC1 =   18   19   18   15   19
             32   32   22   17
                  34   28   18
                       31   17
                            18;
! Variable cost of a T1 line;
VC1 = 2.55 2.25 2.45 2.05 4.50
           3.00 2.85 3.45 2.65
                3.00 2.50 1.75
                     2.40 1.60
                          1.90;

FC3 =   55   55   55   55  120
             70   70   70   85
                  70   70   85
                       70   85
                            85;
VC3 = 2.20 1.80 2.20 1.40 3.50
           2.10 1.40 2.45 2.05
                2.80 1.75 1.70
                     1.75 0.90
                          1.80;
ENDDATA
! Min sum of fixed + variable costs;
MIN = @SUM( LINK(I,J):
       T1(I,J) * FC1(I,J)  +  USET1D(I,J) * VC1(I,J)
     + T3(I,J) * FC3(I,J)  +  USET3D(I,J) * VC3(I,J) );

@FOR(LINK(I,J): 
! Capacity on a link >= amount used on link;
  T1(I,J) * CAP1 >= USET1D(I,J);
  T3(I,J) * CAP3 >= USET3D(I,J);

!  We must carry the demand either direct or via the hub;
   DEMAND( I, J) <= USET1D( I, J) + USET3D( I, J) + USEH( I, J);

! Number of lines must be general integers;
 @GIN( T1(I,J) );  @GIN( T3(I,J) );
   );

! Anything not carried direct, must go via the hub;
@FOR( NODE( I)| I #GT# 1:
   USET1D(1,I) + USET3D( 1, I) = DEMAND(1,I) 
            + @SUM( LINK( S, T) | S #EQ# I #OR# T #EQ# I: USEH( S, T));
    );  
END