| /********************************************************
  BCL Example Problems
  ====================
  file xbcoco1.c
  ``````````````
  Coco Problem Phase 1.
  Initial formulation: data, variables,
  and constraints fixed.
  (c) 2008-2024 Fair Isaac Corporation
      author: S.Heipcke, Jan. 2000, rev. Mar. 2011
********************************************************/
#include <stdio.h>
#include "xprb.h"
int main(int argc, char **argv)
{
 XPRBvar make11,make21,make12,make22;
 XPRBctr ctr;
 XPRBprob prob;
 prob=XPRBnewprob("Coco1");       /* Initialize a new problem in BCL */
/****VARIABLES****/
 make11=XPRBnewvar(prob,XPRB_PL,"make11",0,XPRB_INFINITY);
                                  /* Amount of prod. 1 to make at factory 1 */
 make21=XPRBnewvar(prob,XPRB_PL,"make21",0,XPRB_INFINITY);
                                  /* Amount of prod. 2 to make at factory 1 */
 make12=XPRBnewvar(prob,XPRB_PL,"make12",0,XPRB_INFINITY);
                                  /* Amount of prod. 1 to make at factory 2 */
 make22=XPRBnewvar(prob,XPRB_PL,"make22",0,XPRB_INFINITY);
                                  /* Amount of prod. 2 to make at factory 2 */
/****OBJECTIVE****/
 ctr = XPRBnewctr(prob,"OBJ",XPRB_N);
 XPRBaddterm(ctr, make11,  50);   /* Objective: maximize total profit */
 XPRBaddterm(ctr, make21, 125);
 XPRBaddterm(ctr, make12,  47);
 XPRBaddterm(ctr, make22, 132);
 XPRBsetobj(prob,ctr);            /* Select objective function */
/****CONSTRAINTS****/
 ctr=XPRBnewctr(prob,"MxMake1",XPRB_L);  /* Capacity limit at factory 1 */
 XPRBaddterm(ctr, make11, 1);
 XPRBaddterm(ctr, make21, 1);
 XPRBaddterm(ctr, NULL, 400);
 ctr=XPRBnewctr(prob,"MxMake2",XPRB_L);  /* Capacity limit at factory 2 */
 XPRBaddterm(ctr, make12, 1);
 XPRBaddterm(ctr, make22, 1);
 XPRBaddterm(ctr, NULL, 500);
 ctr=XPRBnewctr(prob,"MxSell1",XPRB_L);  /* Limit on amount of prod. 1 to be sold */
 XPRBaddterm(ctr, make11, 1);
 XPRBaddterm(ctr, make12, 1);
 XPRBaddterm(ctr, NULL, 650);
 ctr=XPRBnewctr(prob,"MxSell2",XPRB_L);  /* Limit on amount of prod. 2 to be sold */
 XPRBaddterm(ctr, make21, 1);
 XPRBaddterm(ctr, make22, 1);
 XPRBaddterm(ctr, NULL, 600);
/****SOLVING + OUTPUT****/
 XPRBsetsense(prob, XPRB_MAXIM);      /* Choose the sense of optimization */
 XPRBlpoptimize(prob, "");            /* Solve the LP-problem */
 printf("Objective: %g\n", XPRBgetobjval(prob));   /* Get objective value */
    /* Print out the solution values for all variables */
 printf("%s: %g\n",XPRBgetvarname(make11),XPRBgetsol(make11));
 printf("%s: %g\n",XPRBgetvarname(make21),XPRBgetsol(make21));
 printf("%s: %g\n",XPRBgetvarname(make12),XPRBgetsol(make12));
 printf("%s: %g\n",XPRBgetvarname(make22),XPRBgetsol(make22));
 return 0;
}
 | 
