Reputation: 1
We are trying to solve an optimization problem related to the Hub Location Routing Problem with IBM ILOG CPLEX Optimization Studio 22.1.1.
The OPL project configuration is simply Project -> (run configuration) -> configuration(default) -> CSAHLRPSTW3.mod CSAHLRPSTW3.dat. When I run the run configuration, I get an error that "run configuration 'configuration' is invalid."
I also ran "oplrun CSAHLRPSTW3.mod CSAHLRPSTW3.dat" at the command prompt and got an error "Infeasibility row 'ct5(1)': 0 = 1". It seems that constraint expression (5) is wrong. If I comment out (5), constraint expression (8) becomes Infeasibility row 'ct8(1)(1)': 0 >= 8.
I asked ChatGPT-4o and Claude 3.5 Sonnet, but they could not find the cause of the problem, so I would like to know the cause of the error and how to solve it.
Below are the model and data files.
/*********************************************
* OPL 22.1.1.0 Model
* Author:
* Creation Date: 2025/01/05 at 1:54:46
CSAHLRPSTW3.mod
*********************************************/
// Data section
int n = ...; // number of nodes from node.dat
range N = 1..n;
range C = N; // set of customers (non-hub nodes)
range H = N; // set of potential hubs
// Data reading from external files
tuple Coordinate {
float x;
float y;
}
Coordinate coordinates[N] = ...;
float d[N][N] = ...; // demand matrix
float F[N] = ...; // fixed costs for hubs
float Qh[N] = ...; // hub capacities
int K = ...; // number of vehicles
float t[N][N] = ...; // travel times
tuple TimeWindow {
float start;
float end;
}
TimeWindow timewindows[N] = ...;
// Constants
float Qv = 1100; // vehicle capacity
float M = 1000000; // big M
float alpha = 0.004; // unit inter-hub transportation cost
float beta = 1.0; // unit local delivery cost
float zeta = 1.0; // early arrival penalty coefficient
float gamma = 2.0; // late arrival penalty coefficient
// Calculate distances between nodes
float c[i in N][j in N] = sqrt(pow(coordinates[i].x - coordinates[j].x, 2) +
pow(coordinates[i].y - coordinates[j].y, 2));
// Decision Variables
dvar boolean x[N][N][H]; // routing variable
dvar boolean y[H]; // hub location variable
dvar float+ z[C][C][H][H]; // flow variable
dvar float+ u[N][H]; // pickup amount
dvar float+ v[N][H]; // delivery amount
dvar float+ s[N]; // service start time
dvar float+ P[N]; // time window penalty
dvar float+ visitOrder[i in N]; // exclude sub-tour
// Rest of the model remains the same...
// [Previous constraints and objective function code goes here]
// Optimization Model
minimize
beta * sum(i in N, j in N, m in H) c[i][j] * x[i][j][m] +
sum(m in H) F[m] * y[m] +
alpha * sum(m in H, n in H, i in C, j in C) d[i][j] * z[i][j][m][n] * c[m][n] +
sum(i in N) P[i];
subject to {
//self roop protection
forall(i in N, m in H)
ct0:x[i][i][m] == 0;
//return to the hubs
forall(m in H)
ct1:sum(i in N: i != m) x[i][m][m] == sum(j in N: j != m) x[m][j][m];
// Constraint (2): All demand must be routed through hubs
forall(i in C, j in C)
ct2:sum(m in H, n in H) z[i][j][m][n] == 1;
// Constraint (3): Hub capacity constraints
forall(m in H)
ct3:sum(i in C, j in C, n in H) d[i][j] * z[i][j][m][n] +
sum(i in C, j in C, n in H: n != m) d[i][j] * z[i][j][n][m] <= Qh[m] * y[m];
// Constraint (4): Vehicles can only depart from established hubs
forall(m in H)
ct4:sum(j in N) x[m][j][m] <= M * y[m];
// Constraint (5): Each customer must be visited exactly once
forall(i in C)
ct5:sum(j in N: j != i, m in H) x[i][j][m] == 1;
// Constraint (6): Flow conservation
forall(i in N, m in H)
ct6:sum(j in N) x[i][j][m] == sum(j in N) x[j][i][m];
// Constraint (7): No inter-hub routes in local delivery
forall(m in H)
ct7:sum(j in N, n in H: n != m) x[n][j][m] == 0;
// Constraint (8): Link between flow and routing variables
forall(i in C, m in H)
ct8:M * sum(j in N) x[i][j][m] >=
sum(j in C, n in H) z[i][j][m][n] + sum(j in C, n in H) z[j][i][n][m];
// Constraint (9): Pickup load continuity
forall(i in N, j in C, m in H: i != j)
ct9:u[i][m] + sum(t in C, n in H) d[j][t] * z[j][t][m][n] -
M * (1 - x[i][j][m]) <= u[j][m];
// Constraint (10): Delivery load continuity
forall(i in C, j in N, m in H: i != j)
ct10:v[i][m] - sum(t in C, n in H) d[t][i] * z[t][i][n][m] +
M * (1 - x[i][j][m]) >= v[j][m];
// Constraint (11): Vehicle capacity constraint for delivery
forall(i in C, m in H)
ct11:v[i][m] <= Qv;
// Constraint (12): Vehicle capacity constraint considering loading/unloading
forall(i in C, m in H)
ct12:u[i][m] + v[i][m] - sum(t in C, n in H) d[t][i] * z[t][i][n][m] <= Qv;
// Constraint (13): Number of vehicles limit
ct13:sum(m in H) sum(j in N) x[m][j][m] <= K;
// Constraint (14): Time consistency
forall(i in N, j in N, m in H)
ct14:s[i] + t[i][j] - s[j] <= M * (1 - x[i][j][m]);
// Constraint (15): Time window penalties
forall(i in C) {
ct15:P[i] >= zeta * (timewindows[i].start - s[i]);
P[i] >= gamma * (s[i] - timewindows[i].end);
P[i] >= 0;};
//Constraint (16): prohibit subtour
forall(i in N, j in N, m in H: i != j && i != m && j != m)
ct16: visitOrder[i] - visitOrder[j] + n * x[i][j][m] <= n - 1;
};
// Solver configuration
execute {
cp.tilim = 10800; // Time limit: 10800 seconds
}
/*********************************************
* OPL 22.1.1.0 Data
* Author:
* Creation Date: 2025/01/05 at 1:55:06
CSAHLRPSTW3.dat
*********************************************/
n = 4;
coordinates = [
<12944.330389, 19522.690462>,
<23487.769950, 14749.226168>,
<31004.306839, 21458.349354>,
<49728.492698, 17946.318136>
];
d = [
[5.705460, 9.801600, 5.028110, 3.105340],
[21.242070, 38.706030, 18.462480, 10.396320],
[5.763190, 9.909430, 9.328980, 8.665890],
[3.820190, 6.300870, 9.807810, 10.572880]
];
F = [
28766.736921,
28376.761527,
29774.238965,
24301.334212
];
Qh = [
2198.532635,
6106.711881,
2226.593104,
4515.466789
];
K = 4;
timewindows = [
<0,10000>,
<0,10000>,
<0,10000>,
<0,10000>
];
t = [
[0.00 233.68 19.41 529.92],
[233.68 0.00 436.25 352.77],
[19.41 436.25 0.00 339.71],
[529.92 352.77 339.71 0.00]
];
I changed n=4 in the data file to n=8 and set the other data accordingly, but the same error occurred.
Upvotes: 0
Views: 38
Reputation: 10062
There were some strange characters. If I run
.mod
// Data section
int n = ...; // number of nodes from node.dat
range N = 1..n;
range C = N; // set of customers (non-hub nodes)
range H = N; // set of potential hubs
// Data reading from external files
tuple Coordinate {
float x;
float y;
}
Coordinate coordinates[N] = ...;
float d[N][N] = ...; // demand matrix
float F[N] = ...; // fixed costs for hubs
float Qh[N] = ...; // hub capacities
int K = ...; // number of vehicles
float t[N][N] = ...; // travel times
tuple TimeWindow {
float start;
float end;
}
TimeWindow timewindows[N] = ...;
// Constants
float Qv = 1100; // vehicle capacity
float M = 1000000; // big M
float alpha = 0.004; // unit inter-hub transportation cost
float beta = 1.0; // unit local delivery cost
float zeta = 1.0; // early arrival penalty coefficient
float gamma = 2.0; // late arrival penalty coefficient
// Calculate distances between nodes
float c[i in N][j in N] = sqrt(pow(coordinates[i].x - coordinates[j].x, 2) +
pow(coordinates[i].y - coordinates[j].y, 2));
// Decision Variables
dvar boolean x[N][N][H]; // routing variable
dvar boolean y[H]; // hub location variable
dvar float+ z[C][C][H][H]; // flow variable
dvar float+ u[N][H]; // pickup amount
dvar float+ v[N][H]; // delivery amount
dvar float+ s[N]; // service start time
dvar float+ P[N]; // time window penalty
dvar float+ visitOrder[i in N]; // exclude sub-tour
// Rest of the model remains the same...
// [Previous constraints and objective function code goes here]
// Optimization Model
minimize
beta * sum(i in N, j in N, m in H) c[i][j] * x[i][j][m] +
sum(m in H) F[m] * y[m] +
alpha * sum(m in H, n in H, i in C, j in C) d[i][j] * z[i][j][m][n] * c[m][n] +
sum(i in N) P[i];
subject to
{
//self roop protection
forall(i in N, m in H)
ct0:x[i][i][m] == 0;
//return to the hubs
forall(m in H)
ct1:sum(i in N: i != m) x[i][m][m] == sum(j in N: j != m) x[m][j][m];
// Constraint (2): All demand must be routed through hubs
forall(i in C, j in C)
ct2:sum(m in H, n in H) z[i][j][m][n] == 1;
// Constraint (3): Hub capacity constraints
forall(m in H)
ct3:sum(i in C, j in C, n in H) d[i][j] * z[i][j][m][n] +
sum(i in C, j in C, n in H: n != m) d[i][j] * z[i][j][n][m] <= Qh[m] * y[m];
// Constraint (4): Vehicles can only depart from established hubs
forall(m in H)
ct4:sum(j in N) x[m][j][m] <= M * y[m];
// Constraint 5 each sustomer should be visited only once
forall(i in C)
ct5:sum(j in N: j != i, m in H) x[i][j][m] == 1;
// Constraint (6): Flow conservation
forall(i in N, m in H)
ct6:sum(j in N) x[i][j][m] == sum(j in N) x[j][i][m];
// Constraint (7): No inter-hub routes in local delivery
forall(m in H)
ct7:sum(j in N, n in H: n != m) x[n][j][m] == 0;
// Constraint (8): Link between flow and routing variables
forall(i in C, m in H)
ct8:M * sum(j in N) x[i][j][m] >=
sum(j in C, n in H) z[i][j][m][n] + sum(j in C, n in H) z[j][i][n][m];
// Constraint (9): Pickup load continuity
forall(i in N, j in C, m in H: i != j)
ct9:u[i][m] + sum(t in C, n in H) d[j][t] * z[j][t][m][n] -
M * (1 - x[i][j][m]) <= u[j][m];
// Constraint (10): Delivery load continuity
forall(i in C, j in N, m in H: i != j)
ct10:v[i][m] - sum(t in C, n in H) d[t][i] * z[t][i][n][m] +
M * (1 - x[i][j][m]) >= v[j][m];
// Constraint (11): Vehicle capacity constraint for delivery
forall(i in C, m in H)
ct11:v[i][m] <= Qv;
// Constraint (12): Vehicle capacity constraint considering loading/unloading
forall(i in C, m in H)
ct12:u[i][m] + v[i][m] - sum(t in C, n in H) d[t][i] * z[t][i][n][m] <= Qv;
// Constraint (13): Number of vehicles limit
ct13:sum(m in H) sum(j in N) x[m][j][m] <= K;
// Constraint (14): Time consistency
forall(i in N, j in N, m in H)
ct14:s[i] + t[i][j] - s[j] <= M * (1 - x[i][j][m]);
// Constraint (15): Time window penalties
forall(i in C) {
ct15:P[i] >= zeta * (timewindows[i].start - s[i]);
P[i] >= gamma * (s[i] - timewindows[i].end);
P[i] >= 0;};
//Constraint (16): prohibit subtour
forall(i in N, j in N, m in H: i != j && i != m && j != m)
ct16: visitOrder[i] - visitOrder[j] + n * x[i][j][m] <= n - 1;
}
and
.dat
n=4;
coordinates=[<12944.330389, 19522.690462>,
<23487.769950, 14749.226168>,
<31004.306839, 21458.349354>,
<49728.492698, 17946.318136>
];
d = [
[5.705460, 9.801600, 5.028110, 3.105340],
[21.242070, 38.706030, 18.462480, 10.396320],
[5.763190, 9.909430, 9.328980, 8.665890],
[3.820190, 6.300870, 9.807810, 10.572880]
];
F = [
28766.736921,
28376.761527,
29774.238965,
24301.334212
];
Qh = [
2198.532635,
6106.711881,
2226.593104,
4515.466789
];
K = 4;
timewindows = [
<0,10000>,
<0,10000>,
<0,10000>,
<0,10000>
];
t = [
[0.00 233.68 19.41 529.92],
[233.68 0.00 436.25 352.77],
[19.41 436.25 0.00 339.71],
[529.92 352.77 339.71 0.00]
];
I get a relaxed solution
PS: Avoid special characters in configuration names
Upvotes: 0