Example #1
0
        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;
        }
Example #2
0
        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;
        }
Example #3
0
 private double DistanceBetween(Node from, Node to, Politik politik)
 {
     return from.Ruter.FirstOrDefault(p => p.From == from && p.To == to).Weight;
 }