/********************************************************
Xpress-BCL C++ Example Problems
===============================
file xbcoco2.cxx
`````````````````
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 <iostream>
#include <cstdio>
#include "xprb_cpp.h"
using namespace std;
using namespace ::dashoptimization;
#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 &pb)
{
XPRBvar make[NP][NF];
XPRBexpr lobj, lc;
int p,f;
/****VARIABLES****/
for(p=0;p<NP;p++) /* Amount of prod. p to make at factory f */
for(f=0;f<NF;f++)
make[p][f] = pb.newVar(XPRBnewname("make_p%df%d",p+1,f+1));
/****OBJECTIVE****/
for(p=0;p<NP;p++) /* Objective: maximize total profit */
for(f=0;f<NF;f++) lobj += PROFIT[p][f]* make[p][f];
pb.setObj(pb.newCtr("OBJ",lobj));
/****CONSTRAINTS****/
for(p=0;p<NP;p++) /* Limit on the amount of product p to be sold */
{
lc=0;
for(f=0;f<NF;f++) lc += make[p][f];
pb.newCtr("MxSell", lc <= MXSELL[p]);
}
for(f=0;f<NF;f++) /* Capacity limit at factory f */
{
lc=0;
for(p=0;p<NP;p++) lc += make[p][f];
pb.newCtr("MxMake", lc <= MXMAKE[f]);
}
/****SOLVING + OUTPUT****/
pb.setSense(XPRB_MAXIM); /* Choose the sense of the optimization */
pb.lpOptimize(""); /* Solve the LP-problem */
cout << "Objective: " << pb.getObjVal() << endl; /* Get objective value */
for(p=0;p<NP;p++) /* Print the solution values */
for(f=0;f<NF;f++)
cout << make[p][f].getName() << ":" << make[p][f].getSol() << " ";
cout << endl;
}
/***********************************************************************/
/**** Read data from files ****/
void readData()
{
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 pb("Coco2"); /* Initialize a new problem in BCL */
readData(); /* Data input from file */
modCoco2(pb); /* Model and solve the problem */
return 0;
}
|
/********************************************************
Xpress-BCL C++ Example Problems
===============================
file xbcoco3.cxx
`````````````````
Coco Problem Phase 3.
Introduce time periods and inventory.
(c) 2008-2024 Fair Isaac Corporation
author: S.Heipcke, Jan. 2000, rev. Mar. 2011
********************************************************/
#include <iostream>
#include <cstdio>
#include "xprb_cpp.h"
using namespace std;
using namespace ::dashoptimization;
#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 &pb)
{
XPRBvar make[NP][NF][NT], sell[NP][NF][NT], pstock[NP][NF][NT+1],
buy[NR][NF][NT], rstock[NR][NF][NT+1];
XPRBexpr lobj, lc;
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] = pb.newVar(XPRBnewname("make_p%d_f%d",p+1,f+1));
/* Amount of prod. p to make at factory f in period t */
sell[p][f][t] = pb.newVar(XPRBnewname("sell_p%d_f%d",p+1,f+1));
/* Amount of prod. p sold from factory f in period t */
}
for(t=0;t<NT+1;t++)
pstock[p][f][t] = pb.newVar(XPRBnewname("pstock_p%d_f%d",p+1,f+1));
/* 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] = pb.newVar(XPRBnewname("buy_r%d_f%d",r+1,f+1));
/* Amount of raw material r bought for factory f in period t */
for(t=0;t<NT+1;t++)
rstock[r][f][t] = pb.newVar(XPRBnewname("rstock_r%d_f%d",r+1,f+1));
/* Stock level of raw mat. r at factory f at start of per. t */
}
/****OBJECTIVE****/
for(f=0;f<NF;f++) /* Objective: maximize total profit */
{
for(p=0;p<NP;p++)
{
for(t=0;t<NT;t++)
lobj += REV[p][t]*sell[p][f][t] - CMAK[p][f]*make[p][f][t];
for(t=1;t<NT+1;t++) lobj -= CPSTOCK*pstock[p][f][t];
}
for(r=0;r<NR;r++)
{
for(t=0;t<NT;t++) lobj -= CBUY[r][t]*buy[r][f][t];
for(t=1;t<NT+1;t++) lobj -= CRSTOCK*rstock[r][f][t];
}
}
pb.setObj(pb.newCtr("OBJ",lobj)); /* Set objective function */
/****CONSTRAINTS****/
for(p=0;p<NP;p++) /* Product stock balance */
for(f=0;f<NF;f++)
for(t=0;t<NT;t++)
pb.newCtr("PBal",
pstock[p][f][t]+make[p][f][t] == sell[p][f][t]+pstock[p][f][t+1] );
for(r=0;r<NR;r++) /* Raw material stock balance */
for(f=0;f<NF;f++)
for(t=0;t<NT;t++)
{
lc=0;
for(p=0;p<NP;p++) lc += REQ[p][r]*make[p][f][t];
pb.newCtr("RBal", rstock[r][f][t]+buy[r][f][t] == lc+rstock[r][f][t+1]);
}
for(p=0;p<NP;p++)
for(t=0;t<NT;t++)
{ /* Limit on the amount of product p to be sold */
lc=0;
for(f=0;f<NF;f++) lc += sell[p][f][t];
pb.newCtr("MxSell", lc <= MXSELL[p][t]);
}
for(f=0;f<NF;f++)
for(t=0;t<NT;t++)
{ /* Capacity limit at factory f */
lc=0;
for(p=0;p<NP;p++) lc += make[p][f][t];
pb.newCtr("MxMake", lc <= MXMAKE[f]);
}
for(f=0;f<NF;f++)
for(t=1;t<NT+1;t++)
{ /* Raw material stock limit */
lc=0;
for(r=0;r<NR;r++) lc += rstock[r][f][t];
pb.newCtr("MxRStock", lc <= MXRSTOCK);
}
/****BOUNDS****/
for(p=0;p<NP;p++)
for(f=0;f<NF;f++)
pstock[p][f][0].fix(PSTOCK0[p][f]); /* Initial product levels */
for(r=0;r<NR;r++)
for(f=0;f<NF;f++)
rstock[r][f][0].fix(RSTOCK0[r][f]); /* Initial raw mat. levels */
/****SOLVING + OUTPUT****/
pb.setSense(XPRB_MAXIM); /* Choose the sense of the optimization */
pb.lpOptimize(""); /* Solve the LP-problem */
cout << "Objective: " << pb.getObjVal() << endl; /* 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++)
cout << make[p][f][t].getName() << ":" << make[p][f][t].getSol() << " " <<
sell[p][f][t].getName() << ":" << sell[p][f][t].getSol()) << " ";
for(t=0;t<NT+1;t++)
cout << pstock[p][f][t].getName() << ":" << pstock[p][f][t].getSol() << " ";
}
cout << endl;
for(r=0;r<NR;r++)
for(f=0;f<NF;f++)
{
for(t=0;t<NT;t++)
cout << buy[r][f][t].getName() << ":" << buy[r][f][t].getSol() << " ";
for(t=0;t<NT+1;t++)
cout << rstock[r][f][t].getName() << ":" << rstock[r][f][t].getSol() << " ";
}
cout << endl;
*/
}
/***********************************************************************/
/**** Read data from files ****/
void readData()
{
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 pb("Coco3"); /* Initialize a new problem in BCL */
readData(); /* Data input from file */
modCoco3(pb); /* Model and solve the problem */
return 0;
}
|
/********************************************************
Xpress-BCL C++ Example Problems
===============================
file xbcoco.cxx
```````````````
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 <iostream>
#include "xprb_cpp.h"
using namespace std;
using namespace ::dashoptimization;
#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];
XPRBexpr lobj, lc;
int p,f,r,t;
XPRBprob pb("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] = pb.newVar(XPRBnewname("make_p%d_f%d",p+1,f+1));
/* Amount of prod. p to make at factory f in period t */
sell[p][f][t] = pb.newVar(XPRBnewname("sell_p%d_f%d",p+1,f+1));
/* Amount of prod. p sold from factory f in period t */
}
for(t=0;t<NT+1;t++)
pstock[p][f][t] = pb.newVar(XPRBnewname("pstock_p%d_f%d",p+1,f+1));
/* 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] = pb.newVar(XPRBnewname("buy_r%d_f%d",r+1,f+1));
/* Amount of raw material r bought for factory f in period t */
for(t=0;t<NT+1;t++)
rstock[r][f][t] = pb.newVar(XPRBnewname("rstock_r%d_f%d",r+1,f+1));
/* 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] = pb.newVar(XPRBnewname("open_f%d",f+1), XPRB_BV);
/* 1 if factory f is open in period t, else 0 */
/****OBJECTIVE****/
for(f=0;f<NF;f++) /* Objective: maximize total profit */
{
for(p=0;p<NP;p++)
{
for(t=0;t<NT;t++)
lobj += REV[p][t]*sell[p][f][t] - CMAK[p][f]*make[p][f][t];
for(t=1;t<NT+1;t++) lobj -= CPSTOCK*pstock[p][f][t];
}
if(PHASE==4)
for(t=0;t<NT;t++) lobj += (20000-COPEN[f])*openm[f][t];
else if(PHASE==5)
for(t=0;t<NT;t++) lobj -= COPEN[f]*openm[f][t];
for(r=0;r<NR;r++)
{
for(t=0;t<NT;t++) lobj -= CBUY[r][t]*buy[r][f][t];
for(t=1;t<NT+1;t++) lobj -= CRSTOCK*rstock[r][f][t];
}
}
pb.setObj(pb.newCtr("OBJ",lobj)); /* Set objective function */
/****CONSTRAINTS****/
for(p=0;p<NP;p++) /* Product stock balance */
for(f=0;f<NF;f++)
for(t=0;t<NT;t++)
pb.newCtr("PBal",
pstock[p][f][t]+make[p][f][t] == sell[p][f][t]+pstock[p][f][t+1] );
for(r=0;r<NR;r++) /* Raw material stock balance */
for(f=0;f<NF;f++)
for(t=0;t<NT;t++)
{
lc=0;
for(p=0;p<NP;p++) lc += REQ[p][r]*make[p][f][t];
pb.newCtr("RBal", rstock[r][f][t]+buy[r][f][t] == lc+rstock[r][f][t+1]);
}
for(p=0;p<NP;p++)
for(t=0;t<NT;t++)
{ /* Limit on the amount of product p to be sold */
lc=0;
for(f=0;f<NF;f++) lc += sell[p][f][t];
pb.newCtr("MxSell", lc <= MXSELL[p][t]);
}
for(f=0;f<NF;f++)
for(t=0;t<NT;t++)
{ /* Capacity limit at factory f */
lc=0;
for(p=0;p<NP;p++) lc += make[p][f][t];
pb.newCtr("MxMake", lc <= MXMAKE[f]*openm[f][t]);
}
for(f=0;f<NF;f++)
for(t=1;t<NT+1;t++)
{ /* Raw material stock limit */
lc=0;
for(r=0;r<NR;r++) lc += rstock[r][f][t];
pb.newCtr("MxRStock", lc <= MXRSTOCK);
}
if(PHASE==5)
for(f=0;f<NF;f++)
for(t=0;t<NT-1;t++) /* Once closed, always closed */
pb.newCtr("Closed", openm[f][t+1] <= openm[f][t]);
/****BOUNDS****/
for(p=0;p<NP;p++)
for(f=0;f<NF;f++)
pstock[p][f][0].fix(PSTOCK0[p][f]); /* Initial product levels */
for(r=0;r<NR;r++)
for(f=0;f<NF;f++)
rstock[r][f][0].fix(RSTOCK0[r][f]); /* Initial raw mat. levels */
if(PHASE<=3)
for(f=0;f<NF;f++)
for(t=0;t<NT;t++)
openm[f][t].fix(1);
/****SOLVING + OUTPUT****/
pb.setSense(XPRB_MAXIM); /* Choose the sense of the optimization */
pb.mipOptimize(""); /* Solve the MIP-problem */
cout << "Objective: " << pb.getObjVal() << endl; /* 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++)
cout << make[p][f][t].getName() << ":" << make[p][f][t].getSol() << " " <<
sell[p][f][t].getName() << ":" << sell[p][f][t].getSol()) << " ";
cout << endl;
for(p=0;p<NP;p++)
for(f=0;f<NF;f++)
for(t=0;t<NT+1;t++)
cout << pstock[p][f][t].getName() << ":" << pstock[p][f][t].getSol() << " ";
cout << endl;
for(r=0;r<NR;r++)
for(f=0;f<NF;f++)
{
for(t=0;t<NT;t++)
cout << buy[r][f][t].getName() << ":" << buy[r][f][t].getSol() << " ";
for(t=0;t<NT+1;t++)
cout << rstock[r][f][t].getName() << ":" << rstock[r][f][t].getSol() << " ";
}
for(f=0;f<NF;f++)
for(t=0;t<NT;t++)
cout << openm[f][t].getName() << ":" << openm[f][t].getSol() << " ";
cout << endl;
*/
return 0;
}
|