Initializing help system before first use

Workshop - Displaying solution information


Type: Production planning
Rating: 1 (simple)
Description: A small planning problem. The example composes constraints, LP solves the problem and then prints the variables.
Model version 'xbworkrng' shows how to retrieve ranging information for variables and constraints and how to change the number-printing format.
File(s): xbworks.c, xbworkrng.c


xbworks.c
/********************************************************
  BCL Example Problems
  ====================

  file xbworks.c
  ``````````````
  Workshop planning example.

  (c) 2008 Fair Isaac Corporation
      author: S.Heipcke, Jan. 2000, rev. Mar. 2011
********************************************************/

#include <stdio.h>
#include "xprb.h"

#define NProd 2                  /* Number of products */
#define NShop 3                  /* Number of workshops */
#define WMAX 40                  /* Maximum weekly working time */

/****DATA****/
int DUR[][NShop] =  {{5, 9, 7},  /* Duration of product p on shop s */
                    {10, 2, 5}};
int RES[]   = {10, 8};           /* Man hours per unit */
int PRICE[] = {108, 84};         /* Selling price per unit */

/***********************************************************************/

int main(int argc, char **argv)
{
 int p,s;
 XPRBctr c;
 XPRBvar x[NProd];                   /* Amount of product p */
 XPRBprob prob;

 prob=XPRBnewprob("Workshop");       /* Initialize a new problem in BCL */

/****VARIABLES****/
 for(p=0;p<NProd;p++)
  x[p] = XPRBnewvar(prob,XPRB_PL,"x",0,XPRB_INFINITY);

/****OBJECTIVE****/
 c = XPRBnewctr(prob,"OBJ",XPRB_N);  /* Objective: Maximize Benefit */
 for(p=0;p<NProd;p++)
  XPRBaddterm(c,x[p],PRICE[p]-5*RES[p]);
 XPRBsetobj(prob,c);                 /* Select objective function */

/****CONSTRAINTS****/
 for(s=0;s<NShop;s++)                /* Limit on weekly working hours */
 {
  c=XPRBnewctr(prob,"ResMax",XPRB_L);
  for(p=0;p<NProd;p++)
   XPRBaddterm(c,x[p],DUR[p][s]);
  XPRBaddterm(c,NULL,WMAX);
 }

/****SOLVING + OUTPUT****/
 XPRBsetsense(prob,XPRB_MAXIM);      /* Set obj. sense to maximization */
 XPRBexportprob(prob,XPRB_MPS,"Works");  /* Output the matrix in MPS format */
 XPRBlpoptimize(prob,"");            /* Solve the LP-problem */
 printf("Objective: %g\n",XPRBgetobjval(prob));  /* Get objective value */
 for(p=0;p<NProd;p++)                /* Print the solution values */
  printf("%s:%g, ", XPRBgetvarname(x[p]), XPRBgetsol(x[p]));
 printf("\n");

 return 0;
}

xbworkrng.c
/********************************************************
  BCL Example Problems
  ====================

  file xbworkrng.c
  ````````````````
  Workshop planning example.
  Test ranges and number printing format.

  (c) 2008 Fair Isaac Corporation
      author: S.Heipcke, 2003, rev. Mar. 2011
********************************************************/

#include <stdio.h>
#include "xprb.h"

#define NProd 2                  /* Number of products */
#define NShop 3                  /* Number of workshops */
#define WMAX 40                  /* Maximum weekly working time */

/****DATA****/
int DUR[][NShop] =  {{5, 9, 7},  /* Duration of product p on shop s */
                    {10, 2, 5}};
int RES[]   = {10, 8};           /* Man hours per unit */
int PRICE[] = {108, 84};         /* Selling price per unit */

/***********************************************************************/

int main(int argc, char **argv)
{
 int p,s;
 XPRBctr c[NShop],cobj;
 XPRBvar x[NProd];                   /* Amount of product p */
 XPRBprob prob;

 prob=XPRBnewprob("Workshop");       /* Initialize a new problem in BCL */

/****VARIABLES****/
 for(p=0;p<NProd;p++)
  x[p] = XPRBnewvar(prob,XPRB_PL,"x",0,XPRB_INFINITY);

/****OBJECTIVE****/
 cobj = XPRBnewctr(prob,"OBJ",XPRB_N);  /* Objective: Maximize Benefit */
 for(p=0;p<NProd;p++)
  XPRBaddterm(cobj,x[p],PRICE[p]-5*RES[p]);
 XPRBsetobj(prob,cobj);              /* Select objective function */

/****CONSTRAINTS****/
 for(s=0;s<NShop;s++)                /* Limit on weekly working hours */
 {
  c[s]=XPRBnewctr(prob,"ResMax",XPRB_L);
  for(p=0;p<NProd;p++)
   XPRBaddterm(c[s],x[p],DUR[p][s]);
  XPRBaddterm(c[s],NULL,WMAX);
 }

/****SOLVING + OUTPUT****/
 XPRBsetrealfmt(prob, "%4.2e");
 for(p=0;p<NProd;p++)
 { XPRBprintvar(x[p]); printf(" "); }
 printf("\n");

 XPRBsetsense(prob,XPRB_MAXIM);      /* Set obj. sense to maximization */
 XPRBlpoptimize(prob,"");            /* Solve the LP-problem */
 printf("Objective: %g\n",XPRBgetobjval(prob));  /* Get objective value */

 XPRBsetrealfmt(prob, "%g, ");
 for(p=0;p<NProd;p++)                /* Print the solution values */
  XPRBprintvar(x[p]);
 printf("\n");

 XPRBsetrealfmt(prob, "%8.4f");
 XPRBprintprob(prob);
                                 /* Row ranges */
 printf("Ctr: Lower activity, Upper activity, Unit cost DN, Unit cost UP\n");
 for(s=0;s<NShop;s++)
  printf("%s: %g, %g, %g, %g\n", XPRBgetctrname(c[s]),
          XPRBgetctrrng(c[s],XPRB_LOACT), XPRBgetctrrng(c[s],XPRB_UPACT),
          XPRBgetctrrng(c[s],XPRB_UDN), XPRBgetctrrng(c[s],XPRB_UUP));

                                 /* Column ranges */
 printf("Var: Lower activity, Upper activity, Unit cost DN, Unit cost UP, Lower profit, Upper profit\n");
 for(p=0;p<NProd;p++)
  printf("%s: %g, %g, %g, %g, %g, %g\n", XPRBgetvarname(x[p]),
          XPRBgetvarrng(x[p],XPRB_LOACT), XPRBgetvarrng(x[p],XPRB_UPACT),
          XPRBgetvarrng(x[p],XPRB_UDN), XPRBgetvarrng(x[p],XPRB_UUP),
          XPRBgetvarrng(x[p],XPRB_LCOST), XPRBgetvarrng(x[p],XPRB_UCOST));

 return 0;
}