| /********************************************************
  BCL Example Problems
  ====================
  file xbcoco2.c
  ``````````````
  Coco Problem Phase 2.
  Use parameters, data tables and subscripted variables
  to separate the model structure from the data.
  Read data tables in from text data files.
  (c) 2008-2024 Fair Isaac Corporation
      author: S.Heipcke, Jan. 2000, rev. Mar. 2011
********************************************************/
#include <stdio.h>
#include "xprb.h"
#define NP 2            /* Number of products (p) */
#define NF 2            /*           factories (f) */
#define NR 2            /*           raw materials (r) */
#define REVFILE     XPRBDATAPATH "/coco/rev.dat"
#define CMAKEFILE   XPRBDATAPATH "/coco/cmake.dat"
#define CBUYFILE    XPRBDATAPATH "/coco/cbuy.dat"
#define REQFILE     XPRBDATAPATH "/coco/req.dat"
#define MXSELLFILE  XPRBDATAPATH "/coco/maxsell.dat"
#define MXMAKEFILE  XPRBDATAPATH "/coco/mxmake.dat"
/****TABLES****/
double REV[NP];         /* Unit selling price of product p */
double CMAK[NP][NF];    /* Unit cost to make product p at factory f */
double CBUY[NR];        /* Unit cost to buy raw material r */
double REQ[NP][NR];     /* Requirement by unit of prod. p for raw material r */
double MXSELL[NP];      /* Max. amount of p that can be sold */
double MXMAKE[NF];      /* Max. amount factory f can make over all products */
double PROFIT[NP][NF];  /* Profit contribution of product p at factory f */
/***********************************************************************/
void modcoco2(XPRBprob prob)
{
 XPRBvar make[NP][NF];
 XPRBctr ctr;
 int p,f;
/****VARIABLES****/
 for(p=0;p<NP;p++)
  for(f=0;f<NF;f++)
   make[p][f]=                   /* Amount of prod. p to make at factory f */
    XPRBnewvar(prob,XPRB_PL,XPRBnewname("make_p%df%d",p+1,f+1),0,XPRB_INFINITY);
/****OBJECTIVE****/
 ctr = XPRBnewctr(prob,"OBJ",XPRB_N);  /* Objective: maximize total profit */
 for(p=0;p<NP;p++)
  for(f=0;f<NF;f++) XPRBaddterm(ctr,make[p][f],PROFIT[p][f]);
 XPRBsetobj(prob,ctr);                 /* Select objective function */
/****CONSTRAINTS****/
            /* Limit on the amount of product p to be sold */
 for(p=0;p<NP;p++)
 {
  ctr = XPRBnewctr(prob,"MxSell",XPRB_L);
  for(f=0;f<NF;f++) XPRBaddterm(ctr,make[p][f],1);
  XPRBaddterm(ctr,NULL,MXSELL[p]);
 }
            /* Capacity limit at factory f */
 for(f=0;f<NF;f++)
 {
  ctr=XPRBnewctr(prob,"MxMake",XPRB_L);
  for(p=0;p<NP;p++)
   XPRBaddterm(ctr, make[p][f], 1);
  XPRBaddterm(ctr, NULL, MXMAKE[f]);
 }
/****SOLVING + OUTPUT****/
 XPRBsetsense(prob,XPRB_MAXIM);        /* Choose the sense of optimization */
 XPRBlpoptimize(prob, "");             /* Solve the LP-problem */
 printf("Objective: %g\n", XPRBgetobjval(prob));    /* Get objective value */
 for(p=0;p<NP;p++)
  for(f=0;f<NF;f++)
  { XPRBprintvar(make[p][f]); printf(" "); }  /* Print the solution values */
 printf("\n");
}
/***********************************************************************/
    /**** Read data from files ****/
