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();
                        }
                    }
                }
示例#2
0
        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();              
          }
        }