(!****************************************************** Mosel Example Problems ====================== file e1carrent.mos `````````````````` Fleet management in car rental (c) 2008 Fair Isaac Corporation author: S. Heipcke, Mar. 2002 *******************************************************!) model "E-1 Car rental" uses "mmxprs" declarations AGENTS = 1..10 ! Car rental agencies REQ: array(AGENTS) of integer ! Required number of cars STOCK: array(AGENTS) of integer ! Number of cars in stock X,Y: array(AGENTS) of integer ! Coordinates of rental agencies COST: real ! Cost per km of moving a car NEED: set of integer ! Agencies needing more cars EXCESS: set of integer ! Agencies with too many cars end-declarations initializations from 'e1carrent.dat' REQ STOCK X Y COST end-initializations if sum(a in AGENTS) (STOCK(a)-REQ(a)) <> 0 then writeln("Problem is infeasible") exit(0) end-if ! Calculate sets of agencies with excess or deficit of cars forall(a in AGENTS) if STOCK(a) - REQ(a) < 0 then NEED += {a} elif STOCK(a) - REQ(a) > 0 then EXCESS += {a} end-if finalize(NEED); finalize(EXCESS) declarations DIST: array(EXCESS,NEED) of real ! Distance between agencies move: array(EXCESS,NEED) of mpvar ! Cars exchanged between agencies end-declarations ! Calculate distances between agencies forall(a in EXCESS,b in NEED) DIST(a,b):= 1,3*sqrt((X(a)-X(b))^2 + (Y(a)-Y(b))^2) ! Objective: total transport cost Cost:= sum(a in EXCESS,b in NEED) COST*DIST(a,b)*move(a,b) ! Agencies with excess availability forall(a in EXCESS) sum(b in NEED) move(a,b) = STOCK(a) - REQ(a) ! Agencies in need of cars forall(b in NEED) sum(a in EXCESS) move(a,b) = REQ(b) - STOCK(b) forall(a in EXCESS,b in NEED) move(a,b) is_integer ! Solve the problem minimize(Cost) ! Solution printing writeln("Total cost: ", getobjval) write(" ->") forall(b in NEED) write(strfmt(b,3)) writeln forall(a in EXCESS) do write(a," ") forall(b in NEED) write(strfmt(getsol(move(a,b)),3)) writeln end-do end-model