private void GetRoutes(Node node, Politik politik, pakke sendtPakke, float multiplier) { if (node.Ruter != null && node.Ruter.Any()) return; var ruter = new List<Edge>(); foreach (var rute in _externalServicesApis.Select(enemy => enemy.GetRoute(node.By, sendtPakke))) { ruter.AddRange(rute.Select(route => new Edge { From = _nodes.FirstOrDefault(p => p.By.CityId == route.Rute.StartCity), To = _nodes.FirstOrDefault(p => p.By.CityId == route.Rute.EndCity), Weight = Politik.Pris == politik ? route.Pris : route.Rute.Time, Route = route })); } var ownRoutes = DataManager.HentRuter(node.By).Select(r => new Edge { From = _nodes.FirstOrDefault(p => p.By.CityId == r.Rute.StartCity), To = _nodes.FirstOrDefault(p => p.By.CityId == r.Rute.EndCity), Route = r, Weight = politik == Politik.Pris ? BeregnPris(sendtPakke, multiplier) : r.Rute.Time }).ToList(); ruter.AddRange(ownRoutes); var prunedList = new List<Edge>(); foreach (var outerRoute in ruter) { if (outerRoute.From.By.CityId != node.By.CityId) { continue; } Boolean update = true; double minWeight = outerRoute.Weight; foreach (var innerRoute in ruter) { if (update && outerRoute.From == innerRoute.From && outerRoute.To == innerRoute.To && innerRoute.Weight < minWeight) { update = false; } } if (update) prunedList.Add(outerRoute); } prunedList.FindAll(r => r.Route.TransportType == TransportType.Oceanic) .ForEach(rout => rout.Route.Pris = BeregnPris(sendtPakke, multiplier)); node.Ruter = prunedList; }
private Node Dijstra(by source, by target, Politik politik, pakke sendtPakke, float multiplier) { var queue = new HeapPriorityQueue<Node>(_byliste.Count * 2); _nodes = new List<Node>(); Node targetBy = null; foreach (var by in _byliste) { var node = new Node { By = by }; if (by.CityId == target.CityId) { targetBy = node; } node.Distance = by.CityId == source.CityId ? 0 : double.MaxValue; _nodes.Add(node); queue.Enqueue(node, node.Distance); } while (queue.Any()) { var node = queue.Dequeue(); if (node == targetBy && node.Distance != double.MaxValue) return node; GetRoutes(node, politik, sendtPakke, multiplier); foreach (var neighbour in getNeighbourghNodes(node, queue)) { if (neighbour == null || !queue.Contains(neighbour)) continue; var dist = node.Distance + DistanceBetween(node, neighbour, politik); if (dist < neighbour.Distance) { neighbour.Distance = dist; neighbour.Previous = node; queue.UpdatePriority(neighbour, dist); } } } return null; }
private double DistanceBetween(Node from, Node to, Politik politik) { return from.Ruter.FirstOrDefault(p => p.From == from && p.To == to).Weight; }