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;
        }
Example #3
0
        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());
        }
Example #4
0
        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);
        }
Example #5
0
        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));
            }
        }