void readdata(void)
{
 FILE *datafile;
 int p,f,r;
        /* Read the revenu data file */
 datafile=fopen(REVFILE,"r");
 XPRBreadarrlinecb(XPRB_FGETS, datafile, 200, "g,", REV, NP);
 fclose(datafile);
        /* Read the production cost data file */
 datafile=fopen(CMAKEFILE,"r");
 for(p=0;p<NP;p++)
  XPRBreadarrlinecb(XPRB_FGETS, datafile, 200, "g,", CMAK[p], NF);
 fclose(datafile);
        /* Read the raw material cost data file */
 datafile=fopen(CBUYFILE,"r");
 XPRBreadarrlinecb(XPRB_FGETS, datafile, 200, "g,", CBUY, NR);
 fclose(datafile);
        /* Read the resource requirement data file */
 datafile=fopen(REQFILE,"r");
 for(p=0;p<NP;p++)
  XPRBreadarrlinecb(XPRB_FGETS, datafile, 200, "g,", REQ[p], NR);
 fclose(datafile);
        /* read the max. sales quantities data file */
 datafile=fopen(MXSELLFILE,"r");
 XPRBreadarrlinecb(XPRB_FGETS, datafile, 200, "g,", MXSELL, NP);
 fclose(datafile);
        /* Read the production capacities data file */
 datafile=fopen(MXMAKEFILE,"r");
 XPRBreadarrlinecb(XPRB_FGETS, datafile, 200, "g,", MXMAKE, NF);
 fclose(datafile);
        /* Calculate the table PROFIT */
 for(p=0;p<NP;p++)
  for(f=0;f<NF;f++)
  {
   PROFIT[p][f] = REV[p] - CMAK[p][f];
   for(r=0;r<NR;r++) PROFIT[p][f] -= (REQ[p][r]*CBUY[r]);
  }
}
/***********************************************************************/
int main(int argc, char **argv)
{
 XPRBprob prob;
 prob=XPRBnewprob("Coco2");     /* Initialize a new problem in BCL */
 readdata();                    /* Data input from file */
 modcoco2(prob);                /* Model and solve the problem */
 return 0;
}
 | 
