private void VisitFlow(NetworkFlow flow) { if (!visitedFlow.ContainsKey(flow)) { visitedFlow.Add(flow, false); } else { visitedFlow[flow] = true; } }
private void CreateFlowBetween(NetworkNode first, NetworkNode second, NetworkNode.Direction direction) { NetworkFlow existFlow = activeFlowList.Find(x => x.FirstNode == second && x.SecondNode == first); // 两条有向边共享同一个flow GameObject GameObject flowObject = existFlow == null? CreateFlowGameObject(first, second, direction) : existFlow.FlowObject; NetworkFlow newFlow = new NetworkFlow(flowObject) { FirstNode = first, SecondNode = second, Direction = direction }; first.SetFlow(direction, newFlow); activeFlowList.Add(newFlow); }
public void SetFlow(Direction direction, NetworkFlow value) { Flows[(int)direction] = value; }
private void TraverseNetworkFlow() { // 清理工作:将所有节点和流都关闭 foreach (var node in activeNodeList) { if (!(node is StartNode)) { node.Clear(); } } foreach (var flow in activeFlowList) { flow.Clear(); } visitedFlowList.Clear(); // 从起点开始,查找周边的通路 for (int i = 0; i < NetworkNode.NeighborNum; i++) { var flow = startNode.GetFlow(i); if (flow != null && startNode.IsReachableTo(flow.Direction)) { flowQueue.Enqueue(flow); Log(string.Format("Enqueue: {0}", flow)); } } // 开始遍历网络图 while (flowQueue.Count > 0) { NetworkFlow flow = flowQueue.Dequeue(); NetworkNode node = flow.FirstNode; NetworkNode neighbor = flow.SecondNode; visitedFlowList.Add(flow); Log(string.Format("Visit {0}", flow)); // 激活流和输入状态 NetworkNode.Direction direction = node.GetNeighborDirection(neighbor); flow.Activate(node, neighbor); neighbor.SetInput(NetworkNode.GetOppositeDirection(direction), true); bool nextFlowFound = false; for (int i = 0; i < NetworkNode.NeighborNum; i++) { var nextFlow = neighbor.GetFlow(i); if (nextFlow == null || visitedFlowList.Contains(nextFlow) || flowQueue.Contains(nextFlow) || // 第一趟查找,不包含那些已经走过一遍的通路 IsVisitedFlowExist(nextFlow.SecondNode, nextFlow.FirstNode)) { continue; } if (neighbor.IsReachableTo(nextFlow.Direction)) { Log(string.Format("Enqueue: {0}", nextFlow)); flowQueue.Enqueue(nextFlow); nextFlowFound = true; } } // 第二趟查找,可能包含反向的通路 if (!nextFlowFound) { for (int i = 0; i < NetworkNode.NeighborNum; i++) { var nextFlow = neighbor.GetFlow(i); if (nextFlow == null || visitedFlowList.Contains(nextFlow) || flowQueue.Contains(nextFlow)) { continue; } if (neighbor.IsReachableTo(nextFlow.Direction)) { Log(string.Format("Enqueue2: {0}", nextFlow)); flowQueue.Enqueue(nextFlow); } } } } }