FICO
FICO Xpress Optimization Examples Repository
FICO Optimization Community FICO Xpress Optimization Home
Back to examples browserPrevious exampleNext example

Firestns: A set-covering model for emergency service provision

Description
Minimize the total number of firestations that are required to service a set of towns within a specified permissible travel time.

Further explanation of this example: 'Xpress Python Reference Manual'

firestns_python.zip[download all files]

Source Files
By clicking on a file name, a preview is opened at the bottom of this page.
fstns.py[download]





fstns.py

'''*******************************************************
  * Python Example Problems                             *
  *                                                     *
  * file fstns.py                                       *
  * Example for the use of the Python language          *
  * (Firestation siting problem)                        *
  *                                                     *
  * (c) 2018-2024 Fair Isaac Corporation                *
  *******************************************************'''

from __future__ import print_function
import xpress as xp

RTown = range(6)  # Range of towns
TIMELIMIT = 20    # Max. time allowed to reach any town

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.
'''

SERVE = [[TIME[t][s] <= TIMELIMIT for t in RTown] for s in RTown]

p = xp.problem()

# 1 if ambulance at town; 0 if not
openst = [p.addVariable(vartype=xp.binary) for _ in RTown]

# Objective: minimize number fire stations
p.setObjective(xp.Sum(openst[s] for s in RTown))

# Serve each town t by an open station s
p.addConstraint(xp.Sum(openst[s] for s in RTown if SERVE[t][s]) >= 1
                for t in RTown)

p.optimize()  # Solve the MIP-problem

# Print out the solution
print("Solution:\n Minimum number of firestations: ", p.getObjVal())
for s in RTown:
    print(" open(", s, "): ", p.getSolution(openst[s]), sep='')
print("\n      ", end='')
for s in RTown:
    print(s, " ", end='', sep='')
print('')
for t in RTown:
    if p.getSolution(openst[t]) == 1:
        print(" ", t, ": ", end='')
        for s in RTown:
            if SERVE[t][s]:
                print("Y ", end='')
            else:
                print(". ", end='')
        print('')

Back to examples browserPrevious exampleNext example