/********************************************************
Xpress-BCL C# Example Problems
==============================
file xbcoco2.cs
````````````````
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-2023 Fair Isaac Corporation
authors: S.Heipcke, D.Brett.
********************************************************/
using System;
using System.Text;
using System.IO;
using BCL;
namespace Examples
{
public class TestCoco1
{
const int NP = 2; /* Number of products (p) */
const int NF = 2; /* factories (f) */
const int NR = 2; /* raw materials (r) */
//Define XPRBDATAPATH to wherever you have placed the data folder; here we expect it to be same directory as compiled example.
static string XPRBDATAPATH = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName + "/Data";
static string REVFILE = XPRBDATAPATH + "/coco/rev.dat";
static string CMAKEFILE = XPRBDATAPATH + "/coco/cmake.dat";
static string CBUYFILE = XPRBDATAPATH + "/coco/cbuy.dat";
static string REQFILE = XPRBDATAPATH + "/coco/req.dat";
static string MXSELLFILE = XPRBDATAPATH + "/coco/maxsell.dat";
static string MXMAKEFILE = XPRBDATAPATH + "/coco/mxmake.dat";
/****TABLES****/
double[] REV = new double[NP]; /* Unit selling price of product p */
double[,] CMAK = new double[NP,NF]; /* Unit cost to make product p at factory f */
double[] CBUY = new double[NR]; /* Unit cost to buy raw material r */
double[,] REQ = new double[NP,NR]; /* Requirement by unit of prod. p for raw material r */
double[] MXSELL = new double[NP]; /* Max. amount of p that can be sold */
double[] MXMAKE = new double[NF]; /* Max. amount factory f can make over all products */
double[,] PROFIT = new double[NP,NF]; /* Profit contribution of product p at factory f */
XPRBprob pb = new XPRBprob("Coco2"); /* Initialize a new problem in BCL */
/***********************************************************************/
void modCoco2()
{
XPRBvar[,] make = new XPRBvar[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("make_p" + (p+1) + "f" + (f+1));
/****OBJECTIVE****/
lobj = new XPRBexpr();
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 = new XPRBexpr(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 = new XPRBexpr(0);
for(p=0;p<NP;p++) lc += make[p,f];
pb.newCtr("MxMake", lc <= MXMAKE[f]);
}
/****SOLVING + OUTPUT****/
pb.setSense(BCLconstant.XPRB_MAXIM); /* Choose the sense of the optimization */
pb.lpOptimize(); /* Solve the LP-problem */
System.Console.WriteLine("Objective: " + pb.getObjVal()); /* Get objective value */
for(p=0;p<NP;p++) /* Print the solution values */
for(f=0;f<NF;f++)
System.Console.Write(make[p,f].getName() + ":" + make[p,f].getSol() + " ");
System.Console.WriteLine();
}
/***********************************************************************/
/**** Read data from files ****/
void readData()
{
FileStream file;
StreamReader fileStreamIn;
int p,f,r;
/* Read the revenue data file */
/* Read the demand data file */
file = new FileStream(REVFILE, FileMode.Open, FileAccess.Read);
fileStreamIn = new StreamReader(file);
pb.XPRBreadarrline(fileStreamIn, 200, "{g} , ", out REV, NP);
fileStreamIn.Close();
file.Close();
/* Read the production cost data file */
file = new FileStream(CMAKEFILE, FileMode.Open, FileAccess.Read);
fileStreamIn = new StreamReader(file);
for (p = 0; p < NP; p++)
{
double[] temp = new double[NF];
pb.XPRBreadarrline(fileStreamIn, 200, "{g} , ", out temp, NF);
for(int q=0; q<NF; q++)
CMAK[p,q] = temp[q];
}
fileStreamIn.Close();
file.Close();
/* Read the raw material cost data file */
file = new FileStream(CBUYFILE, FileMode.Open, FileAccess.Read);
fileStreamIn = new StreamReader(file);
pb.XPRBreadarrline(fileStreamIn, 200, "{g} , ", out CBUY, NR);
fileStreamIn.Close();
file.Close();
/* Read the resource requirement data file */
file = new FileStream(REQFILE, FileMode.Open, FileAccess.Read);
fileStreamIn = new StreamReader(file);
for (p = 0; p < NP; p++)
{
double[] temp = new double[NF];
pb.XPRBreadarrline(fileStreamIn, 200, "{g} , ", out temp, NF);
for (int q = 0; q < NF; q++)
REQ[p, q] = temp[q];
}
fileStreamIn.Close();
file.Close();
/* Read the max. sales quantities data file */
file = new FileStream(MXSELLFILE, FileMode.Open, FileAccess.Read);
fileStreamIn = new StreamReader(file);
pb.XPRBreadarrline(fileStreamIn, 200, "{g} , ", out MXSELL, NP);
fileStreamIn.Close();
file.Close();
/* Read the production capacities data file */
file = new FileStream(MXMAKEFILE, FileMode.Open, FileAccess.Read);
fileStreamIn = new StreamReader(file);
pb.XPRBreadarrline(fileStreamIn, 200, "{g} , ", out MXMAKE, NF);
fileStreamIn.Close();
file.Close();
/* 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]);
}
}
/***********************************************************************/
public static void Main()
{
XPRB.init();
TestCoco1 TestInstance = new TestCoco1();
TestInstance.readData(); /* Data input from file */
TestInstance.modCoco2(); /* Model and solve the problem */
return;
}
}
} |
/********************************************************
Xpress-BCL C# Example Problems
==============================
file xbcoco3.cs
````````````````
Coco Problem Phase 3.
Introduce time periods and inventory.
(c) 2008-2023 Fair Isaac Corporation
authors: S.Heipcke, D.Brett.
********************************************************/
using System;
using System.Text;
using System.IO;
using BCL;
namespace Examples
{
public class TestCoco3
{
const int NP = 2; /* Number of products (p) */
const int NF = 2; /* Factories (f) */
const int NR = 2; /* Raw materials (r) */
const int NT = 4; /* Time periods (t) */
//Define XPRBDATAPATH to wherever you have placed the data folder; here we expect it to be same directory as compiled example.
static string XPRBDATAPATH = Directory.GetParent(System.Reflection.Assembly.GetExecutingAssembly().Location).FullName + "/Data";
static string PSTOCK0FILE= XPRBDATAPATH + "/coco/pstock0.dat";
static string RSTOCK0FILE= XPRBDATAPATH + "/coco/rstock0.dat";
static string REVFILE = XPRBDATAPATH + "/coco/revt.dat";
static string CMAKEFILE = XPRBDATAPATH + "/coco/cmake.dat";
static string CBUYFILE = XPRBDATAPATH + "/coco/cbuyt.dat";
static string REQFILE = XPRBDATAPATH + "/coco/req.dat";
static string MXSELLFILE = XPRBDATAPATH + "/coco/maxsellt.dat";
static string MXMAKEFILE = XPRBDATAPATH + "/coco/mxmake.dat";
/****TABLES****/
double[,] REV = new double[NP,NT]; /* Unit selling price of product p in period t */
double[,] CMAK = new double[NP,NF]; /* Unit cost to make product p at factory f */
double[,] CBUY = new double[NR,NT]; /* Unit cost to buy raw material r in period t */
double[,] REQ = new double[NP,NR]; /* Requirement by unit of prod. p for raw material r */
double[,] MXSELL = new double[NP,NT]; /* Max. amount of p that can be sold in period t */
double[] MXMAKE = new double[NF]; /* Max. amount factory f can make over all products */
double[,] PSTOCK0 = new double[NP,NF]; /* Initial product p stock level at factory f */
double[,] RSTOCK0 = new double[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 */
XPRBprob pb = new XPRBprob("Coco3"); /* Initialize a new problem in BCL */
/***********************************************************************/
void modCoco3()
{
XPRBvar[,,] make = new XPRBvar[NP,NF,NT];
XPRBvar[,,] sell = new XPRBvar[NP,NF,NT];
XPRBvar[,,] pstock = new XPRBvar[NP,NF,NT+1];
XPRBvar[,,] buy = new XPRBvar[NR,NF,NT];
XPRBvar[,,] rstock = new XPRBvar[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("make_p" + (p+1) + "_f" + (f+1));
/* Amount of prod. p to make at factory f in period t */
sell[p,f,t] = pb.newVar("sell_p" + (p+1) + "_f" + (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("pstock_p" + (p+1) + "_f" + (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("buy_r" + (r+1) + "_f" + (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("rstock_r" + (r+1) + "_f" + (f+1));
/* Stock level of raw mat. r at factory f at start of per. t */
}
/****OBJECTIVE****/
lobj = new XPRBexpr();
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 = new XPRBexpr(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 = new XPRBexpr(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 = new XPRBexpr(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 = new XPRBexpr(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(BCLconstant.XPRB_MAXIM); /* Choose the sense of the optimization */
pb.lpOptimize(); /* Solve the LP-problem */
System.Console.WriteLine("Objective: " + pb.getObjVal()); /* 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++)
System.Console.Write(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++)
System.Console.Write(pstock[p,f,t].getName() + ":" + pstock[p,f,t].getSol() + " ");
}
System.Console.WriteLine();
for(r=0;r<NR;r++)
for(f=0;f<NF;f++)
{
for(t=0;t<NT;t++)
System.Console.Write(buy[r,f,t].getName() + ":" + buy[r,f,t].getSol() + " ");
for(t=0;t<NT+1;t++)
System.Console.Write(rstock[r,f,t].getName() + ":" + rstock[r,f,t].getSol() + " ");
}
System.Console.WriteLine();
*/
}
/***********************************************************************/
/**** Read data from files ****/
void readData()
{
FileStream file;
StreamReader fileStreamIn;
int p, r;
/* Read the revenu data file */
file = new FileStream(REVFILE, FileMode.Open, FileAccess.Read);
fileStreamIn = new StreamReader(file);
for (p = 0; p < NP; p++)
{
double[] temp = new double[NF];
pb.XPRBreadarrline(fileStreamIn, 200, "{g} , ", out temp, NT);
for (int q = 0; q < NT; q++)
REV[p, q] = temp[q];
}
fileStreamIn.Close();
file.Close();
/* Read the production cost data file */
file = new FileStream(CMAKEFILE, FileMode.Open, FileAccess.Read);
fileStreamIn = new StreamReader(file);
for (p = 0; p < NP; p++)
{
double[] temp = new double[NF];
pb.XPRBreadarrline(fileStreamIn, 200, "{g} , ", out temp, NF);
for (int q = 0; q < NF; q++)
CMAK[p, q] = temp[q];
}
fileStreamIn.Close();
file.Close();
/* Read the raw material cost data file */
file = new FileStream(CBUYFILE, FileMode.Open, FileAccess.Read);
fileStreamIn = new StreamReader(file);
for (r = 0; r < NR; r++)
{
double[] temp = new double[NF];
pb.XPRBreadarrline(fileStreamIn, 200, "{g} , ", out temp, NT);
for (int q = 0; q < NT; q++)
CBUY[r, q] = temp[q];
}
fileStreamIn.Close();
file.Close();
/* Read the resource requirement data file */
file = new FileStream(REQFILE, FileMode.Open, FileAccess.Read);
fileStreamIn = new StreamReader(file);
for (p = 0; p < NP; p++)
{
double[] temp = new double[NF];
pb.XPRBreadarrline(fileStreamIn, 200, "{g} , ", out temp, NR);
for (int q = 0; q < NR; q++)
REQ[p, q] = temp[q];
}
fileStreamIn.Close();
file.Close();
/* Read the max. sales quantities data file */
file = new FileStream(MXSELLFILE, FileMode.Open, FileAccess.Read);
fileStreamIn = new StreamReader(file);
for (p = 0; p < NP; p++)
{
double[] temp = new double[NF];
pb.XPRBreadarrline(fileStreamIn, 200, "{g} , ", out temp, NT);
for (int q = 0; q < NT; q++)
MXSELL[p, q] = temp[q];
}
fileStreamIn.Close();
file.Close();
/* Read the production capacities data file */
file = new FileStream(MXMAKEFILE, FileMode.Open, FileAccess.Read);
fileStreamIn = new StreamReader(file);
pb.XPRBreadarrline(fileStreamIn, 200, "{g} , ", out MXMAKE, NF);
fileStreamIn.Close();
file.Close();
/* Read the product stock data file */
/* Read the max. sales quantities data file */
file = new FileStream(PSTOCK0FILE, FileMode.Open, FileAccess.Read);
fileStreamIn = new StreamReader(file);
for (p = 0; p < NP; p++)
{
double[] temp = new double[NF];
pb.XPRBreadarrline(fileStreamIn, 200, "{g} , ", out temp, NF);
for (int q = 0; q < NF; q++)
PSTOCK0[p, q] = temp[q];
}
fileStreamIn.Close();
file.Close();
/* Read the raw material stock data file */
file = new FileStream(RSTOCK0FILE, FileMode.Open, FileAccess.Read);
fileStreamIn = new StreamReader(file);
for (r = 0; r < NR; r++)
{
double[] temp = new double[NF];
pb.XPRBreadarrline(fileStreamIn, 200, "{g} , ", out temp, NF);
for (int q = 0; q < NF; q++)
RSTOCK0[r, q] = temp[q];
}
fileStreamIn.Close();
file.Close();
}
/***********************************************************************/
public static void Main()
{
XPRB.init();
TestCoco3 TestInstance = new TestCoco3();
TestInstance.readData(); /* Data input from file */
TestInstance.modCoco3(); /* Model and solve the problem */
return;
}
}
} |
/********************************************************
Xpress-BCL C# Example Problems
==============================
file xbcoco.cs
``````````````
Complete Coco Problem.
Specify phase by PHASE parameter.
Data input in the model, not via data files.
(c) 2008-2023 Fair Isaac Corporation
authors: S.Heipcke, D.Brett.
********************************************************/
using System;
using System.Text;
using System.IO;
using BCL;
namespace Examples
{
public class TestIntCocoComplete
{
const int 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 */
const int NP = 2; /* Number of products (p) */
const int NF = 2; /* factories (f) */
const int NR = 2; /* raw materials (r) */
const int NT = 4; /* time periods (t) */
/****DATA****/
double[,] REV = /* Unit selling price of product p in period t */
{{400, 380, 405, 350},
{410, 397, 412, 397}};
double[,] CMAK = /* Unit cost to make product p at factory f */
{{150, 153},
{ 75, 68}};
double[,] CBUY = /* 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 = /* Requirement by unit of prod. p for raw material r */
{{1.0, 0.5},
{1.3, 0.4}};
double[,] MXSELL = /* 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 = /* Initial product p stock level at factory f */
{{50, 100},
{50, 50}};
double[,] RSTOCK0 = /* Initial raw material r stock level at factory f*/
{{100, 150},
{ 50, 100}};
/***********************************************************************/
public static void Main()
{
XPRB.init();
XPRBvar[, ,] make = new XPRBvar[NP, NF, NT];
XPRBvar[, ,] sell = new XPRBvar[NP, NF, NT];
XPRBvar[, ,] pstock = new XPRBvar[NP, NF, NT + 1];
XPRBvar[, ,] buy = new XPRBvar[NR, NF, NT];
XPRBvar[, ,] rstock = new XPRBvar[NR, NF, NT + 1];
XPRBvar[,] openm = new XPRBvar[NF, NT];
XPRBexpr lobj, lc;
int p, f, r, t;
XPRBprob pb = new XPRBprob("Coco"); /* Initialize a new problem in BCL */
TestIntCocoComplete TestInstance = new TestIntCocoComplete();
/****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("make_p" + (p+1) + "_f" + (f+1));
/* Amount of prod. p to make at factory f in period t */
sell[p, f, t] = pb.newVar("sell_p" + (p + 1) + "_f" + (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("pstock_p" + (p+1) + "_f" + (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("buy_r" + (r+1) + "_f" + (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("rstock_r" + (r+1) + "_f" + (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("open_f" + (f+1), BCLconstant.XPRB_BV);
/* 1 if factory f is open in period t, else 0 */
/****OBJECTIVE****/
lobj = new XPRBexpr();
for (f = 0; f < NF; f++) /* Objective: maximize total profit */
{
for (p = 0; p < NP; p++)
{
for (t = 0; t < NT; t++)
lobj += TestInstance.REV[p,t] * sell[p,f,t] - TestInstance.CMAK[p,f] * make[p,f,t];
for (t = 1; t < NT + 1; t++) lobj -= TestInstance.CPSTOCK * pstock[p,f,t];
}
if (PHASE == 4)
for (t = 0; t < NT; t++) lobj += (20000 - TestInstance.COPEN[f]) * openm[f,t];
else if (PHASE == 5)
for (t = 0; t < NT; t++) lobj -= TestInstance.COPEN[f] * openm[f,t];
for (r = 0; r < NR; r++)
{
for (t = 0; t < NT; t++) lobj -= TestInstance.CBUY[r,t] * buy[r,f,t];
for (t = 1; t < NT + 1; t++) lobj -= TestInstance.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 = new XPRBexpr(0.0);
for (p = 0; p < NP; p++) lc += TestInstance.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 = new XPRBexpr(0.0);
for (f = 0; f < NF; f++) lc += sell[p,f,t];
pb.newCtr("MxSell", lc <= TestInstance.MXSELL[p,t]);
}
for (f = 0; f < NF; f++)
for (t = 0; t < NT; t++)
{ /* Capacity limit at factory f */
lc = new XPRBexpr(0.0);
for (p = 0; p < NP; p++) lc += make[p, f, t];
pb.newCtr("MxMake", lc <= TestInstance.MXMAKE[f] * openm[f,t]);
}
for (f = 0; f < NF; f++)
for (t = 1; t < NT + 1; t++)
{ /* Raw material stock limit */
lc = new XPRBexpr(0.0);
for (r = 0; r < NR; r++) lc += rstock[r, f, t];
pb.newCtr("MxRStock", lc <= TestInstance.MXRSTOCK);
}
if (PHASE == 5)
for (f = 0; f < NF; f++)
for (t = 0; t < NT - 1; t++) /* Once closed, always closed */
pb.newCtr("Closed", new XPRBexpr(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(TestInstance.PSTOCK0[p, f]); /* Initial product levels */
for (r = 0; r < NR; r++)
for (f = 0; f < NF; f++)
rstock[r, f, 0].fix(TestInstance.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(BCLconstant.XPRB_MAXIM); /* Choose the sense of the optimization */
pb.mipOptimize(); /* Solve the MIP-problem */
System.Console.WriteLine("Objective: " + pb.getObjVal()); /* 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;
}
}
} |