Professional Documents
Culture Documents
// This is the code for Single Allocation Hub and Spoke Network Design for the model
described in:
// Pirkul, H., Schilling, D.A. 1998. An efficient procedure for designing single
allocation hub
// and spoke systems. Management Science, 44(1), 235-242.
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include<fstream>
#include<iosfwd>
#include<string>
#include <deque>
#include <sstream>
#include <time.h>
#include <stdlib.h>
#include <ilcplex/ilocplex.h>
#include <ilconcert/ilosys.h>
ILOSTLBEGIN
if (!datafile)
{
cerr << "ERROR: could not open file " << data_filename << " for
reading" << endl;
cerr << "usage: " << argv[0] << " <datafile>" << endl;
throw(-1);
}
datafile >> cost >> haultime >> dist >> TC;
N = 20;
cout<<"Number of nodes = "<<N<<endl;
cout<<"Fleet size = "<<T<<endl;
T=6; //number of trucks (fleet size)
ofstream fout;
fout.open("Final Project.txt");
}
}
//=======================================================================
fout<<"Number of nodes = "<<N<<endl;
//Declarations
made=================================================================================
//IloModel model(env);
cout<<"-1"<<endl;
ObjP+=cost[i][j][k]*x[i][j][k];
}
}
}
modelP.add(IloMinimize(env, ObjP));
cplexP.solve();
//Constraint 1: pickups
for(int j=N/2;j<N; j++)
{
IloExpr SumP(env);
for(int i=0;i<N/2;i++)
{
for(int k=0;k<T;k++)
{
SumP+ = x[i][j][k];
}
}
modelP.add(SumP==1);
SumP.end();
}
cout<<"-0.5"<<endl;
//Constraint 2: deliveries
for(int i=0;i<N/2;i++)
{
IloExpr SumP(env);
for(int j=N/2;j<N; j++)
{
for(int k=0;k<T;k++)
{
SumP+ = x[i][j][k];
}
}
modelP.add(SumP==1);
SumP.end();
}
cout<<"1"<<endl;
for(int k=0;k<T;k++)
{
IloExpr SumL(env);
for(int i=0; i<N/2; i++)
{
for(int j=N/2; j<N; j++)
{
SumL+= haultime[i][j][k]*x[i][j][k];
}
}
modelP.add(SumL<=TC[k]);
SumL.end();
}
cout<<"1.5"<<endl;
//==================================================================================JU
NK==============================================================
//PR
IloExpr ObjPR (env);
for(int k=0; k<T; k++)
{
IloExpr SumT(env);
for(int i=0;i<N/2;i++)
{
for(int j=N/2; j<N; j++)
{
SumT+= haultime[i][j][k]*x[i][j][k];
}
}
ObjPR+=lambda[k]*(SumT-TC[k]);
}
for (int i=0;i<N;i++)
{
for (int j=0;j<N;j++)
{
for (int k=0;k<N;k++)
{
ObjPR+=cost[i][j][k]*x[i][j][k];
}
}
}
modelPR.add(IloMinimize(env, ObjPR));
cplexPR.solve();
//====================================================================================
DONE TILL HERE=========================================
//PL
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
for (int k=0;k<N;k++)
{
IloExpr SumX(env);
for(int m=0;m<N;m++)
{
SumX+=x[i][j][k][m];
}
//model.add(SumX==z[i][k]);
Obj2=Obj2+(z[i][k]-SumX)*betav[i][j][k];
SumX.end();
}
}
}
cout<<"2"<<endl;
}
model2.add(sumkm==1);
sumkm.end();
}
}
IloModel model3(env);
IloExpr TotObj(env);
TotObj=Obj1+Obj2;
//====================================================================================
=============================================
//PF
IloExpr ObjPF(env);
for(int k=0;k<T;k++)
{
for(int p=0;p<N;p++)
{
ObjPF=ObjPF+(z[i][k]-SumX)*betav[i][j][k];
}
}
cout<<"2"<<endl;
}
model2.add(sumkm==1);
sumkm.end();
}
}
IloModel model3(env);
IloExpr TotObj(env);
TotObj=Obj1+Obj2;
//====================================================================================
===============================================
cout<<"2.5"<<endl;
model1.add(IloMinimize(env, Obj1));
cplex1.solve();
model2.add(IloMinimize(env, Obj2));
cplex2.solve();
//float v= cplex.getObjValue();
for (int i=0;i<N;i++)
{
for (int
j=0;j<N;j++)
{z_val[i][j] = cplex1.getValue(z[i][j]);
for
(int k=0;k<N;k++)
{
x_val[i][j][k][m]=cplex2.getValue(x[i][j][k][m]);
cout<<x_val[i][j][k][m];
}
}
}
}
//IloCplex cplex(model);
//IloCplex cplex1(Model1);
//dont be fooled this part can be done away with
float d=1;
float Z=
//while loop
while(q<50)
{
cout<<"UB"<<UB<<endl;
cout<<"LB"<<LB<<endl;
tk=d*(Z-cplex1.getValue()-
q++;
}//ends here
//=============================================================================
=
cout<<"Last"<<LB<<endl;
//c=cplex1.getValue(MObj);
for (int i=0; i<N; i++)
{
for (int j=0;j<N;j++)
{
alphav[i]=cplex1.getValue(alpha[i]);
for(int k=0;k<N;k++)
{
betav[i][j][k]=cplex1.getValue(beta[i][j][k]);
gammav[i][j][k]=cplex1.getValue(gamma[i][j][k]);
}
}
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++
model1.end();
model2.end();
if(LB<Zlr)
{
LB=Zlr;
}
if(UB>Z)
{
UB=Z;
}
// Print results
//model.end();
env.end();
A SECOND VERSION
// This is the code for Single Allocation Hub and Spoke Network Design for the model
described in:
// Pirkul, H., Schilling, D.A. 1998. An efficient procedure for designing single
allocation hub
// and spoke systems. Management Science, 44(1), 235-242.
#include<stdio.h>
#include<conio.h>
#include<iostream>
#include<fstream>
#include<iosfwd>
#include<string>
#include <deque>
#include <sstream>
#include <time.h>
#include <stdlib.h>
#include <ilcplex/ilocplex.h>
#include <ilconcert/ilosys.h>
ILOSTLBEGIN
int T;
try
{
///////// DATA FILE READING //////////
if (!datafile)
{
cerr << "ERROR: could not open file " << data_filename << " for
reading" << endl;
cerr << "usage: " << argv[0] << " <datafile>" << endl;
throw(-1);
}
N = 20;
cout<<"Number of nodes = "<<N<<endl;
cout<<"Fleet size = "<<T<<endl;
IloNumArray TC(env,100); //in case infinite values
datafile.close();
ofstream fout;
fout.open("Final Project.txt");
//=================Declare Variables===============================
typedef IloArray<IloBoolVarArray> array2d;//Creating a 2d array of x
variables
typedef IloArray<array2d> array3d;//Creating a 3d array of x variables
typedef IloArray<array3d> array4d;//Creating a 4d array of x variables
array3d x(env, N);//xijkm
}
}
IloModel modelP(env);
IloModel modelPL(env);
IloModel modelPF(env);
IloModel GBPP(env);
IloCplex cplexP(modelP);
IloCplex cplexPL(modelPL);
IloCplex cplexPF(modelPF);
IloCplex CGBPP(GBPP);
//=======================================================================
fout<<"Number of nodes = "<<N<<endl;
for (int j=0;j<N;j++)
{
x[j]=array2d(env, N);
xv[j]=arr2d(env, N);
for (int k=0;k<N;k++)
{
x[j][k]=IloBoolVarArray(env, N);
xv[j][k]=IloBoolArray(env, N);
}
}
//Declarations
made=================================================================================
ObjP+=dist[i][j]*x[i][j][k]*cf[k];
}
}
}
modelP.add(IloMinimize(env, ObjP));
//cplexP.solve();
//Constraint 1: pickups
for(int j=N/2;j<N; j++)
{
IloExpr SumP(env);
for(int i=0;i<N/2;i++)
{
for(int k=0;k<T;k++)
{
SumP+ = x[i][j][k];
}
}
modelP.add(SumP==1);
SumP.end();
}
//Constraint 2: deliveries
for(int i=0;i<N/2;i++)
{
IloExpr SumP(env);
for(int j=N/2;j<N; j++)
{
for(int k=0;k<T;k++)
{
SumP+ = x[i][j][k];
}
}
modelP.add(SumP==1);
SumP.end();
}
for(int k=0;k<T;k++)
{
IloExpr SumL(env);
for(int i=0; i<N/2; i++)
{
for(int j=N/2; j<N; j++)
{
SumL+= haultime[i][j]*x[i][j][k];
}
}
modelP.add(SumL<=TC[k]);
SumL.end();
}//=====================================
cplexP.solve();
//cout<<"1.5"<<endl;
//==================================================================================JU
NK==============================================================
//PL
Array2d y(env,N);
arr2d yv(env, N);
for (int i=0,; i<N; i)
{
y[i]=IloBoolVarArray(env,N);
yv[i]=IloBoolArray(env,N);
}
ObjPL+=dist[i][j]*cf[k]*x[i][j][k];
}
}
}*/
modelPL.add(IloMinimize(env, ObjPL));
//Constraint 1
for(int k=0;k<T;k++)
{
IloExpr SumL(env);
for(int i=0; i<N/2; i++)
{
for(int j=N/2; j<N; j++)
{
SumL+= haultime[i][j]*x[i][j][k];
}
}
modelP.add(SumL<=TC[k]);
SumL.end();
}
cplexPL.solve();
//====================================================================================
======
//PF
for(int i=0;i<N;i++)
{
for(int j=0;j<N;j++)
{
for (int k=0;k<N;k++)
{
IloExpr SumX(env);
for(int m=0;m<N;m++)
{
SumX+=x[i][j][k][m];
}
//model.add(SumX==z[i][k]);
Obj2=Obj2+(z[i][k]-SumX)*betav[i][j][k];
SumX.end();
}
}
}
cout<<"2"<<endl;
}
model2.add(sumkm==1);
sumkm.end();
}
}
IloModel model3(env);
IloExpr TotObj(env);
TotObj=Obj1+Obj2;
//====================================================================================
=============================================
//GBPP
IloBoolVarArray a(env,T);
IloBoolArray av(env,T);
array2d z(env,T);
arr2d zv(env,T);
GBPP.add(IloMinimize(env, ObjGBPP));
for(int k=0;k<N;k++)
{
IloExpr SumX(env);
for (int p=0;p<N/2;p++) //p denotes D-P pair
{
SumX+= z[k][p];
}
GBPP.add(SumX==1);
SumX.end();
}
IloNumArray hault(env,N/2);
//Constraint 2: Time capacity
for (int k=0; k<T; k++)
{
IloExpr SumH(env);
for( int p=0;p<N/2;p++)
{
SumH+= hault[p]*z[k][p];
}
GBPP.add(SumH<=TC[k]*y[k]);
SumH.end();
}
//float v= cplex.getObjValue();
for (int i=0;i<N;i++)
{
for (int
j=0;j<N;j++)
{z_val[i][j] = cplex1.getValue(z[i][j]);
for
(int k=0;k<N;k++)
{
x_val[i][j][k][m]=cplex2.getValue(x[i][j][k][m]);
cout<<x_val[i][j][k][m];
}
}
}
}
//IloCplex cplex(model);
//IloCplex cplex1(Model1);
//dont be fooled this part can be done away with
float d=1;
float Z=
//while loop
while(q<50)
{
cout<<"UB"<<UB<<endl;
cout<<"LB"<<LB<<endl;
tk=d*(Z-cplex1.getValue()-
q++;
}//ends here
//=============================================================================
=
cout<<"Last"<<LB<<endl;
//c=cplex1.getValue(MObj);
for (int i=0; i<N; i++)
{
for (int j=0;j<N;j++)
{
alphav[i]=cplex1.getValue(alpha[i]);
for(int k=0;k<N;k++)
{
betav[i][j][k]=cplex1.getValue(beta[i][j][k]);
gammav[i][j][k]=cplex1.getValue(gamma[i][j][k]);
}
}
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++
model1.end();
model2.end();
if(UB>Z)
{
UB=Z;
}
// Print results
//model.end();
env.end();