Initializing help system before first use

Transport - data formats for online use


Type: Transportation problem
Rating: 3 (intermediate)
Description:
  • transport_html.mos: Solution output in HTML format, using XML functionality or as text
  • transport_xml.mos: Reading and writing data in XML format (requires transprt.xml)
  • transport_json.mos: Reading and writing data in JSON format (requires transprt.json)
File(s): transport_html.mos, transport_xml.mos, transport_json.mos
Data file(s): transprt.dat, transprt.xml, transprt.json


transport_html.mos
(!******************************************************
   Mosel User Guide Example Problems
   ================================= 

   file transport_html.mos
   ```````````````````````
   Solution output in HTML format, using 
   XML functionality or as text.
   
   (c) 2012 Fair Isaac Corporation
       author: S.Heipcke, Oct. 2012
*******************************************************!)

model "Transport (XML)"
 uses "mmxprs", "mmsystem", "mmxml"

 forward procedure write_html_page
 forward procedure write_html_text

 declarations
  REGION: set of string                 ! Set of customer regions
  PLANT: set of string                  ! Set of plants

  DEMAND: array(REGION) of real         ! Demand at regions
  PLANTCAP: array(PLANT) of real        ! Production capacity at plants
  PLANTCOST: array(PLANT) of real       ! Unit production cost at plants
  TRANSCAP: dynamic array(PLANT,REGION) of real
                                        ! Capacity on each route plant->region
  DISTANCE: dynamic array(PLANT,REGION) of real
                                        ! Distance of each route plant->region
  FUELCOST: real                        ! Fuel cost per unit distance

  MaxCap: array(PLANT) of linctr        ! Capacity constraints
  flow: dynamic array(PLANT,REGION) of mpvar    ! Flow on each route

  htmltable,RunDate: string             ! HTML output
  MincostSol: real
 end-declarations
 
 initializations from 'transprt.dat'
  DEMAND
  [PLANTCAP,PLANTCOST] as 'PLANTDATA'
  [DISTANCE,TRANSCAP] as 'ROUTES'
  FUELCOST
 end-initializations

! 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)
 
 minimize(MinCost)                       ! Solve the problem

 
 write_html_page                         ! Generate HTML page via XML
 write_html_text                         ! Generate HTML output as text

!***********************************************************************
! **** Write HTML output using XML ****
 procedure write_html_page
  declarations
   ResultHTML: xmldoc
   Root, Head, Body, Style, Title, Table, Row, Cell, Row2, Table2,
    EmptyRow, EmptyCell: integer
  end-declarations

  setparam("datetimefmt", "%0d-%N-%y, %0H:%0M:%0S")

  Root:= addnode(ResultHTML, 0, XML_ELT, "html")
  Head:= addnode(ResultHTML, Root, XML_ELT, "head")
  Style:= addnode(ResultHTML, Head, XML_ELT, "style",
    "body {font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; color: 003f5f; background-color: d8e3e9 }\n" +
    "table td {background-color: e9e3db; color: 003f5f; text-align: right }\n" +
    "table th {background-color: f7c526; color: 003f5f}")
  setattr(ResultHTML, Style, "type", "text/css")
 
  Body:= addnode(ResultHTML, Root, XML_LASTCHILD, XML_ELT, "body")
  TitleCenter:= addnode(ResultHTML, Body, XML_ELT, "center")
  Title:= addnode(ResultHTML, TitleCenter, XML_ELT, "h2", 
              "Transportation Plan")

  Table:= addnode(ResultHTML, Body, XML_ELT, "table")
    setattr(ResultHTML, Table, "width", '100%')
    setattr(ResultHTML, Table, "cellpadding", '5')
    setattr(ResultHTML, Table, "cellspacing", '0')
    setattr(ResultHTML, Table, "border", 0)
  EmptyRow:= addnode(ResultHTML, Table, XML_LASTCHILD, XML_ELT, "tr")
  Cell:= addnode(ResultHTML, EmptyRow, XML_ELT, "td")
    setattr(ResultHTML, Cell, "colspan", 4)
    setattr(ResultHTML, Cell, "style", 'background-color: ffffff;')
  CellBr:= addnode(ResultHTML, Cell, XML_ELT, "br")

  Row:= addnode(ResultHTML, Table, XML_ELT, "tr")
  EmptyCell:= addnode(ResultHTML, Row, XML_ELT, "td")
    setattr(ResultHTML, EmptyCell, "width", '5%')
    setattr(ResultHTML, EmptyCell, "style", 'background-color: ffffff;')
  Cell:= addnode(ResultHTML, Row, "td", "Total cost: " +  textfmt(MinCost.sol,6,2))
    setattr(ResultHTML, Cell, "width", '65%')
    setattr(ResultHTML, Cell, "style", 'color: #3c3834; font-weight: bold; text-align: left; background-color: ffffff;')
  Cell:= addnode(ResultHTML, Cell, XML_DATA, "&#163;")

  Cell:= addnode(ResultHTML, Row, "td", text(datetime(SYS_NOW)))
    setattr(ResultHTML, Cell, "style", 'color: #3c3834; font-weight: bold; text-align: left; background-color: ffffff;')
  EmptyCell:= copynode(ResultHTML, EmptyCell, ResultHTML, Row, XML_LASTCHILD)
  EmptyRow:= copynode(ResultHTML, EmptyRow, ResultHTML, Table, XML_LASTCHILD)

  Row:= addnode(ResultHTML, Table, XML_ELT, "tr")
  EmptyCell:= copynode(ResultHTML, EmptyCell, ResultHTML, Row, XML_LASTCHILD)
  Cell:= addnode(ResultHTML, Row, XML_ELT, "td")
    setattr(ResultHTML, Cell, "colspan", 2)
    setattr(ResultHTML, Cell, "style", 'background-color: ffffff;')

  Table2:= addnode(ResultHTML, Cell, XML_LASTCHILD, XML_ELT, "table")
    setattr(ResultHTML, Table2, "width", '100%')
    setattr(ResultHTML, Table2, "cellpadding", '2')
    setattr(ResultHTML, Table2, "cellspacing", '1')
  Row2:= addnode(ResultHTML, Table2, XML_ELT, "tr")
  Cell:= addnode(ResultHTML, Row2, XML_ELT, "th", 'from \ to')
    setattr(ResultHTML, Cell, "style", 'font-style: italic')
  forall(r in REGION) 
   Cell:= addnode(ResultHTML, Row2, XML_LASTCHILD, XML_ELT, "th", r)
  Cell:= addnode(ResultHTML, Row2, XML_LASTCHILD, XML_ELT, "th", "Total")
    setattr(ResultHTML, Cell, "style", 'font-style: italic; background-color: f8981d;')
  forall(p in PLANT) do
    Row2:= addnode(ResultHTML, Table2, XML_LASTCHILD, XML_ELT, "tr")
    Cell:= addnode(ResultHTML, Row2, XML_ELT, "th", p)
    forall(r in REGION) 
      Cell:= addnode(ResultHTML, Row2, "td", 
               if(exists(flow(p,r)) and flow(p,r).sol>0, 
                  textfmt(flow(p,r).sol,4,1), text("-")))
    Cell:= addnode(ResultHTML, Row2, "td", textfmt(sum(r in REGION)flow(p,r).sol,4,1))
     setattr(ResultHTML, Cell, "style", 'font-style: italic; font-weight: bold;')
  end-do
  Row2:= addnode(ResultHTML, Table2, XML_LASTCHILD, XML_ELT, "tr")
  Cell:= addnode(ResultHTML, Row2, "th", "Total")
    setattr(ResultHTML, Cell, "style", 'font-style: italic; background-color: f8981d;')
  forall(r in REGION) do
    Cell:= addnode(ResultHTML, Row2, "td", textfmt(sum(p in PLANT)flow(p,r).sol,4,1))
     setattr(ResultHTML, Cell, "style", 'font-style: italic; font-weight: bold;')
  end-do
  Cell:= addnode(ResultHTML, Row2, XML_LASTCHILD, XML_ELT, "td")

  EmptyCell:= copynode(ResultHTML, EmptyCell, ResultHTML, Row, XML_LASTCHILD)
  EmptyRow:= copynode(ResultHTML, EmptyRow, ResultHTML, Table, XML_LASTCHILD)

  save(ResultHTML, "transportres.html")           ! Write the HTML file
  save(ResultHTML, Root, "")                      ! Write the table

 end-procedure

!***********************************************************************
! **** Generate HTML table in text format ****
 procedure write_html_text
  declarations
   htmltemp: text
  end-declarations

  setparam("datetimefmt", "%0d-%N-%y, %0H:%0M:%0S")

  htmltemp := "<html>\n"
  htmltemp += "  <head>\n"
  htmltemp += '    <style type="text/css">body {font-family: Verdana, Geneva, Helvetica, Arial, sans-serif; color: 003f5f; background-color: d8e3e9 }' + "\n"
  htmltemp += "table td {background-color: e9e3db; color: 003f5f; text-align: right }\n"
  htmltemp += "table th {background-color: f7c526; color: 003f5f}</style>\n"
  htmltemp += "  </head>\n"
  htmltemp += "  <body>\n"
  htmltemp += "    <center><h2>Transportation Plan</h2></center>\n"
  htmltemp += '    <table width="100%" cellpadding="5" cellspacing="0" border="0">'+"\n"

  EmtpyRow:= '      <tr><td colspan="4" style="background-color: ffffff;"><br/></td></tr>' + "\n"
  htmltemp += EmtpyRow
  EmptyCell:= '<td width="5%" style="background-color: ffffff;"/>'
  htmltemp += '      <tr>' + EmptyCell
  htmltemp += '        <td width="65%" style="color: #3c3834; font-weight: bold; text-align: left; background-color: ffffff;">Total cost: ' + textfmt(MinCost.sol,6,2) + '&#163;</td>'
  htmltemp += '        <td style="color: #3c3834; font-weight: bold; text-align: left; background-color: ffffff;">' + text(datetime(SYS_NOW)) + '</td>'
  htmltemp += EmptyCell + '</tr>' + "\n"
  htmltemp += EmtpyRow
  htmltemp += '      <tr>'
  htmltemp += EmptyCell
  htmltemp += '        <td colspan="2" style="background-color: ffffff;">'+"\n"
  htmltemp += ' <table width="100%" cellpadding="2" cellspacing="1">'
  
  MincostSol:= getobjval
  RunDate:= string(datetime(SYS_NOW))
  
  htmltemp += '<tr><th style="font-style: italic">from \ to</th>' + "\n"
    
  forall(r in REGION) htmltemp += '  <th>' + r + '</th>' + "\n"
  htmltemp += '  <th style="font-style: italic; background-color: f8981d;">Total</th></tr>' + "\n"
  forall(p in PLANT) do
    htmltemp += '<tr><th>' + p + '</th>'+ "\n"
    forall(r in REGION) 
      htmltemp += '  <td>' +  
               if(exists(flow(p,r)) and flow(p,r).sol>0, 
                  textfmt(flow(p,r).sol,4,1), text("-")) + '</td>' + "\n"
    htmltemp += '  <td style="font-style: italic; font-weight: bold;">' + textfmt(sum(r in REGION)flow(p,r).sol,4,1) + '</td></tr>' + "\n"
  end-do
  htmltemp += '<tr><th style="font-style: italic; background-color: f8981d;">Total</th>' + "\n"
  forall(r in REGION)
    htmltemp += '  <td style="font-style: italic; font-weight: bold;">' +
      textfmt(sum(p in PLANT)flow(p,r).sol,4,1) + '</td>' + "\n"
  htmltemp += "<td/></tr>\n" 

  htmltemp += "      </table></td>"
  htmltemp += EmptyCell + "</tr>\n"
  htmltemp += EmtpyRow
  htmltemp += "    </table>\n"
  htmltemp += "  </body>\n"
  htmltemp += '</html>'

  htmltable:= string(htmltemp)
  writeln("\n\n",htmltable)
  fopen("transportres2.html", F_OUTPUT)
  writeln(htmltable)
  fclose(F_OUTPUT)

 end-procedure

end-model

transport_xml.mos
(!******************************************************
   Mosel User Guide Example Problems
   ================================= 

   file transport_xml.mos
   ``````````````````````
   Reading and writing data in XML format.
   
   (c) 2012 Fair Isaac Corporation
       author: S.Heipcke, Oct. 2012
*******************************************************!)

model "Transport (XML)"
 uses "mmxprs", "mmxml"

 declarations
  REGION: set of string                 ! Set of customer regions
  PLANT: set of string                  ! Set of plants

  DEMAND: array(REGION) of real         ! Demand at regions
  PLANTCAP: array(PLANT) of real        ! Production capacity at plants
  PLANTCOST: array(PLANT) of real       ! Unit production cost at plants
  TRANSCAP: dynamic array(PLANT,REGION) of real
                                        ! Capacity on each route plant->region
  DISTANCE: dynamic array(PLANT,REGION) of real
                                        ! Distance of each route plant->region
  FUELCOST: real                        ! Fuel cost per unit distance

  MaxCap: array(PLANT) of linctr        ! Capacity constraints
  flow: dynamic array(PLANT,REGION) of mpvar    ! Flow on each route

  AllData: xmldoc                       ! XML document
  NodeList: list of integer             ! List of XML nodes
 end-declarations
 

!**** Reading data from an XML file ****
 load(AllData, "transprt.xml")          ! Load the entire XML document

 getnodes(AllData, "transport/demand/region", NodeList) 
 forall(l in NodeList)
   DEMAND(getstrattr(AllData,l,"name")):= getrealvalue(AllData, l) 

 getnodes(AllData, "transport/plantdata/plant", NodeList) 
 forall(l in NodeList) do
   PLANTCAP(getstrattr(AllData,l,"name")):= 
     getrealvalue(AllData, getnode(AllData,l,"capacity"))    
   PLANTCOST(getstrattr(AllData,l,"name")):= 
     getrealvalue(AllData, getnode(AllData,l,"cost"))    
 end-do

 getnodes(AllData, "transport/routes/route", NodeList) 
 forall(l in NodeList) do
   DISTANCE(getstrattr(AllData,l,"from"),getstrattr(AllData,l,"to")):=
     getrealattr(AllData,l,"distance")
   TRANSCAP(getstrattr(AllData,l,"from"),getstrattr(AllData,l,"to")):=
     getrealattr(AllData,l,"capacity")
 end-do

 FUELCOST:= getrealattr(AllData, getnode(AllData, "transport"), "fuelcost")

!**** Problem statement + solving ****

! 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)
 
 minimize(MinCost)                       ! Solve the problem

!**** Create solution representation in XML format ****
 declarations
  ResData: xmldoc                        ! XML document
  Sol,Plant,Reg,Total: integer           ! XML nodes
 end-declarations

 Sol:=addnode(ResData, 0, XML_ELT, "solution")     ! Create root node "solution"
 setattr(ResData, Sol, "Objective", MinCost.sol)   ! Obj. value as attribute
 setattr(ResData, Sol, "RunDate", text(datetime(SYS_NOW)))

 forall(p in PLANT) do
   Plant:=addnode(ResData, Sol, XML_ELT, "plant")  ! Add a node to "solution"
   setattr(ResData, Plant, "name", p)              ! ... with attribute "name"
   forall(r in REGION | flow(p,r).sol>0) do
     Reg:=addnode(ResData, Plant, XML_ELT, "region") ! Add a node to "plant"
     setattr(ResData, Reg, "name", r)              ! ... with attribute "name"
     setvalue(ResData, Reg, flow(p,r).sol)         ! ... and solution value
   end-do
   Total:=addnode(ResData, Plant, "total", 
                  sum(r in REGION)flow(p,r).sol)   ! Add node with total flow
 end-do
 
 save(ResData, "transportres.xml")   ! Save solution to XML format file
 save(ResData, Sol, "")              ! Display XML format solution on screen

end-model

transport_json.mos
(!******************************************************
   Mosel User Guide Example Problems
   ================================= 

   file transport_json.mos
   ```````````````````````
   Reading and writing data in JSON format.
   
   (c) 2014 Fair Isaac Corporation
       author: S.Heipcke, Oct. 2014
*******************************************************!)

