public static List<Tile> Astar(Map map, Tile Start, Tile End) { Nodelist<Node> openlist = new Nodelist<Node>(); Nodelist<Node> closelist = new Nodelist<Node>(); List<Node> possibleNode; int possibleNodeCount; Node StartNode = new Node(Start, null, End); List<Tile> sol = new List<Tile>(); openlist.Add(StartNode); while (openlist.Count>0) { Node current = openlist[0]; openlist.RemoveAt(0); closelist.Add(current); if (current.Tile.X==End.X && current.Tile.Y == End.Y) { while (current.Parent != null) { sol.Insert(0, current.Tile); current = current.Parent; } return sol; } possibleNode = current.GetPossibleNode(map, End); possibleNodeCount = possibleNode.Count; for (int i = 0; i < possibleNodeCount; i++) { if (!closelist.Contains(possibleNode[i])) { if (openlist.Contains(possibleNode[i])) { if (possibleNode[i].Heuristic < openlist[possibleNode[i]].Heuristic) openlist[possibleNode[i]].Parent = current; } else openlist.DichotomicInsertion(possibleNode[i]); } } } sol.Add(Start); return sol; }
/// <summary> /// Combines two powernets when they connect via powertransfer components /// </summary> public void MergePowernets(Powernet toMerge) { //TODO: load balance reconciliation between powernets on merge tick here foreach (var wire in toMerge.Wirelist) { wire.Parent = this; } Wirelist.AddRange(toMerge.Wirelist); toMerge.Wirelist.Clear(); foreach (var node in toMerge.Nodelist) { node.Parent = this; } Nodelist.AddRange(toMerge.Nodelist); toMerge.Nodelist.Clear(); foreach (var generator in toMerge.Generatorlist) { Generatorlist.Add(generator.Key, generator.Value); } toMerge.Generatorlist.Clear(); foreach (var device in toMerge.Deviceloadlist) { Deviceloadlist.Add(device); } toMerge.Deviceloadlist.Clear(); DepoweredDevices.AddRange(toMerge.DepoweredDevices); toMerge.DepoweredDevices.Clear(); PowerStorageSupplierlist.AddRange(toMerge.PowerStorageSupplierlist); toMerge.PowerStorageSupplierlist.Clear(); PowerStorageConsumerlist.AddRange(toMerge.PowerStorageConsumerlist); toMerge.PowerStorageConsumerlist.Clear(); toMerge.RemoveFromSystem(); }
public Graph() { edges = new Edgelist(1); nodes = new Nodelist(1); scale = 1; }
public Graph(double epsilon) { edges = new Edgelist(epsilon); nodes = new Nodelist(epsilon); scale = 1; }