| /********************************************************
  BCL Example Problems
  ====================
  file xbcoco3.c
  ``````````````
  Coco Problem Phase 3.
  Introduce time periods and inventory.
  (c) 2008-2024 Fair Isaac Corporation
      author: S.Heipcke, Jan. 2000, rev. Mar. 2011
********************************************************/
#include <stdio.h>
#include "xprb.h"
#define NP 2           /* Number of products (p) */
#define NF 2           /* Factories (f) */
#define NR 2           /* Raw materials (r) */
#define NT 4           /* Time periods (t) */
#define REVFILE     XPRBDATAPATH "/coco/revt.dat"
#define CMAKEFILE   XPRBDATAPATH "/coco/cmake.dat"
#define CBUYFILE    XPRBDATAPATH "/coco/cbuyt.dat"
#define REQFILE     XPRBDATAPATH "/coco/req.dat"
#define MXSELLFILE  XPRBDATAPATH "/coco/maxsellt.dat"
#define MXMAKEFILE  XPRBDATAPATH "/coco/mxmake.dat"
#define PSTOCK0FILE XPRBDATAPATH "/coco/pstock0.dat"
#define RSTOCK0FILE XPRBDATAPATH "/coco/rstock0.dat"
/****TABLES****/
double REV[NP][NT];     /* Unit selling price of product p in period t */
double CMAK[NP][NF];    /* Unit cost to make product p at factory f */
double CBUY[NR][NT];    /* Unit cost to buy raw material r in period t */
double REQ[NP][NR];     /* Requirement by unit of prod. p for raw material r */
double MXSELL[NP][NT];  /* Max. amount of p that can be sold in period t */
double MXMAKE[NF];      /* Max. amount factory f can make over all products */
double PSTOCK0[NP][NF]; /* Initial product p stock level at factory f */
double RSTOCK0[NR][NF]; /* Initial raw material r stock level at factory f*/
/****DATA****/
double CPSTOCK = 2.0;   /* Unit cost to store any product p */
double CRSTOCK = 1.0;   /* Unit cost to store any raw material r */
double MXRSTOCK = 300;  /* Max. amount of r that can be stored each f and t */
/***********************************************************************/
void modcoco3(XPRBprob prob)
{
 XPRBvar make[NP][NF][NT], sell[NP][NF][NT], pstock[NP][NF][NT+1],
         buy[NR][NF][NT], rstock[NR][NF][NT+1];
 XPRBctr ctr;
 int p,f,r,t;
/****VARIABLES****/
 for(p=0;p<NP;p++)
  for(f=0;f<NF;f++)
  {
   for(t=0;t<NT;t++)
   {
    make[p][f][t]=XPRBnewvar(prob,XPRB_PL, XPRBnewname("make_p%d_f%d",p+1,f+1),
        0, XPRB_INFINITY);
        /* Amount of prod. p to make at factory f in period t */
    sell[p][f][t]=XPRBnewvar(prob,XPRB_PL, XPRBnewname("sell_p%d_f%d",p+1,f+1),
        0, XPRB_INFINITY);
        /* Amount of prod. p sold from factory f in period t */
   }
   for(t=0;t<NT+1;t++)
    pstock[p][f][t]=XPRBnewvar(prob,XPRB_PL, XPRBnewname("pstock_p%d_f%d",p+1,f+1),
        0, XPRB_INFINITY);
        /* Stock level of prod. p at factory f at start of period t */
  }
 for(r=0;r<NR;r++)
  for(f=0;f<NF;f++)
  {
   for(t=0;t<NT;t++)
    buy[r][f][t]=XPRBnewvar(prob,XPRB_PL, XPRBnewname("buy_r%d_f%d",r+1,f+1),
        0, XPRB_INFINITY);
        /* Amount of raw material r bought for factory f in period t */
   for(t=0;t<NT+1;t++)
    rstock[r][f][t]=XPRBnewvar(prob,XPRB_PL, XPRBnewname("rstock_r%d_f%d",r+1,f+1),
        0, XPRB_INFINITY);
        /* Stock level of raw mat. r at factory f at start of per. t */
  }
/****OBJECTIVE****/
 ctr = XPRBnewctr(prob,"OBJ",XPRB_N);
 for(f=0;f<NF;f++)                     /* Objective: maximize total profit */
 {
  for(p=0;p<NP;p++)
  {
   for(t=0;t<NT;t++)
   {
    XPRBaddterm(ctr, sell[p][f][t], REV[p][t]);
    XPRBaddterm(ctr, make[p][f][t], -1*CMAK[p][f]);
   }
   for(t=1;t<NT+1;t++)
    XPRBaddterm(ctr, pstock[p][f][t], -1*CPSTOCK);
  }
  for(r=0;r<NR;r++)
  {
   for(t=0;t<NT;t++)
    XPRBaddterm(ctr, buy[r][f][t], -1*CBUY[r][t]);
   for(t=1;t<NT+1;t++)
    XPRBaddterm(ctr, rstock[r][f][t], -1*CRSTOCK);
  }
 }
 XPRBsetobj(prob,ctr);                       /* Select objective function */
/****CONSTRAINTS****/
 for(p=0;p<NP;p++)
  for(f=0;f<NF;f++)
   for(t=0;t<NT;t++)
   {
    ctr=XPRBnewctr(prob,"PBal",XPRB_E);      /* Product stock balance */
    XPRBaddterm(ctr, pstock[p][f][t], 1);
    XPRBaddterm(ctr, make[p][f][t], 1);
    XPRBaddterm(ctr, sell[p][f][t], -1);
    XPRBaddterm(ctr, pstock[p][f][t+1], -1);
   }
 for(r=0;r<NR;r++)
  for(f=0;f<NF;f++)
   for(t=0;t<NT;t++)
   {
    ctr=XPRBnewctr(prob,"RBal",XPRB_E);      /* Raw material stock balance */
    XPRBaddterm(ctr, rstock[r][f][t], 1);
    XPRBaddterm(ctr, buy[r][f][t], 1);
    XPRBaddterm(ctr, rstock[r][f][t+1], -1);
    for(p=0;p<NP;p++)
     XPRBaddterm(ctr, make[p][f][t], -1*REQ[p][r]);
   }
 for(p=0;p<NP;p++)
  for(t=0;t<NT;t++)
  {         /* Limit on the amount of product p to be sold */
   ctr=XPRBnewctr(prob,"MxSell",XPRB_L);
   for(f=0;f<NF;f++)
    XPRBaddterm(ctr, sell[p][f][t], 1);
   XPRBaddterm(ctr, NULL, MXSELL[p][t]);
  }
 for(f=0;f<NF;f++)
  for(t=0;t<NT;t++)
  {
   ctr=XPRBnewctr(prob,"MxMake",XPRB_L);     /* Capacity limit at factory f */
   for(p=0;p<NP;p++)
    XPRBaddterm(ctr, make[p][f][t], 1);
   XPRBaddterm(ctr, NULL, MXMAKE[f]);
  }
 for(f=0;f<NF;f++)
  for(t=1;t<NT+1;t++)
  {
   ctr=XPRBnewctr(prob,"MxRStock",XPRB_L);   /* Raw material stock limit */
   for(r=0;r<NR;r++)
    XPRBaddterm(ctr, rstock[r][f][t], 1);
   XPRBaddterm(ctr, NULL, MXRSTOCK);
  }
/****BOUNDS****/
 for(p=0;p<NP;p++)
  for(f=0;f<NF;f++)
   XPRBfixvar(pstock[p][f][0], PSTOCK0[p][f]);    /* Initial product levels */
 for(r=0;r<NR;r++)
  for(f=0;f<NF;f++)
   XPRBfixvar(rstock[r][f][0], RSTOCK0[r][f]);    /* Initial raw mat. levels */
/****SOLVING + OUTPUT****/
 XPRBsetsense(prob,XPRB_MAXIM);              /* Choose sense of optimization */
 XPRBlpoptimize(prob, "");                   /* Solve the LP-problem */
 printf("Objective: %g\n", XPRBgetobjval(prob));      /* Get objective value */
        /* Uncomment to print out the solution values */
/* for(p=0;p<NP;p++)
  for(f=0;f<NF;f++)
  {
   for(t=0;t<NT;t++)
    printf("%s:%g %s:%g  ", XPRBgetvarname(make[p][f][t]),
      XPRBgetsol(make[p][f][t]), XPRBgetvarname(sell[p][f][t]),
      XPRBgetsol(sell[p][f][t]));
   for(t=0;t<NT+1;t++)
    printf("%s:%g ", XPRBgetvarname(pstock[p][f][t]), XPRBgetsol(pstock[p][f][t]));
  }
 printf("\n");
 for(r=0;r<NR;r++)
  for(f=0;f<NF;f++)
  {
   for(t=0;t<NT;t++)
    printf("%s:%g ", XPRBgetvarname(buy[r][f][t]), XPRBgetsol(buy[r][f][t]));
   for(t=0;t<NT+1;t++)
    printf("%s:%g ", XPRBgetvarname(rstock[r][f][t]), XPRBgetsol(rstock[r][f][t]));
  }
 printf("\n");
*/
}
/***********************************************************************/
    /**** Read data from files ****/
