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

Output formatting for a transportation model

  • small LP problem
  • generate a nice printed output
  • using dynamic arrays for representing sparse data structures
  • reading several data arrays from a single data file
Further explanation of this example: 'Mosel User Guide', Section 3.2 A transport example and Section 10.1 Producing formatted output.

The section 'Traditional embedding: solving multiple scenarios' of the Xpress Whitepaper 'Embedding Optimization Algorithms' describes how to embed a similar transportation model into an application.

Source Files

Data Files


   Mosel User Guide Example Problems

   file transport_insight.mos
   Solution display in Insight application.
   (c) 2012 Fair Isaac Corporation
       author: S.Heipcke, Sep. 2012, rev. June 2019

model "Transport"
 uses "mmxprs", "mmsystem" 
 uses "mminsight"

 version 1.0.1

 public declarations
  !@insight.alias Customer regions
  REGION: set of string                 ! Set of customer regions
  !@insight.alias Plants
  PLANT: set of string                  ! Set of plants
  !@insight.alias Demand
  DEMAND: array(REGION) of real         ! Demand at regions
  !@insight.alias Production capacity
  PLANTCAP: array(PLANT) of real        ! Production capacity at plants
  !@insight.alias Unit production cost
  PLANTCOST: array(PLANT) of real       ! Unit production cost at plants
  !@insight.alias Capacity on each route
  TRANSCAP: dynamic array(PLANT,REGION) of real
                                        ! Capacity on each route plant->region
  !@insight.alias Distance per route
  DISTANCE: dynamic array(PLANT,REGION) of real
                                        ! Distance of each route plant->region
  !@insight.alias Fuel cost per unit distance
  FUELCOST: real                        ! Fuel cost per unit distance
  ! @insight.hidden=true
  SELCUST: array(REGION) of boolean     ! Customer selection for display
  ! @insight.hidden=true
  CURRENTPLANT: string                  ! Plant selection for display

 public declarations
  !@insight.alias Production capacity limits
  MaxCap: array(PLANT) of linctr        ! Capacity constraints
  !@insight.alias Amount shipped
  flow: dynamic array(PLANT,REGION) of mpvar    ! Flow on each route
  RunDate: string                       ! Date for display
  MincostSol: real
  pltotal: array(PLANT) of real         !@insight.alias Total
  rgtotal: array(REGION) of real

! Data input from file
 procedure readdata
  initializations from 'transprt.dat'

! Data input (from file or Insight scenario data)
 case insightgetmode of
     readdata            ! Initialize data for baseline
     exit(0)             ! Stop model run after data input
    insightpopulate      ! Inject scenario data and continue
    readdata             ! Non-Insight runs: initialize data and continue
    writeln_("Unknown run mode")

! Create the flow variables that exist
 forall(p in PLANT, r in REGION | exists(TRANSCAP(p,r)) ) create(flow(p,r))
! Objective: minimize total cost
 MinCost:= sum(p in PLANT, r in REGION | exists(flow(p,r))) 
            (FUELCOST * DISTANCE(p,r) + PLANTCOST(p)) * flow(p,r)
! Limits on plant capacity
 forall(p in PLANT) MaxCap(p):= sum(r in REGION) flow(p,r) <= PLANTCAP(p)

! Satisfy all demands
 forall(r in REGION) sum(p in PLANT) flow(p,r) = DEMAND(r)
! Bounds on flows
 forall(p in PLANT, r in REGION | exists(flow(p,r))) 
  flow(p,r) <= TRANSCAP(p,r)
 insightminimize(MinCost)      ! Solve problem through Xpress Insight

 setparam("datetimefmt", "%0d-%N-%y, %0H:%0M:%0S")
 RunDate:= string(datetime(SYS_NOW))

 if getprobstat=XPRS_OPT then
   writeln("Solution: ", getobjval)

 ! Result objects accessed by Optimization Modeler
   MincostSol:= getobjval
   pltotal:= array(p in PLANT) sum(r in REGION) flow(p,r).sol
   rgtotal:= array(r in REGION) sum(p in PLANT) flow(p,r).sol

   writeln("No solution found")

Back to examples browserPrevious exampleNext example