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

param M := 100 * sum{i in 1..n, k in 1..m} p[i,k];

var z {i in 1..n-1, j in i+1..n} binary;
var E {j in 1..n} >= 0;
var T {j in 1..n} >= 0;
var C {j in 1..n, k in 1..m};
var q {i in 1..n-1, j in i+1..n, k in 1..m} >= 0, <= M - p[i,k] - p[j,k];

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

subject to 

R1 {i in 1..n}:
    T[i] >= C[i,m] - d[i];

R2 {i in 1..n}:
    E[i] >= d[i] - C[i,m];

R3 {i in 1..n}:
    C[i,1] >= p[i,1];

R4 {i in 1..n, k in 2..m}:
    C[i,k] >= p[i,k] + C[i,k-1];

R5 {i in 1..n-1, j in i+1..n, k in 1..m}:
    q[i,j,k] = C[i,k] - C[j,k] + M * z[i,j] - p[i,k]; 