void readdata(void)
{
 FILE *datafile;
 int p,r;
        /* Read the revenu data file */
 datafile=fopen(REVFILE,"r");
 for(p=0;p<NP;p++)
  XPRBreadarrlinecb(XPRB_FGETS, datafile, 200, "g,", REV[p], NT);
 fclose(datafile);
        /* Read the production cost data file */
 datafile=fopen(CMAKEFILE,"r");
 for(p=0;p<NP;p++)
  XPRBreadarrlinecb(XPRB_FGETS, datafile, 200, "g,", CMAK[p], NF);
 fclose(datafile);
        /* Read the raw material cost data file */
 datafile=fopen(CBUYFILE,"r");
 for(r=0;r<NR;r++)
  XPRBreadarrlinecb(XPRB_FGETS, datafile, 200, "g,", CBUY[r], NT);
 fclose(datafile);
        /* Read the resource requirement data file */
 datafile=fopen(REQFILE,"r");
 for(p=0;p<NP;p++)
  XPRBreadarrlinecb(XPRB_FGETS, datafile, 200, "g,", REQ[p], NR);
 fclose(datafile);
        /* Read the max. sales quantities data file */
 datafile=fopen(MXSELLFILE,"r");
 for(p=0;p<NP;p++)
  XPRBreadarrlinecb(XPRB_FGETS, datafile, 200, "g,", MXSELL[p], NT);
 fclose(datafile);
        /* Read the production capacities data file */
 datafile=fopen(MXMAKEFILE,"r");
 XPRBreadarrlinecb(XPRB_FGETS, datafile, 200, "g,", MXMAKE, NF);
 fclose(datafile);
        /* Read the product stock data file */
 datafile=fopen(PSTOCK0FILE,"r");
 for(p=0;p<NP;p++)
  XPRBreadarrlinecb(XPRB_FGETS, datafile, 200, "g,", PSTOCK0[p], NF);
 fclose(datafile);
        /* Read the raw material stock data file */
 datafile=fopen(RSTOCK0FILE,"r");
 for(r=0;r<NR;r++)
  XPRBreadarrlinecb(XPRB_FGETS, datafile, 200, "g,", RSTOCK0[r], NF);
 fclose(datafile);
}
/***********************************************************************/
int main(int argc, char **argv)
{
 XPRBprob prob;
 prob=XPRBnewprob("Coco3");   /* Initialize a new problem in BCL */
 readdata();                  /* Data input from file */
 modcoco3(prob);              /* Model and solve the problem */
 return 0;
}
 | 