model "Transport (JSON)"
 uses "mmxprs", "mmxml"

 declarations
  REGION: set of string                 ! Set of customer regions
  PLANT: set of string                  ! Set of plants

  DEMAND: array(REGION) of real         ! Demand at regions
  PLANTCAP: array(PLANT) of real        ! Production capacity at plants
  PLANTCOST: array(PLANT) of real       ! Unit production cost at plants
  TRANSCAP: dynamic array(PLANT,REGION) of real
                                        ! Capacity on each route plant->region
  DISTANCE: dynamic array(PLANT,REGION) of real
                                        ! Distance of each route plant->region
  FUELCOST: real                        ! Fuel cost per unit distance

  MaxCap: array(PLANT) of linctr        ! Capacity constraints
  flow: dynamic array(PLANT,REGION) of mpvar    ! Flow on each route

  AllData: xmldoc                       ! XML document
  NodeList: list of integer             ! List of XML nodes
 end-declarations
 

!**** Reading data from an XML file ****
 jsonload(AllData, "transprt.json")     ! Load the entire document
! save(AllData,"")

 getnodes(AllData, "jsv/demand/*", NodeList) 
 forall(l in NodeList)
   DEMAND(getname(AllData,l)):= getrealvalue(AllData, l) 

 getnodes(AllData, "jsv/plantdata/*", NodeList) 
 forall(l in NodeList) do
   PLANTCAP(getname(AllData,l)):= 
     getrealvalue(AllData, getnode(AllData,l,"capacity"))    
   PLANTCOST(getname(AllData,l)):= 
     getrealvalue(AllData, getnode(AllData,l,"cost"))    
 end-do

 getnodes(AllData, "jsv/routes/route", NodeList) 
 forall(l in NodeList) do
   DISTANCE(getstrvalue(AllData,getnode(AllData,l,"from")),
            getstrvalue(AllData,getnode(AllData,l,"to"))):=
     getrealvalue(AllData,getnode(AllData,l,"distance"))
   TRANSCAP(getstrvalue(AllData,getnode(AllData,l,"from")),
            getstrvalue(AllData,getnode(AllData,l,"to"))):=
     getrealvalue(AllData,getnode(AllData,l,"capacity"))
 end-do

 FUELCOST:= getrealvalue(AllData, getnode(AllData, "jsv/fuelcost"))

