예제 #1
0
        private BigLLNode AppendOrder(Order o)
        {
            BigLLNode n = new BigLLNode(o);

            n.Seq.Prev             = Foot;
            n.Seq.Next             = Foot.Seq.Next;
            Foot.Seq.Next.Seq.Prev = n;
            Foot.Seq.Next          = n;
            return(n);
        }
예제 #2
0
 public List <BigLLNode> GetNearestLoopNodes(out List <int> days)
 {
     foreach (int[] combi in GD.AllowedDayCombinations[Order.Frequency])
     {
         List <BigLLNode> att  = new List <BigLLNode>(Order.Frequency);
         List <int>       attd = new List <int>(Order.Frequency);
         foreach (int day in combi)
         {
             BigLLNode take = null;
             for (int i = 0; i < Nearest.Length; i++)
             {
                 BigLLNode curr = Nearest[i];
                 if (curr.NumVisits[day] > 0)
                 {
                     take = curr;
                     break;
                 }
             }
             if (take != null)
             {
                 att.Add(take);
                 attd.Add(day);
             }
             else
             {
                 break;  //Nothing found, proceed to next daycombination
             }
         }
         if (att.Count == Order.Frequency)
         {
             days = attd;
             return(att);
         }
     }
     days = new List <int>(0);
     return(new List <BigLLNode>(0));
 }
예제 #3
0
        public BigLL(params Order[] orders) //Assumes orders are ordered on orderId
        {
            Head          = new BigLLNode();
            Foot          = new BigLLNode();
            Head.Seq.Prev = Foot;
            Foot.Seq.Next = Head;
            Length        = orders.Length;
            Nodes         = new List <BigLLNode>(orders.Length);

            for (int i = 0; i < orders.Length; i++)
            {
                BigLLNode n = AppendOrder(orders[i]);
                if (orders[i].OrderId == 0)
                {
                    Console.WriteLine(i);
                }
                Nodes.Add(n);
            }

            Nodes.Sort((a, b) => a.Order.XCoord.CompareTo(b.Order.XCoord));
            HeadX = Nodes[0];
            for (int i = 1; i < Length; i++)
            {
                Nodes[i].SeqX.Next     = Nodes[i - 1];
                Nodes[i - 1].SeqX.Prev = Nodes[i];
            }
            FootX = Nodes[Length - 1];

            Nodes.Sort((a, b) => a.Order.YCoord.CompareTo(b.Order.YCoord));
            HeadY = Nodes[0];
            for (int i = 1; i < Length; i++)
            {
                Nodes[i].SeqY.Next     = Nodes[i - 1];
                Nodes[i - 1].SeqY.Prev = Nodes[i];
            }
            FootY = Nodes[Length - 1];

            Nodes.Sort((a, b) => a.Order.JourneyTimeToDump.CompareTo(b.Order.JourneyTimeToDump));
            HeadTime = Nodes[0];
            for (int i = 1; i < Length; i++)
            {
                Nodes[i].SeqDist.Next     = Nodes[i - 1];
                Nodes[i - 1].SeqDist.Prev = Nodes[i];
            }
            FootTime = Nodes[Length - 1];

            Nodes.Sort((a, b) => a.Order.Score.CompareTo(b.Order.Score));
            HeadScore = Nodes[0];
            for (int i = 1; i < Length; i++)
            {
                Nodes[i].SeqScore.Next     = Nodes[i - 1];
                Nodes[i - 1].SeqScore.Prev = Nodes[i];
            }
            FootScore = Nodes[Length - 1];

            BigLLNode[] temp = Nodes.ToArray();
            foreach (BigLLNode node in temp)
            {
                Nodes.Sort((a, b) =>
                           GD.JourneyTime[node.Order.MatrixId, a.Order.MatrixId]
                           .CompareTo(
                               GD.JourneyTime[node.Order.MatrixId, b.Order.MatrixId]
                               )
                           );

                node.Nearest = Nodes.ToArray();
            }
        }
예제 #4
0
 public DoubleLink(BigLLNode next, BigLLNode prev)
 {
     Next = next;
     Prev = prev;
 }