| /********************************************************
  BCL Example Problems
  ====================
  file xbcoco.c
  `````````````
  Complete Coco Problem.
  Specify phase by PHASE parameter.
  Data input in the model, not via data files.
  (c) 2008-2024 Fair Isaac Corporation
      author: S.Heipcke, Jan. 2000, rev. Mar. 2011
********************************************************/
#include <stdio.h>
#include "xprb.h"
#define PHASE 5
/* Phase = 3: Multi-period parameterised model; mines always open
 * Phase = 4: Mines may open/closed freely; when closed save 20000 per month
 * Phase = 5: Once closed always closed; larger saving */
#define NP 2            /* Number of products (p) */
#define NF 2            /*           factories (f) */
#define NR 2            /*           raw materials (r) */
#define NT 4            /*           time periods (t) */
/****DATA****/
double REV[][NT] =      /* Unit selling price of product p in period t */
        {{400, 380, 405, 350},
         {410, 397, 412, 397}};
double CMAK[][NF] =     /* Unit cost to make product p at factory f */
        {{150, 153},
         { 75,  68}};
double CBUY[][NT] =     /* Unit cost to buy raw material r in period t */
        {{100,  98,  97, 100},
         {200, 195, 198, 200}};
double COPEN[] =        /* Fixed cost of factory f being open for one period */
        {50000, 63000};
double CPSTOCK = 2.0;   /* Unit cost to store any product p */
double CRSTOCK = 1.0;   /* Unit cost to store any raw material r */
double REQ[][NR] =      /* Requirement by unit of prod. p for raw material r */
        {{1.0, 0.5},
         {1.3, 0.4}};
double MXSELL[][NT] =   /* Max. amount of p that can be sold in period t */
        {{650, 600, 500, 400},
         {600, 500, 300, 250}};
double MXMAKE[] =       /* Max. amount factory f can make over all products */
        {400, 500};
double MXRSTOCK = 300;  /* Max. amount of r that can be stored each f and t */
double PSTOCK0[][NF] =  /* Initial product p stock level at factory f */
        {{50, 100},
         {50,  50}};
double RSTOCK0[][NF] =  /* Initial raw material r stock level at factory f*/
        {{100, 150},
         { 50, 100}};
