$eolCom // *= DATA ============================================================================================================================== *== Declarations and definitions of model SETS $log %gams.i% $setnames "%gams.i%" filepath $log %filepath% $SetGlobal path %filepath% *=== Set formulations for model realization SETS i Set of all nodes origins(i) Origin nodes destinations(i) Destination nodes h(i) Transport nodes terminal(h) Terminal nodes dummy(h) Terminal-dummy nodes td(terminal,dummy) Terminal-dummy pairs terminal_TS(terminal) Terminal nodes for carrier transshipment dummy_TS(dummy) Terminal nodes for carrier transshipment td_TS(terminal_TS,dummy_TS) Terminal-dummy pairs for carrier transshipment h_TR(h) Transport nodes excluding dummy_TS nodes ALIAS(i,j); SET k Set of decision criteria; SINGLETON SET ksub(k) Singleton Set for optimization of individual objective functions; SET s Set of carriers ALIAS(s,s_ges); SET m Set of modes m_proportion(m) Set of modes without "Terminal" ALIAS(m,m_ges); SET p Set of products *=== Declaration of subsets for model run time enhancement p_o(p,origins) Product to origin assignment p_d(p,destinations) Product to destination assignment p_s(p,s) Product to carrier assignment p_s_o(p,s,origins) Product to origin to carrier assignment; *=== Set of flow restriction for model run time enhancement SET f_c_r(s,m,i,j) Set of flow-by-carrier-restrictions for variable limitations; SET t(s,i) Set of carrier-dummy_TS combinations; *== Declarations and definitions of model Scalars SCALAR num_gridpoints Number of grid points which are visited when calculating the Pareto front penalty penalty for unsatisfied demand / 1000 / bf demand factor / 1 /; *== Declarations and definitions of model PARAMETERS *=== Parameter formulations for model realization PARAMETERS A(p,origins) Supply provided of products by origins Transport_max(s) Maximum theoretical number of transports for carrier s that can exist on one edge B(p,destinations) Demand requested of products by destinations w(p,k) Product dependent weighting of decision criteria l(s) Payload of carrier s U(i,j) Terminal capacity for number of transports processed at terminal f_inv(p) Cost factor for product specific inventory holding costs CB(s) Carrier blockage CC(s,m,i,j) Carrier capacity as # of transports per carrier s between locations i and j with mode m LC(s,m,i,j) Load capacity of payload transported in tonnes per carriers between locations i and j with mode m mF(s,m,i,j) Minimal # of transports with carrier s between locations i to j with mode m cp Carrier proportion - Ratio of carrier transports share on routes BigM BigM /99999999/ SmallM SmallM /0.0000001/ time_limit Time Limit for Execution AUGMECON2 in seconds *=== Criterion constraints by subnetwork TT(p) in kilometers per hour TC(p) in € per transported ton CO2e(p) in kgCO2e per transported ton *=== Evaluation of edges according to decision criteria k f_TR(s,m,i,j,k) Edge weighting for transportation f_TS(s,k) Edge weighting for transshipment *=== Distance matrix d_road(i,j) Distances between nodes - Mode "Road" d_rail(i,j) Distances between nodes - Mode "Rail" d_sea(i,j) Distances between nodes - Mode "Sea" d_air(i,j) Distances between nodes - Mode "Air" d_terminal(i,j) Distances between nodes - Mode "Terminal" d(m,i,j) Complete distance matrix with all modes; *== Data determination via GDX with MS Excel ----------------------------------------------------------------------------------------- $GDXin %path%INPUT.gdx $LOAD i origins destinations h terminal dummy td terminal_TS dummy_TS td_TS h_TR p k m s p_o p_d p_s p_s_o A B w l U f_INV CB CC LC mF TT TC CO2e f_c_r d_road d_rail d_sea d_air d_terminal f_TR f_TS cp time_limit $GDXin $GDXin %path%INPUT_scalar.gdx $LOAD num_gridpoints $GDXin *------------------------------------------------------------------------------------------------------------------------------------- PARAMETER dir(k) direction of the objective functions 1 for max and -1 for min' / "Time" -1, "Cost" -1, "CO2e" -1 /; *== Calculation of complete Distance matrix with all modes d('Road',i,j) = d_road(i,j); d('Rail',i,j) = d_rail(i,j); d('Sea',i,j) = d_sea(i,j); d('Air',i,j) = d_air(i,j); d('Terminal',i,j) = d_terminal(i,j); *== Calculation of Maximum theoretical number of transports for carrier s that can exist on one edge Transport_max(s) = CEIL(SUM((p,destinations),B(p,destinations))/l(s)); TABLE term(k,*) Required artificial coefficients to define the objective function for Time Cost CO2e in an expression general f_inv Time 1 0 Cost 1 1 CO2e 1 0 ; *== Calculation of Subset t(s,i) for the equation CarrierChange loop(m, loop(j, t(s,dummy_TS)$(f_c_r(s,m,dummy_TS,j))=yes; t(s,dummy_TS)$(f_c_r(s,m,j,dummy_TS))=yes); ); *== Calculation of Subset m_proportion for the equation CarrierProportion m_proportion("Road")=yes; m_proportion("Rail")=yes; m_proportion("Sea")=yes; m_proportion("Air")=yes; DISPLAY i,t,m_proportion,origins,destinations,h,terminal,dummy,td,terminal_TS,dummy_TS,td_TS,h_TR,p,k,m,s,p_o,p_d,p_s,p_s_o,A,B,w,l,U,f_INV,CB,CC,LC,mF,TT,TC,CO2e,f_c_r,d,f_TR,f_TS,cp,Transport_max,term; *= MODEL ============================================================================================================================== *== Declarations and assignment of model variables Positive VARIABLE Z(k) Objective function variables (Time Cost CO2e) oneObjFunction Objective function value of an objective function dimension ud(p,destinations) unsatisfied demand (recourse variable); *=== Transport variable INTEGER VARIABLE x_TR(p,s,m,i,j) Number of transports of p with mode m from i to j with s; x_TR.up(p,s,m,i,j) = Transport_max(s) $(f_c_r(s,m,i,j) AND p_s(p,s)); *=== Carrier transshipment variable INTEGER VARIABLE x_TS(p,s,j) Number of transports changed of p at j to s; x_TS.up(p,s,dummy_TS) = Transport_max(s) $(p_s(p,s) AND t(s,dummy_TS)); *=== Additional model variables INTEGER VARIABLE v_TS(p,s,j) Required artificial variable for carrier change modelling; v_TS.up(p,s,dummy_TS) = Transport_max(s) $(p_s(p,s) AND t(s,dummy_TS)); BINARY VARIABLE y(p,s,m,i,j) Binary variable for minimal flow restriction; y.up(p,s,m,i,j) = 1 $(f_c_r(s,m,i,j) AND p_s(p,s)); *== Declarations and definitions of model equations *=== Declarations of model equations EQUATIONS ObjFunction(k) Objective functions (Time Cost CO2e) TransferFlow(p,s,h_TR) Transfer flow at nodes TerminalFlow(p,s,terminal,dummy) Terminal flow restriction TransshipmentFlow(p,dummy_TS) Transshipment flow at terminals Supply(p,origins) Supply provision Demand(p,destinations) Demand satisfaction TerminalCapacity(terminal,dummy) Capacity at terminal for number of transports transshiped CarrierChange(p,s,terminal_TS,dummy_TS) Carrier change at terminal PayloadFlow(p,terminal_TS,dummy_TS) Preservation of the payload flow CarrierCapacity(p,s,m,i,j) Carrier capacity on edge between i and j with mode m PayloadCapacity(p,s,m,i,j) Payload capacity in tons of payload processed between locations i and j with mode m BinaryFlowConstraint(p,s,m,i,j) Binary flow realization MinFlow(p,s,m,i,j) Minimal flow restriction of transports of product-carrier combinations between locations i and j with mode m CarrierProportion(p,s) Proportion restriction for carriers not to exceed certain carrier share TransitTimeConstraint(p) Transportation time constraint for each product destination TransportationCostConstraint(p) Transportation cost constraint for each product destination CO2eEmissionsConstraint(p) CO2e emissions constraint for each product destination; *=== Definitions of model equations *==== Standard transshipment model formulations ObjFunction(k).. term(k,"general")*(SUM((p,s,m,i,j)$(p_s(p,s) AND f_c_r(s,m,i,j)),(x_TR(p,s,m,i,j)*f_TR(s,m,i,j,k)*w(p,k)))+SUM((p,s,dummy_TS)$(p_s(p,s)),(x_TS(p,s,dummy_TS)*f_TS(s,k)*w(p,k))))+term(k,"f_inv")*((SUM(p,(SUM((s,m,i,j)$(f_c_r(s,m,i,j)),(x_TR(p,s,m,i,j)*f_TR(s,m,i,j,"Time")*w(p,k)))+SUM((s,dummy_TS),(x_TS(p,s,dummy_TS)*f_TS(s,"Time")*w(p,k))))*f_inv(p)))+ penalty*sum((p,destinations),ud(p,destinations))) =e= Z(k); TransferFlow(p,s,h_TR)$(p_s(p,s)).. SUM((i,m)$(f_c_r(s,m,i,h_TR)),x_TR(p,s,m,i,h_TR)) - SUM((j,m)$(f_c_r(s,m,h_TR,j)),x_TR(p,s,m,h_TR,j)) =e= 0; TerminalFlow(p,s,terminal,dummy)$(p_s(p,s) AND td(terminal,dummy)).. SUM((i,m)$(f_c_r(s,m,i,terminal)),x_TR(p,s,m,i,terminal)) =e= x_TR(p,s,"Terminal",terminal,dummy); TransshipmentFlow(p,dummy_TS).. SUM(s$p_s(p,s),SUM((terminal_TS,m)$(td_TS(terminal_TS,dummy_TS) AND f_c_r(s,m,terminal_TS,dummy_TS)),x_TR(p,s,m,terminal_TS,dummy_TS)*l(s)) - SUM((j,m)$(f_c_r(s,m,dummy_TS,j)),x_TR(p,s,m,dummy_TS,j)*l(s))) =e= 0; Supply(p,origins).. SUM((j,s,m)$(p_s(p,s) AND f_c_r(s,m,origins,j)),x_TR(p,s,m,origins,j)*l(s)) - SUM((i,s,m)$(p_s(p,s) AND f_c_r(s,m,i,origins)),x_TR(p,s,m,i,origins)*l(s)) =l= A(p,origins); Demand(p,destinations)$(p_d(p,destinations)).. SUM((i,s,m)$(p_s(p,s) AND f_c_r(s,m,i,destinations)),x_TR(p,s,m,i,destinations)*l(s)) - SUM((j,s,m)$(p_s(p,s) AND f_c_r(s,m,destinations,j)),x_TR(p,s,m,destinations,j)*l(s)) =g= bf*B(p,destinations)-ud(p,destinations); *==== Additional transshipment model formulations *===== For terminal capacity TerminalCapacity(terminal,dummy)$(td(terminal,dummy)).. SUM((p,s,m)$(p_s(p,s) AND f_c_r(s,m,terminal,dummy)),x_TR(p,s,m,terminal,dummy)) =l= U(terminal,dummy); CarrierChange(p,s,terminal_TS,dummy_TS)$(p_s(p,s) AND t(s,dummy_TS) AND td_TS(terminal_TS,dummy_TS)).. SUM(m,x_TR(p,s,m,terminal_TS,dummy_TS)) - SUM((j,m)$(f_c_r(s,m,dummy_TS,j)),x_TR(p,s,m,dummy_TS,j)) =e= v_TS(p,s,dummy_TS) - x_TS(p,s,dummy_TS); PayloadFlow(p,terminal_TS,dummy_TS).. SUM((s)$(p_s(p,s) AND f_c_r(s,"Terminal",terminal_TS,dummy_TS)), x_TR(p,s,"Terminal",terminal_TS,dummy_TS)*l(s)) - SUM((s,j,m)$(f_c_r(s,m,dummy_TS,j)),x_TR(p,s,m,dummy_TS,j)*l(s)) =l= 0; *===== For carrier capacity restrictions (bundle constraint) CarrierCapacity(p,s,m,i,j)$(p_s(p,s) AND f_c_r(s,m,i,j)).. x_TR(p,s,m,i,j) =l= CC(s,m,i,j)*CB(s); PayloadCapacity(p,s,m,i,j)$(p_s(p,s) AND f_c_r(s,m,i,j)).. y(p,s,m,i,j)*l(s) =l= LC(s,m,i,j); *===== For minimal flow of transports on arcs BinaryFlowConstraint(p,s,m,i,j)$(p_s(p,s) AND f_c_r(s,m,i,j)).. x_TR(p,s,m,i,j) =l= y(p,s,m,i,j)*BigM; MinFlow(p,s,m,i,j)$(p_s(p,s) AND f_c_r(s,m,i,j)).. x_TR(p,s,m,i,j) =g= y(p,s,m,i,j)*mF(s,m,i,j); *===== For carrier proportion restrictions CarrierProportion(p,s)$(p_s(p,s)).. (SUM((m,i,j)$(f_c_r(s,m,i,j) AND m_proportion(m)),x_TR(p,s,m,i,j) * l(s))) =l= cp*(SUM((s_ges,m,i,j)$(f_c_r(s_ges,m,i,j) AND m_proportion(m)),x_TR(p,s_ges,m,i,j) * l(s_ges))); *===== For criteria restrictions TransitTimeConstraint(p).. (SUM((s,m,i,j)$(f_c_r(s,m,i,j) AND p_s(p,s)),(x_TR(p,s,m,i,j)*d(m,i,j)))) =g= TT(p)*(SUM((s,m,i,j)$(f_c_r(s,m,i,j) AND p_s(p,s)),(x_TR(p,s,m,i,j)*f_TR(s,m,i,j,"Time")))+SUM((s,dummy_TS)$(p_s(p,s)),(x_TS(p,s,dummy_TS)*f_TS(s,"Time")))); TransportationCostConstraint(p).. (SUM((s,m,i,j)$(f_c_r(s,m,i,j) AND p_s(p,s)),(x_TR(p,s,m,i,j)*f_TR(s,m,i,j,"Cost")))+SUM((s,dummy_TS)$(p_s(p,s)),(x_TS(p,s,dummy_TS)*f_TS(s,"Cost")))) =l= TC(p)*(SUM((s,m,origins,j)$(f_c_r(s,m,origins,j) AND p_s_o(p,s,origins)),(x_TR(p,s,m,origins,j)*l(s)))); CO2eEmissionsConstraint(p).. (((SUM((s,m,i,j)$(f_c_r(s,m,i,j) AND p_s(p,s)),(x_TR(p,s,m,i,j)*f_TR(s,m,i,j,"CO2e")))+SUM((s,dummy_TS)$(p_s(p,s)),(x_TS(p,s,dummy_TS)*f_TS(s,"CO2e"))))*10)) =l= CO2e(p)*(SUM((s,m,origins,j)$(f_c_r(s,m,origins,j) AND p_s_o(p,s,origins)),(x_TR(p,s,m,origins,j)*l(s)))); *== Model options $Onecho > cplex.opt threads=1 tilim=60 mipdisplay 4 $Offecho * tuning tuningcplex.opt * tuningdettilim 1000 * tuningdisplay 2 //Display of results in number of rows/columns OPTIONS profile = 5, limrow = 100000, limcol = 100000, emp = de; file emp / '%emp.info%' /; put emp '* problem %gams.i%'/; $onput randvar bf discrete 0.1 0.5 0.8 1 0.1 1.5 stage 2 bf ud Demand ObjFunction $offput putclose emp; Set scen scenarios / l,m,h /; Parameter s_bf(scen) demand factor realization by scenario s_u(scen,j) s_x(scen,i,j) shipment per scenario s_s(scen) ; Set dict / scen .scenario.'' bf .randvar .s_bf /; *=== Model name MODEL Transport_AUGMECON_R /all/; Transport_AUGMECON_R.optfile = 1 *= SOLUTION =========================================================================================================================== *== Optimization AUGMECON-R $sTitle eps-constraint Method Set k1(k) the first element of k km1(k) all but the first elements of k kk(k) active objective function in constraint allobj; k1(k)$(ord(k) = 1) = yes; km1(k) = yes; km1(k1) = no; Parameter rhs(k) right hand side of the constrained obj functions in eps-constraint maxobj(k) maximum value from the payoff table minobj(k) minimum value from the payoff table numk(k) ordinal value of k starting with 1 range(k) maxobj-minobj; Scalar iter 'total number of iterations' infeas 'total number of infeasibilities' elapsed_time 'elapsed time for payoff and e-sonstraint' start 'start time' finish 'finish time'; Variables a_objval 'auxiliary variable for the objective function' obj 'auxiliary variable during the construction of the payoff table'; Positive Variables sl(k) slack or surplus variables for the eps-constraints ; Equations con_obj(k) 'constrained objective functions' augm_obj 'augmented objective function to avoid weakly efficient solutions' allobj 'all the objective functions in one expression'; con_obj(km1).. z(km1) - dir(km1)*sl(km1) =e= rhs(km1); * We optimize the first objective function and put the others as constraints * the second term is for avoiding weakly efficient points augm_obj.. sum(k1,dir(k1)*z(k1))+1.0e-3*sum(km1,power(10,-(numk(km1)-1))*sl(km1)/(maxobj(km1)-minobj(km1))) =e= a_objval; allobj.. sum(kk, dir(kk)*z(kk)) =e= obj; Model mod_payoff / Transport_AUGMECON_R, allobj /; mod_payoff.optfile = 1 Model mod_epsmethod / Transport_AUGMECON_R, con_obj, augm_obj /; mod_epsmethod.optfile = 1 Parameter payoff(k,k) 'payoff tables entries'; Alias (k,kp); Parameter Lex_sol(kp,*) Solutions of the objective function values and modelstats for lexicographic optimization Lex_stats(kp,*,*) Model stats Lex_sol_aux(kp,k) Auxiliary variable Lex_X_TR(kp,p,s,m,i,j) Results for x_TR for lexicographic optimization Lex_X_TS(kp,p,s,j) Results for x_TS for lexicographic optimization Lex_TT(kp,p) in kilometers per hour Lex_TC(kp,p) in € per transported ton Lex_CO2e(kp,p) in kgCO2e per transported ton Lex_mode_share(kp,m) share for each mode measured by the number of transports; Scalar iter_lex; option optCr = 0, limRow = 0, limCol = 0, solPrint = off, solveLink = %solveLink.LoadLibrary%; * Generate payoff table applying lexicographic optimization loop(kp, kk(kp) = yes; * repeat Solve mod_payoff using emp maximizing obj scenario dict; payoff(kp,k) = Z.l(k); * z.fx(kk) = z.l(kk); // freeze the value of the last objective optimized Lex_sol(kp,k) = Z.L(k); Lex_stats(kp,kk,"Model Status")=mod_payoff.modelstat; Lex_stats(kp,kk,"Solve Status")=mod_payoff.solvestat; Lex_stats(kp,kk,"Calculation Time")=mod_payoff.resusd; kk(k++1) = kk(k); // cycle through the objective functions * until kk(kp); kk(kp) = no; * release the fixed values of the objective functions for the new iteration z.up(k) = inf; z.lo(k) = -inf; ); *if(mod_payoff.modelStat <> %modelStat.optimal% and * mod_payoff.modelStat <> %modelStat.integer Solution%, * abort 'no optimal solution for mod_payoff';); File fx / OUTPUT_AUGMECON_R.txt /; put fx 'PAYOFF TABLE (Time [h], Cost [€], CO2e [10 kg])'/; iter_lex = 1; loop(kp, If (iter_lex=1, put 'Min Time'); If (iter_lex=2, put 'Min Cost'); If (iter_lex=3, put 'Min CO2e'); loop(k, put payoff(kp,k):12:2;); put /; iter_lex = iter_lex + 1; ); minobj(k) = smin(kp,payoff(kp,k)); maxobj(k) = smax(kp,payoff(kp,k)); range(k)=(maxobj(k)-minobj(k)); * Number of gridpoints for each objective $eval NUM_GRIDPOINTS1 num_gridpoints $eval NUM_GRIDPOINTS2 num_gridpoints $eval NUM_GRIDPOINTS3 num_gridpoints $eval NUM_SOLU (num_gridpoints+1)*(num_gridpoints+1) Sets g 'grid points' / g0*g%NUM_GRIDPOINTS1% / q 'grid points' / q0*q%NUM_GRIDPOINTS2% / r 'grid points' / r0*r%NUM_GRIDPOINTS3% / grid(k,g) 'grid' solu 'Number of possible solutions' / 1*%NUM_SOLU% / pareto_solu(solu); Singleton Set ssolu(solu); Parameter gridrhs(k,g) maxg(k) maximum point in grid for objective posg(k) grid position of objective firstOffMax, lastZero, current1, current2, synthiki, b2, b3, terminal1, terminal2, control1, control2, range1, range2 some counters * numk(k) ordinal value of k starting with 1 numg(g) 'ordinal value of g starting with 0 ' step(k) step of grid points in objective functions jump(k) jumps in the grid points' traversing only for the first objective function numq(q) ordinal value of q starting with zero numr(r) ordinal value of r starting with zero flag(q,r) memory matrix; lastZero = 1; loop(km1, numk(km1) = lastZero; lastZero = lastZero + 1; ); numg(g) = ord(g) - 1; numq(q) = ord(q) - 1; numr(r) = ord(r) - 1; range1=sum(k$(ord(k)=2),range(k)); range2=sum(k$(ord(k)=3),range(k)); loop(q$(numq(q)1 and mod_epsmethod.modelstat<>8, infeas=infeas+1; put fx iter:5:0, ' infeasible'/; lastZero = 0; loop(km1$(posg(km1)>0 and lastZero=0), lastZero=numk(km1)); posg(km1)$(numk(km1)<=lastZero) = maxg(km1); loop(r$(numr(r)>=current2 and numr(r)<=terminal2), loop(q$(numq(q)=current1), flag(q,r)=terminal1-current1+1);); else if(synthiki=0, put fx iter:5:0; loop(k, put fx z.l(k):12:2); put fx ' *** '; loop(km1, put fx sl.l(km1):12:2, put fx posg(km1):6:0); put fx ' *** '; ssolu(solu)$(solu.val = iter) = yes; pareto_solu(ssolu) = yes; Pareto_stats(ssolu,"Model Status")=mod_epsmethod.modelstat; Pareto_stats(ssolu,"Solve Status")=mod_epsmethod.solvestat; Pareto_stats(ssolu,"Calculation Time")=mod_epsmethod.resusd; Pareto_sol(ssolu,"Time") = Z.L("Time"); Pareto_sol(ssolu,"Cost") = Z.L("Cost"); Pareto_sol(ssolu,"CO2e") = Z.L("CO2e"); loop(km1$(numk(km1)=1),b2=floor(sl.l(km1)/step(km1))); loop(km1$(numk(km1)=2),b3=floor(sl.l(km1)/step(km1))); loop(r$(numr(r)>=current2 and numr(r)<=current2+b3), loop(q$(numq(q)=current1) , flag(q,r)=b2+1);); jump(km1)=1; * calculate only for the first constrained objective function jump(km1) put fx ' * '; * loop(km1$(numk(km1)=1), jump(km1)=1+floor(sl.L(km1)/step(km1))); jump(km1)$(numk(km1)=1)=1+floor(sl.L(km1)/step(km1)); loop(km1, put fx jump(km1):5:0) ; loop(km1$(jump(km1)> 1), put ' jump') put /; ); ); jump(km1)$(numk(km1)>1)=1 ; * Proceed forward in the grid control1=0; firstOffMax = 0; loop(km1$(posg(km1)0),control2=posg(km1)+synthiki; posg(km1)=min(posg(km1)+synthiki,maxg(km1)); firstOffMax=numk(km1) ); loop(km1$(posg(km1)=maxg(km1) and numk(km1)=1 and synthiki>0 and firstOffMax>0 and control2>maxg(km1)), control1=1); loop(km1$(posg(km1)1), posg(km1)=min((posg(km1)+jump(km1)),maxg(km1)); firstOffMax=numk(km1)); loop(km1$(posg(km1)0 and numk(km1)>1 ), posg(km1)=min((posg(km1)+jump(km1)),maxg(km1)); firstOffMax=numk(km1); control1=0); posg(km1)$(numk(km1)time_limit); *-- Results provision via GDX to MS Excel -------------------------------------- Lex_sol_aux(kp,k) = Lex_sol(kp,k); Pareto_sol_aux(solu,k) = Pareto_sol(solu,k); *Conversion of the unit for CO2e from [10kg] to [t] Lex_sol(kp,"CO2e") = Round(Lex_sol_aux(kp,"CO2e")*10/1000); Pareto_sol(solu,"CO2e") = Round(Pareto_sol_aux(solu,"CO2e")*10/1000); *Conversion of the unit Cost from [€] to [Mio. €] Lex_sol(kp,"Cost") = Round(Lex_sol_aux(kp,"Cost")/1000/1000,3); Pareto_sol(solu,"Cost") = Round(Pareto_sol_aux(solu,"Cost")/1000/1000,3); *Conversion of the unit Time from [h] to [d] Lex_sol(kp,"Time") = Round(Lex_sol_aux(kp,"Time")/24); Pareto_sol(solu,"Time") = Round(Pareto_sol_aux(solu,"Time")/24); execute_unload 'OUTPUT_AUGMECON_R.gdx', Lex_sol, Lex_stats, Pareto_sol, Pareto_stats; finish = jnow; elapsed_time = (finish - start)*60*60*24; put /; put 'Infeasibilities = ', infeas:5:0 /; put 'Elapsed time: ',elapsed_time:10:2, ' seconds' /; putclose fx;