Initializing help system before first use

Running a model with multiple data scenarios


Type: Transportation
Rating: 2 (easy-medium)
Description: Retrieve data and solution information from the model instances for solution aggregation and reporting by the calling program.
File(s): scenar.c, scenar.mos
Data file(s): dem1.dat, dem2.dat, dem3.dat, dem4.dat, dem5.dat, supply.dat


scenar.c
/*******************************************************
   Mosel Example Problems
   ====================== 

   file scenar.c
   `````````````
   Executing different scenarios.
   
   (c) 2008 Fair Isaac Corporation
       author: S. Heipcke, 2002
********************************************************/

#include <stdio.h>
#include <string.h>
#include "xprm_mc.h"

int execscenar(const char *FILENAME, double WEIGHT);

#define NSUP 6

double obj, capuse[NSUP], CAP[NSUP];
char SUPNAME[NSUP][64];

int main()
{
 int NSCENAR = 5;
 const char *DEMDATA[] = {"dem1.dat", "dem2.dat", "dem3.dat", "dem4.dat", 
                          "dem5.dat"};
 double WEIGHT[] = {0.4, 0.15, 0.1, 0.25, 0.1};
 int i,s;
 double fact = 0;

 if(XPRMinit())                         /* Initialize Mosel */
  return 1;
                                        /* Execute all scenarios */
 for(i=0;i<NSCENAR;i++) if(execscenar(DEMDATA[i], WEIGHT[i])) fact+=WEIGHT[i];
 fact= 1/fact;
                                        /* Print out aggregate results */
 printf("Weighted average objective: %g\n", obj*fact);
 for(s=0;s<NSUP;s++) 
  printf("%s: %g (%g%% of %g)\n", SUPNAME[s], capuse[s]*fact, 
         capuse[s]*fact/CAP[s]*100, CAP[s]);

 return 0;
}

/**** Run a scenario and retrieve its results ****/
int execscenar(const char *FILENAME, double WEIGHT)
{
 XPRMmodel mod;
 XPRMalltypes rvalue;
 XPRMarray darr, varr;
 XPRMset set[1];
 XPRMmpvar x;
 int indices[2], result;
 char params[128];

 sprintf(params, "DEMFILE=Data/%s", FILENAME);

                                          /* Execute model file 'scenar.mos' */
 if(XPRMexecmod(NULL,"scenar.mos",params,&result,&mod))
 { printf("Problem %s not executed.\n", FILENAME); return 0; }
 
                                          /* Test whether a solution is found */
 if((XPRMgetprobstat(mod)&XPRM_PBRES)!=XPRM_PBOPT)
 { printf("Demand scenario %s is infeasible.\n", FILENAME); return 0; }

/* Get the objective function value */
 obj += WEIGHT*XPRMgetobjval(mod);                         

/* At first execution: get 'CAP' data and the 'Suppliers' index set for
   pretty solution printout */
 if(!strcmp(FILENAME, "dem1.dat"))
 {
  XPRMfindident(mod, "CAP", &rvalue);     /* Get the model object 'CAP' */
  darr = rvalue.array;
  XPRMgetarrsets(darr, set);              /* Get the index set of 'CAP' */
  XPRMgetfirstarrentry(darr, indices);    /* Get the first index tuple */
  do
  {
   strcpy(SUPNAME[indices[0]-1], 
     XPRMgetelsetval(set[0], indices[0], &rvalue)->string);
   XPRMgetarrval(darr, indices, &(CAP[indices[0]-1]));
  } while(!XPRMgetnextarrentry(darr, indices));  /* Get the next index tuple */
 }

/* At every execution: get the solution for variables 'x' */
 XPRMfindident(mod, "x", &rvalue);        /* Get the model object 'x' */
 varr = rvalue.array;
 XPRMgetfirstarrtruentry(varr, indices); /* Get the first entry of array varr
                                             (we know that the array is sparse 
                                             and has two dimensions) */
 do
 {
  XPRMgetarrval(varr, indices, &x);       /* Get the corresponding variable */
  capuse[indices[0]-1] += WEIGHT*XPRMgetvsol(mod,x);   /* Save the sol. value */
/*  printf("<%d,%d:%g>\n", indices[0], indices[1], XPRMgetvsol(mod,x)); */
 } while(!XPRMgetnextarrtruentry(varr, indices));  
                                          /* Get the next index tuple */
 return 1;
}

scenar.mos
(!*******************************************************
  Mosel Example Problems
  ======================

  file scenar.mos
  ```````````````
  Transportation example (multiple scenarios).

  (c) 2008 Fair Isaac Corporation
      author: S.Heipcke, 2002, rev. June 2018
*********************************************************!)

model "Scenario"
 uses "mmxprs"

 parameters
  DEMFILE="Data/dem1.dat"
 end-parameters
 
 public declarations
  Suppliers: set of string                  ! Set of suppliers
  Customers: set of string                  ! Set of customers
  COST: dynamic array(Suppliers,Customers) of real  ! Cost per supplier-customer pair
  CAP: array(Suppliers) of real             ! Production capacity
  DEM: array(Customers) of real             ! Demand by customers

  x: dynamic array(Suppliers,Customers) of mpvar    ! Transported quantities
 end-declarations
 
 initializations from "Data/supply.dat"
  COST CAP
 end-initializations
 
 initializations from DEMFILE
  DEM as "DEMAND"
 end-initializations  

 forall(s in Suppliers, c in Customers | exists(COST(s,c))) create(x(s,c))

! Objective: minimize total cost
 MinCost:= 
  sum(s in Suppliers, c in Customers | exists(COST(s,c))) COST(s,c) * x(s,c)

! Limits on production capacities
 forall(s in Suppliers) sum(c in Customers) x(s,c) <= CAP(s)

! Satisfy customer demands
 forall(c in Customers) sum(s in Suppliers) x(s,c) >= DEM(c) 

 minimize(MinCost)

 writeln("Demand scenario: ", DEMFILE)
 
(! 
 forall(s in Suppliers, c in Customers)
  if(getsol(x(s,c))>0) then
   writeln(s," (", CAP(s), ") -> ", c, " (", DEM(c), "): ", 
       getsol(x(s,c)) )
  end-if
!)

 if(getprobstat=XPRS_OPT) then
  writeln("Total cost: ", getobjval)
  forall(s in Suppliers) writeln(s, ": ", getsol(sum(c in Customers) x(s,c)) )
 end-if
 
end-model 

© 2001-2024 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.