/***********************************************************************/
int main(int argc, char **argv)
{
 XPRBvar make[NP][NF][NT], sell[NP][NF][NT], pstock[NP][NF][NT+1],
       buy[NR][NF][NT], rstock[NR][NF][NT+1], openm[NF][NT];
 XPRBctr ctr;
 int p,f,r,t;
 XPRBprob prob;
 prob=XPRBnewprob("Coco");     /* Initialize a new problem in BCL */
/****VARIABLES****/
 for(p=0;p<NP;p++)
  for(f=0;f<NF;f++)
  {
   for(t=0;t<NT;t++)
   {
    make[p][f][t]=XPRBnewvar(prob,XPRB_PL, XPRBnewname("make_p%d_f%d",p+1,f+1),
        0, XPRB_INFINITY);
        /* Amount of prod. p to make at factory f in period t */
    sell[p][f][t]=XPRBnewvar(prob,XPRB_PL, XPRBnewname("sell_p%d_f%d",p+1,f+1),
        0, XPRB_INFINITY);
        /* Amount of prod. p sold from factory f in period t */
   }
   for(t=0;t<NT+1;t++)
    pstock[p][f][t]=XPRBnewvar(prob,XPRB_PL, XPRBnewname("pstock_p%d_f%d",p+1,f+1),
        0, XPRB_INFINITY);
        /* Stock level of prod. p at factory f at start of period t */
  }
 for(r=0;r<NR;r++)
  for(f=0;f<NF;f++)
  {
   for(t=0;t<NT;t++)
    buy[r][f][t]=XPRBnewvar(prob,XPRB_PL, XPRBnewname("buy_r%d_f%d",r+1,f+1),
        0, XPRB_INFINITY);
        /* Amount of raw material r bought for factory f in period t */
   for(t=0;t<NT+1;t++)
    rstock[r][f][t]=XPRBnewvar(prob,XPRB_PL, XPRBnewname("rstock_r%d_f%d",r+1,f+1),
        0, XPRB_INFINITY);
        /* Stock level of raw mat. r at factory f at start of per. t */
  }
 for(f=0;f<NF;f++)
  for(t=0;t<NT;t++)
   openm[f][t]=XPRBnewvar(prob,XPRB_BV, XPRBnewname("open_f%d",f+1), 0, 1);
        /* 1 if factory f is open in period t, else 0 */
/****OBJECTIVE****/
 ctr = XPRBnewctr(prob,"OBJ",XPRB_N);
 for(f=0;f<NF;f++)                  /* Objective: maximize total profit */
 {
  for(p=0;p<NP;p++)
  {
   for(t=0;t<NT;t++)
   {
    XPRBaddterm(ctr, sell[p][f][t], REV[p][t]);
    XPRBaddterm(ctr, make[p][f][t], -1*CMAK[p][f]);
   }
   for(t=1;t<NT+1;t++)
    XPRBaddterm(ctr, pstock[p][f][t], -1*CPSTOCK);
  }
  if(PHASE==4)
   for(t=0;t<NT;t++)
    XPRBaddterm(ctr, openm[f][t], 20000-COPEN[f]);
  else if(PHASE==5)
   for(t=0;t<NT;t++)
    XPRBaddterm(ctr, openm[f][t], -1*COPEN[f]);
  for(r=0;r<NR;r++)
  {
   for(t=0;t<NT;t++)
    XPRBaddterm(ctr, buy[r][f][t], -1*CBUY[r][t]);
   for(t=1;t<NT+1;t++)
    XPRBaddterm(ctr, rstock[r][f][t], -1*CRSTOCK);
  }
 }
 XPRBsetobj(prob,ctr);                       /* Select objective function */
/****CONSTRAINTS****/
 for(p=0;p<NP;p++)
  for(f=0;f<NF;f++)
   for(t=0;t<NT;t++)
   {
    ctr=XPRBnewctr(prob,"PBal",XPRB_E);      /* Product stock balance */
    XPRBaddterm(ctr, pstock[p][f][t], 1);
    XPRBaddterm(ctr, make[p][f][t], 1);
    XPRBaddterm(ctr, sell[p][f][t], -1);
    XPRBaddterm(ctr, pstock[p][f][t+1], -1);
   }
 for(r=0;r<NR;r++)
  for(f=0;f<NF;f++)
   for(t=0;t<NT;t++)
   {
    ctr=XPRBnewctr(prob,"RBal",XPRB_E);      /* Raw material stock balance */
    XPRBaddterm(ctr, rstock[r][f][t], 1);
    XPRBaddterm(ctr, buy[r][f][t], 1);
    XPRBaddterm(ctr, rstock[r][f][t+1], -1);
    for(p=0;p<NP;p++)
     XPRBaddterm(ctr, make[p][f][t], -1*REQ[p][r]);
   }
 for(p=0;p<NP;p++)
  for(t=0;t<NT;t++)
  {         /* Limit on the amount of product p to be sold */
   ctr=XPRBnewctr(prob,"MxSell",XPRB_L);
   for(f=0;f<NF;f++)
    XPRBaddterm(ctr, sell[p][f][t], 1);
   XPRBaddterm(ctr, NULL, MXSELL[p][t]);
  }
 for(f=0;f<NF;f++)
  for(t=0;t<NT;t++)
  {
   ctr=XPRBnewctr(prob,"MxMake",XPRB_L);     /* Capacity limit at factory f */
   for(p=0;p<NP;p++)
    XPRBaddterm(ctr, make[p][f][t], 1);
   XPRBaddterm(ctr, openm[f][t], -1*MXMAKE[f]);
  }
 for(f=0;f<NF;f++)
  for(t=1;t<NT+1;t++)
  {
   ctr=XPRBnewctr(prob,"MxRStock",XPRB_L);   /* Raw material stock limit */
   for(r=0;r<NR;r++)
    XPRBaddterm(ctr, rstock[r][f][t], 1);
   XPRBaddterm(ctr, NULL, MXRSTOCK);
  }
 if(PHASE==5)
  for(f=0;f<NF;f++)
   for(t=0;t<NT-1;t++)
   {
    ctr=XPRBnewctr(prob,"Closed",XPRB_L);    /* Once closed, always closed */
    XPRBaddterm(ctr, openm[f][t+1], 1);
    XPRBaddterm(ctr, openm[f][t], -1);
   }
/****BOUNDS****/
 for(p=0;p<NP;p++)
  for(f=0;f<NF;f++)
   XPRBfixvar(pstock[p][f][0], PSTOCK0[p][f]);    /* Initial product levels */
 for(r=0;r<NR;r++)
  for(f=0;f<NF;f++)
   XPRBfixvar(rstock[r][f][0], RSTOCK0[r][f]);    /* Initial raw mat. levels */
 if(PHASE<=3)
  for(f=0;f<NF;f++)
   for(t=0;t<NT;t++)
    XPRBfixvar(openm[f][t],1);
/****SOLVING + OUTPUT****/
 XPRBsetsense(prob, XPRB_MAXIM);     /* Choose the sense of the optimization */
 XPRBmipoptimize(prob, "");          /* Solve the MIP-problem */
 printf("Objective: %g\n", XPRBgetobjval(prob));     /* Get objective value */
        /* Uncomment to print out the solution values: */
/* for(p=0;p<NP;p++)
  for(f=0;f<NF;f++)
   for(t=0;t<NT;t++)
    printf("%s:%g %s:%g  ", XPRBgetvarname(make[p][f][t]),
      XPRBgetsol(make[p][f][t]), XPRBgetvarname(sell[p][f][t]),
      XPRBgetsol(sell[p][f][t]));
 printf("\n");
 for(p=0;p<NP;p++)
  for(f=0;f<NF;f++)
   for(t=0;t<NT+1;t++)
    printf("%s:%g ", XPRBgetvarname(pstock[p][f][t]), XPRBgetsol(pstock[p][f][t]));
 printf("\n");
 for(r=0;r<NR;r++)
  for(f=0;f<NF;f++)
  {
   for(t=0;t<NT;t++)
    printf("%s:%g ", XPRBgetvarname(buy[r][f][t]), XPRBgetsol(buy[r][f][t]));
   for(t=0;t<NT+1;t++)
    printf("%s:%g ", XPRBgetvarname(rstock[r][f][t]), XPRBgetsol(rstock[r][f][t]));
  }
 for(f=0;f<NF;f++)
  for(t=0;t<NT;t++)
   printf("%s:%g ", XPRBgetvarname(openm[f][t]), XPRBgetsol(openm[f][t]));
 printf("\n");
*/
 return 0;
}
 |