param n;
param m;
param scen;

param p {i in 1..n, j in 1..m} := floor( Uniform(1,100) );

param P = max( max {v in 1..m} ( sum {k in 1..n} ( p[k,v] ) +
                                 min {k in 1..n} ( sum {q in 1..v-1} p[k,q] ) + 
                                 min {k in 1..n} ( sum {q in v+1..m} p[k,q] ) ),
               max {k in 1..n} ( sum {v in 1..m} p[k,v] ) );

param TF {i in 1..4} := if ( i=1 or i=2 ) then 0.2 else 0.4;
param DR {i in 1..4} := if ( i=1 or i=3 ) then 0.6 else 1.2;

param dmin := P * ( 1 - TF[scen] - DR[scen] / 2 );
param dmax := P * ( 1 - TF[scen] + DR[scen] / 2 );

param d {i in 1..n} := floor( dmin + Uniform01() * ( dmax + 1 - dmin ) );

var x {i in 1..n, j in 1..n} binary;
var E {j in 1..n} >= 0;
var T {j in 1..n} >= 0;
var W {j in 1..n,   k in 1..m-1} >= 0;
var I {j in 1..n-1, k in 1..m  } >= 0;
var C {j in 1..n,   k in m..m  };

minimize Obj:
    sum {j in 1..n} ( E[j] + T[j] );

subject to 

R1 {j in 1..n}:
    T[j] >=   C[j,m] - sum {i in 1..n} ( x[i,j] * d[i] );

R2 {j in 1..n}:
    E[j] >= - C[j,m] + sum {i in 1..n} ( x[i,j] * d[i] );

R3 {j in 1..n}:
    sum {i in  1..n} x[i,j] = 1;

R4 {i in 1..n}:
    sum {j in  1..n} x[i,j] = 1;

R5 {j in 1..n-1, k in 1..m-1}:
    I[j,k] + sum {i in 1..n} ( x[i,j+1] * p[i,k]   ) + W[j+1,k] =
    W[j,k] + sum {i in 1..n} ( x[i,j]   * p[i,k+1] ) + I[j,k+1];

R6:
    C[1,m] = sum {k in 1..m, i in 1..n} ( x[i,1] * p[i,k] ) +
             sum {k in 2..m} W[1,k-1];

R7 {j in 2..n}:
    C[j,m] = C[j-1,m] + I[j-1,m] + sum {i in 1..n} ( x[i,j] * p[i,m] );

