Parcourir la source

Add exponential utility

mkilani il y a 3 ans
Parent
commit
c2c9422b68

+ 25 - 0
continuous/ampl/exp/bath_exp.dat

@@ -0,0 +1,25 @@
+
+# MODEL PARAMETERS
+param P    := 70.0  ;
+param K    := 10.0  ;
+param vf   := 15.0  ;
+param TMAX :=  6.0  ;
+param L    :=  4.0  ;
+param eps  :=  0.001;
+
+# Rush-hour period
+param M0   := -25.55  ;
+param Mbar := 43.57  ;
+
+# EXPONENTIAL UTILITY FUNCTION
+# --> LOG
+param A0 :=  5.0;
+param a1 :=  0.3333;
+param B0 := 10.0;
+param b1 :=  0.5;
+
+# SIZE OF THE APPROXIMATION GRID
+# NUMBER OF POINTS WITHIN AN INTERVAL
+# OF LENGTH L : q0 
+param q0 := 20;  
+

+ 66 - 0
continuous/ampl/exp/bath_exp.mod

@@ -0,0 +1,66 @@
+
+# MODEL PARAMETERS
+param P    ;
+param K    ;
+param vf   ;
+param M0   ;
+param Mbar ;
+param TMAX ;
+param L    ;
+param T0   := M0 / vf ; 
+
+param n ;
+param q ;
+
+# APPROXIMATION GRID
+param B {i in 1..n+q};
+param q0 ;
+# EXPONENTIAL UTILITY FUNCTION
+param A0 ;
+param a1 ;
+param B0 ;
+param b1 ;
+
+# A SMALL VALUE
+param eps  ;
+
+
+# GENERATE INITIAL SOLUTION WITH UNIFORM ENTRIES
+var e {i in 1..n} >= 0.0 ; 
+
+var k  { i in 1..n+q-1 }  # traffic density
+       = sum {j in max(1,i-q+1)..min(i,n)} e[j];
+       
+var v  { i in 1..n+q-1 } # traffic speed
+       = vf * (1 - P * k[i] / K );
+
+var Dt { i in 1..n+q-1 } # travel time from B[i] to B[i+1]
+       = ( B[i+1] - B[i] ) / v[i];
+
+var t  { i in 1..n+q } = # clock time at B[i]
+       if i = 1 then T0
+       else t[i-1] + Dt[i-1] ;
+
+
+# EXPONENTIAL UTILITY FUNCTION
+var ue_exp {i in 1..n}
+       =  (A0/a1) * ( 1 - exp (-a1 * t[i] ) );
+
+var ux_exp {i in 1..n}
+       =  (B0/b1) * ( 1 -exp (- b1 * ( TMAX - t[i+q] ) ) );
+
+maximize util_exp: sum{i in 1..n} ( ue_exp[i] + ux_exp[i] )  * e[i] * P ;
+
+
+# MINIMIZE THE SHORTEST END TIME OF THE RUSH HOUR
+minimize last_arrival_time: t[n+q] ; 
+
+
+# CONSTRAINTS OF THE PROBLEM 
+  # 1. All agents enter the bathtub
+subject to entry : sum{i in 1..n}  e[i] == 1.0 ;
+
+  # 2. Jam capacity should not be reached
+subject to capacity { i in q .. n } : k[i] <= K / P - eps ;
+
+

+ 70 - 0
continuous/ampl/exp/bath_exp.run

@@ -0,0 +1,70 @@
+# CLEAR MEMORY
+reset ;
+
+
+# set search path
+option ampl_include '/home/moez/Downloads/amplide.linux64/amplide/';
+
+# LOAD MODEL
+model '/home/moez/docs/progs/ampl/bathtub/cont/exp/bath_exp.mod' ;
+#model bath.mod ;
+
+# LOAD DATA
+data  '/home/moez/docs/progs/ampl/bathtub/cont/exp/bath_exp.dat' ; 
+#data  bath.dat ;
+
+# Approximation grid
+ 
+let q  := q0 + 1;
+param dL := L / q0  ;
+param nL := ( Mbar - M0 ) div  L  ;
+param q1 := 1+( ( Mbar - nL * L - M0 ) div dL );
+# param n  := q1 * ( nL + 1 ) + (q0-q1+2)*nL ;
+let n := q * nL + q1 + 1 ;
+param M1 := Mbar - nL * L ; 
+
+for { i in 1..q1  } { 
+  for { j in 0 .. nL+1 } {
+     let B[i+j*q] := M0 + (i-1) * dL + j * L;
+     }
+  }
+
+for {j in 0 .. nL+1 } {  
+   let B[q1+1+j*q] := M1 + j * L ;
+   }
+
+for { i in q1+2..q } {
+  for { j in 0 .. nL } {
+     let B[i + j * q] := B[q1] + dL * (i - (q1+1)) + j * L;
+     }
+  }
+
+
+display t[n+q] , util_exp;
+
+
+
+option solver '/home/moez/ulco/ampl/conopt' ;
+
+option conopt_options 'outlev=3';
+option display_width 100 ;
+
+
+objective last_arrival_time;
+
+solve;
+
+# The exponential utility
+objective util_exp ; 
+
+solve ;
+
+var tt {i in 1..n} = t[i+q] ;
+
+option display_width 120 ;
+display t[1], t[n], t[n+q] , util_exp, util_exp / P,P;
+#display  B, e, k, v, ue_exp, ux_exp, t, tt ; 
+
+display  B, e, k, v, ue_exp, ux_exp, t,tt > '/home/moez/docs/progs/ampl/bathtub/cont/exp/exp2.out' ;
+
+end;

+ 10 - 0
continuous/ampl/exp/util.dat

@@ -0,0 +1,10 @@
+10  23.9748
+12  23.8388
+14  23.6879
+18  23.3351
+22  22.907
+26  22.3952
+30  21.7916
+34  21.0875
+38  20.2734
+42  19.3397