(!*******************************************************
* Mosel Example Problems *
* ====================== *
* *
* file fstns.mos *
* `````````````` *
* Example for the use of the Mosel language *
* (Firestation siting problem) *
* *
* (c) 2008 Fair Isaac Corporation *
* author: S. Heipcke, 2001, rev. Feb. 2010 *
*******************************************************!)
model Firestns ! Start a new model
uses "mmxprs" ! Load the optimizer library
declarations
RTown=1..6 ! Range of towns
TIMELIMIT=20 ! Max. time allowed to reach any town
TIME: array(RTown,RTown) of integer ! Time taken between each pair of towns
SERVE: array(RTown,RTown) of boolean ! true if time within limit, false
! otherwise (default)
openst: array(RTown) of mpvar ! 1 if ambulance at town; 0 if not
end-declarations
TIME:: [ 0,15,25,35,35,25,
15, 0,30,40,25,15,
25,30, 0,20,30,25,
35,40,20, 0,20,30,
35,25,35,20, 0,19,
25,15,25,30,19, 0]
(! This sets SERVE(t,s) to true if the time between the two towns is
within the time limit. We can then use SERVE to define a set of
constraints (see below). It is as well possible not to use the array
SERVE and move the test directly into the definition of the constraints.
!)
forall(t,s in RTown)
SERVE(t,s) := TIME(t,s) <= TIMELIMIT
! Objective: minimize number fire stations
MinSta:= sum(s in RTown) openst(s)
! Serve each town t by an open station s
forall(t in RTown)
Serve(t):= sum(s in RTown|SERVE(t,s)) openst(s) >= 1
! Variables are 0/1
forall(s in RTown) openst(s) is_binary
minimize(MinSta) ! Solve the MIP-problem
! Print out the solution
writeln("Solution:\n Minimum number of firestations: ", getobjval)
forall(s in RTown) write(" open(", s ,"): ", openst(s).sol)
write("\n ")
forall(s in RTown) write(s, " ")
writeln
forall(t in RTown | openst(t).sol=1) do
write(" ", t, ": ")
forall(s in RTown) write(if(SERVE(t,s), "Y ", ". "))
writeln
end-do
end-model
|