public TrafficNetworkModel (int numberOfNodes, int source_idx, int sink_idx, int[] arc_i, int[] arc_j, double[] arcSensitivity, double[] arcCapacity, double[] arcBaseTravelTime, double T) : base("Traffic Network") { bool finished = false; try { int n = numberOfNodes; int narcs = arc_j.Length; double[] n_ones = new double[narcs]; for (int i = 0; i < narcs; ++i) { n_ones[i] = 1.0; } Set NxN = new NDSet(new int[] { 0, 0 }, new int[] { n, n }); Matrix sens = Matrix.Sparse(n, n, arc_i, arc_j, arcSensitivity); Matrix cap = Matrix.Sparse(n, n, arc_i, arc_j, arcCapacity); Matrix basetime = Matrix.Sparse(n, n, arc_i, arc_j, arcBaseTravelTime); Matrix e = Matrix.Sparse(n, n, arc_i, arc_j, n_ones); Matrix e_e = Matrix.Sparse(n, n, new int[] { sink_idx }, new int[] { source_idx }, new double[] { 1.0 }); double[] cs_inv = new double[narcs]; double[] s_inv = new double[narcs]; for (int i = 0; i < narcs; ++i) { cs_inv[i] = 1.0 / (arcSensitivity[i] * arcCapacity[i]); } for (int i = 0; i < narcs; ++i) { s_inv[i] = 1.0 / arcSensitivity[i]; } Matrix cs_inv_matrix = Matrix.Sparse(n, n, arc_i, arc_j, cs_inv); Matrix s_inv_matrix = Matrix.Sparse(n, n, arc_i, arc_j, s_inv); flow = Variable("traffic_flow", NxN, Domain.GreaterThan(0.0)); Variable x = flow; Variable t = Variable("travel_time", NxN, Domain.GreaterThan(0.0)); Variable d = Variable("d", NxN, Domain.GreaterThan(0.0)); Variable z = Variable("z", NxN, Domain.GreaterThan(0.0)); // Set the objective: Objective(ObjectiveSense.Minimize, Expr.Mul(1.0 / T, Expr.Add(Expr.Dot(basetime, x), Expr.Dot(e, d)))); // Set up constraints // Constraint (1a) { Variable[][] v = new Variable[narcs][]; for (int i = 0; i < narcs; ++i) { v[i] = new Variable[3] { d.Index(arc_i[i], arc_j[i]), z.Index(arc_i[i], arc_j[i]), x.Index(arc_i[i], arc_j[i]) }; } Constraint(mosek.fusion.Variable.Stack(v), Domain.InRotatedQCone(narcs, 3)); } // Constraint (1b) Constraint(Expr.Sub(Expr.Add(z, Expr.MulElm(x, cs_inv_matrix)), s_inv_matrix), Domain.EqualsTo(0.0)); // Constraint (2) Constraint(Expr.Sub(Expr.Add(Expr.MulDiag(x, e.Transpose()), Expr.MulDiag(x, e_e.Transpose())), Expr.Add(Expr.MulDiag(x.Transpose(), e), Expr.MulDiag(x.Transpose(), e_e))), Domain.EqualsTo(0.0)); // Constraint (3) Constraint(x.Index(sink_idx, source_idx), Domain.EqualsTo(T)); finished = true; } finally { if (!finished) { Dispose(); } } }
public TrafficNetworkModel ( int numberOfNodes, int source_idx, int sink_idx, int[] arc_i, int[] arc_j, double[] arcSensitivity, double[] arcCapacity, double[] arcBaseTravelTime, double T) : base("Traffic Network") { bool finished = false; try { int n = numberOfNodes; int narcs = arc_j.Length; double[] n_ones = new double[narcs]; for (int i = 0; i < narcs; ++i) n_ones[i] = 1.0; Set NxN = new NDSet(new int[] { 0, 0 }, new int[] { n, n}); Matrix sens = Matrix.Sparse(n, n, arc_i, arc_j, arcSensitivity); Matrix cap = Matrix.Sparse(n, n, arc_i, arc_j, arcCapacity); Matrix basetime = Matrix.Sparse(n, n, arc_i, arc_j, arcBaseTravelTime); Matrix e = Matrix.Sparse(n, n, arc_i, arc_j, n_ones); Matrix e_e = Matrix.Sparse(n,n, new int[] { sink_idx}, new int[] { source_idx}, new double[] { 1.0 }); double[] cs_inv = new double[narcs]; double[] s_inv = new double[narcs]; for (int i = 0; i < narcs; ++i) cs_inv[i] = 1.0 / (arcSensitivity[i] * arcCapacity[i]); for (int i = 0; i < narcs; ++i) s_inv[i] = 1.0 / arcSensitivity[i]; Matrix cs_inv_matrix = Matrix.Sparse(n, n, arc_i, arc_j, cs_inv); Matrix s_inv_matrix = Matrix.Sparse(n, n, arc_i, arc_j, s_inv); flow = Variable("traffic_flow", NxN, Domain.GreaterThan(0.0)); Variable x = flow; Variable t = Variable("travel_time", NxN, Domain.GreaterThan(0.0)); Variable d = Variable("d", NxN, Domain.GreaterThan(0.0)); Variable z = Variable("z", NxN, Domain.GreaterThan(0.0)); // Set the objective: Objective(ObjectiveSense.Minimize, Expr.Mul(1.0/T, Expr.Add(Expr.Dot(basetime,x), Expr.Dot(e,d)))); // Set up constraints // Constraint (1a) { Variable[][] v = new Variable[narcs][]; for (int i = 0; i < narcs; ++i) { v[i] = new Variable[3] { d.Index(arc_i[i],arc_j[i]), z.Index(arc_i[i],arc_j[i]), x.Index(arc_i[i],arc_j[i]) }; } Constraint(mosek.fusion.Variable.Stack(v),Domain.InRotatedQCone(narcs,3)); } // Constraint (1b) Constraint(Expr.Sub(Expr.Add(z,Expr.MulElm(x,cs_inv_matrix)),s_inv_matrix), Domain.EqualsTo(0.0)); // Constraint (2) Constraint(Expr.Sub(Expr.Add(Expr.MulDiag(x, e.Transpose()), Expr.MulDiag(x, e_e.Transpose())), Expr.Add(Expr.MulDiag(x.Transpose(), e), Expr.MulDiag(x.Transpose(), e_e))), Domain.EqualsTo(0.0)); // Constraint (3) Constraint(x.Index(sink_idx, source_idx), Domain.EqualsTo(T)); finished = true; } finally { if (!finished) Dispose(); } }