!**** Problem statement + solving ****

! 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)

 minimize(MinCost)                       ! Solve the problem

!**** Create solution representation in XML format ****
 declarations
  ResData: xmldoc                        ! XML document
  Sol,Plant,Node,Total: integer          ! XML nodes
 end-declarations

 Sol:=addnode(ResData, 0, XML_ELT, "jsv")     ! Create root node "jsv"
 Node:=addnode(ResData, Sol, "Objective", MinCost.sol)  ! Obj. value as node
 Node:=addnode(ResData, Sol, "RunDate", text(datetime(SYS_NOW)))

 forall(p in PLANT) do
   Plant:=addnode(ResData, Sol, XML_ELT, p)   ! Add a node to "solution"
   forall(r in REGION | flow(p,r).sol>0)
     Node:=addnode(ResData, Plant, r, flow(p,r).sol) ! Add a node to "plant"
   Total:=addnode(ResData, Plant, "total", 
                  sum(r in REGION)flow(p,r).sol)  ! Add node with total flow
 end-do
 
 jsonsave(ResData, "transportres.json")  ! Save solution to JSON format file
 jsonsave(ResData, Sol, "")              ! Display JSON format sol. on screen

end-model

© 2001-2022 Fair Isaac Corporation. All rights reserved. This documentation is the property of Fair Isaac Corporation (“FICO”). Receipt or possession of this documentation does not convey rights to disclose, reproduce, make derivative works, use, or allow others to use it except solely for internal evaluation purposes to determine whether to purchase a license to the software described in this documentation, or as otherwise set forth in a written software license agreement between you and FICO (or a FICO affiliate). Use of this documentation and the software described in it must conform strictly to the foregoing permitted uses, and no other use is permitted.