using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
double[] DualU = new double[] { 0, 440, 430, 430 };
double[] DualV = new double[] { -10, -10 };
double[] Q = new double[] { 200, 200 };
double[] f = new double[] { 2000, 2000 };
double[] Demand = { 0, 20, 20, 20 };
double[] servicetime = { 0, 10, 10, 10 };
double[, ,] time = new double[M, C + 1, C + 1];
double[, ,] ReducedCost = new double[M, C + 1, C + 1];
int[] A = { 0, 10, 100, 50 };
int[] B = { 200, 30, 120, 70 };
for (int m = 0; m < M; ++m)
for (int i = 0; i < DC1; ++i)
for (int j = 0; j < DC1; ++j)
time[m, i, j] = Distance[m, i, j] + servicetime[i];
for (int m = 0; m < M; ++m)
for (int i = 0; i < C+1; ++i)
for (int j = 0; j < C + 1; ++j)
ReducedCost[m, i, j] = Distance[m, i, j] - DualU[i] + Demand[i] * DualV[m];
var sub = new List<Subproblem>();
Subproblem s = new Subproblem();
s.x = new double[DC1, DC1];
for (int m = 0; m < M; ++m)
GRBEnv env = new GRBEnv();
GRBModel model = new GRBModel(env);
model.ModelName = "OLRPTW Subproblem";
GRBVar[,] x = new GRBVar[C + 1, C + 1];
GRBVar[] D = new GRBVar[C + 1];
GRBVar[] U = new GRBVar[C + 1];
for (int i = 0; i < C + 1; ++i)
for (int j = 0; j < C + 1; ++j)
x[i, j] = model.AddVar(0.0, 1.0, 0.0, GRB.BINARY, "x" + i + "," + j);
for (int i = 0; i < C + 1; ++i)
D[i] = model.AddVar(A[i], B[i], 0.0, GRB.CONTINUOUS, "D" + i);
for (int i = 0; i < C + 1; ++i)
U[i] = model.AddVar(Demand[i], Capacity, 0.0, GRB.CONTINUOUS, "U" + i);
for (int i = 0; i < C+1; ++i)
for (int j = 0; j < C+1; ++j)
sumRC += ReducedCost[m, i, j] * x[i, j];
model.SetObjective(sumRC, GRB.MINIMIZE);
for (int i = 1; i < DC1; ++i)
GRBLinExpr sumJ = new GRBLinExpr();
for (int j = 0; j < DC1; ++j)
sumJ.AddTerm(1.0, x[i, j]);
model.AddConstr(sumJ <= 1.0, "C1" + i);
for (int j = 1; j < DC1; ++j)
GRBLinExpr sumI = new GRBLinExpr();
for (int i = 0; i < DC1; ++i)
sumI.AddTerm(1.0, x[i, j]);
model.AddConstr(sumI == 1.0, "C2" + j);
for (int j = 0; j < 1; ++j)
GRBLinExpr sumXij = new GRBLinExpr();
for (int i = 1; i < DC1; ++i)
sumXij.AddTerm(1.0, x[i, j]);
model.AddConstr(sumXij == 0.0, "Cxx" + j);
for (int i = 1; i < DC1; ++i)
for (int j = 1; j < DC1; ++j)
model.AddConstr(U[j] - U[i] + Capacity * x[i, j] <= Capacity - Demand[i], "Cap" + i + j);
for (int i = 1; i < DC1; ++i)
for (int j = 1; j < DC1; ++j)
model.AddConstr(D[i] + time[m, i, j] - D[j] <= 10000 * (1 - x[i, j]), "Time" + i + j);
int status = model.Get(GRB.IntAttr.Status);
if (status == GRB.Status.INF_OR_UNBD ||
status == GRB.Status.INFEASIBLE ||
status == GRB.Status.UNBOUNDED)
Console.WriteLine("The model cannot be solved " +
"because it is infeasible or unbounded");
if (model.Status == GRB.Status.OPTIMAL)
s.ReducedCost = model.ObjVal;
Console.WriteLine("\nDepot " + m + ": ");
Console.WriteLine("\nTotal cost: " + model.ObjVal);
Console.WriteLine("\nRoute:");
for (int i = 0; i < DC1; ++i)
for (int j = 0; j < DC1; ++j)
Console.WriteLine(x[i, j].VarName + " " + x[i, j].X);
double minRC = sub.Min(a => a.ReducedCost);
int minRCIdx = sub.IndexOf(minRC);
Console.WriteLine("\nMinimum reduced cost: " + minRC);
Console.WriteLine("Error code: " + e.ErrorCode + ". " +