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); }
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)); }
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(); } }
public DoubleLink(BigLLNode next, BigLLNode prev) { Next = next; Prev = prev; }