private static ZDDNode MakeChildNode(ZDDNode node, State state, int child_num, PseudoZDD zdd) { Mate mate = node.GetCopyMate(state); int c = mate.CheckTerminalPre(state, child_num); if (c == 0) { return PseudoZDD.ZeroTerminal; } else if (c == 1) { return PseudoZDD.OneTerminal; } mate.Update(state, child_num); c = mate.CheckTerminalPost(state); if (c == 0) { return PseudoZDD.ZeroTerminal; } else if (c == 1) { return PseudoZDD.OneTerminal; } else { return new ZDDNode(mate); } }
public static PseudoZDD Construct(State state) { PseudoZDD zdd = new PseudoZDD(); zdd.CreateRootNode(state); for (int edge = 1; edge <= state.GetNumberOfEdges(); ++edge) { state.Update(); zdd.SetLevelStart(); for (int i = 0; i < zdd.GetCurrentLevelSize(); ++i) { ZDDNode node = zdd.GetCurrentLevelNode(i); for (int child_num = 0; child_num < 2; ++child_num) { ZDDNode child_node = MakeChildNode(node, state, child_num, zdd); if (child_node != PseudoZDD.ZeroTerminal && child_node != PseudoZDD.OneTerminal) { ZDDNode cand_node = zdd.FindNodeFromNextLevel(child_node, state); if (cand_node != null) { child_node = cand_node; } else { child_node.SetNextId(); zdd.AddNodeToNextLevel(child_node, state); } } zdd.SetChildNode(node, child_node, child_num); } } } return zdd; }
static void Main(string[] args) { Graph graph = new Graph(); // グラフ(隣接リスト)を標準入力から読み込む string adj_text = ""; string line = Console.ReadLine(); while (line != null) { adj_text += line + "\r\n"; line = Console.ReadLine(); } graph.ParseAdjListText(adj_text); // state オブジェクトの作成(フロンティア法実行に必要) StateSimpath state = new StateSimpath(graph); MateSimpath.SetState(state); // 入力グラフの頂点の数と辺の数を出力 Console.Error.WriteLine("# of vertices = " + graph.GetNumberOfVertices() + ", # of edges = " + graph.GetEdgeList().Count); PseudoZDD zdd = FrontierAlgorithm.Construct(state); // フロンティア法によるZDD構築 // 作成されたZDDのノード数と解の数を出力 Console.Error.WriteLine("# of nodes of ZDD = " + zdd.GetNumberOfNodes()); Console.Error.WriteLine("# of solutions = " + zdd.GetNumberOfSolutions()); // ZDDを標準出力に出力 Console.Write(zdd.ToString()); }
public static PseudoZDD Construct(State state) { PseudoZDD zdd = new PseudoZDD(); zdd.CreateRootNode(state); for (int edge = 1; edge <= state.GetNumberOfEdges(); ++edge) { state.Update(); zdd.SetLevelStart(); for (int i = 0; i < zdd.GetCurrentLevelSize(); ++i) { ZDDNode node = zdd.GetCurrentLevelNode(i); for (int child_num = 0; child_num < 2; ++child_num) { ZDDNode child_node = MakeChildNode(node, state, child_num, zdd); if (child_node != PseudoZDD.ZeroTerminal && child_node != PseudoZDD.OneTerminal) { ZDDNode cand_node = zdd.FindNodeFromNextLevel(child_node, state); if (cand_node != null) { child_node = cand_node; } else { child_node.SetNextId(); zdd.AddNodeToNextLevel(child_node, state); } } zdd.SetChildNode(node, child_node, child_num); } } } return(zdd); }
private static ZDDNode MakeChildNode(ZDDNode node, State state, int child_num, PseudoZDD zdd) { Mate mate = node.GetCopyMate(state); int c = mate.CheckTerminalPre(state, child_num); if (c == 0) { return(PseudoZDD.ZeroTerminal); } else if (c == 1) { return(PseudoZDD.OneTerminal); } mate.Update(state, child_num); c = mate.CheckTerminalPost(state); if (c == 0) { return(PseudoZDD.ZeroTerminal); } else if (c == 1) { return(PseudoZDD.OneTerminal); } else { return(new ZDDNode(mate)); } }