EquSolver() 공개 정적인 메소드

public static EquSolver ( int funcselp, int funcselq, double A1, double A2, double A3, double B ) : List
funcselp int
funcselq int
A1 double
A2 double
A3 double
B double
리턴 List
예제 #1
0
        public void PairMinimize(int i, int j, double A1, double A2, double A3, double Bp, double left, double right)
        {
            List <double> sol  = Util.EquSolver(type[i], type[j], A1, A2, A3, Bp);
            double        oci  = C[i];
            double        ocj  = C[j];
            bool          flag = false;

            if (sol != null)
            {
                foreach (double root in sol)
                {
                    if (root >= left && root <= right)
                    {
                        double nci = root;
                        double ncj = Bp - root;
                        if (IsDecreased(i, j, oci, ocj, nci, ncj, A1, A2, A3))
                        {
                            oci  = nci;
                            ocj  = ncj;
                            flag = true;
                        }
                    }
                }
            }
            double lci = left;
            double lcj = Bp - left;

            if (IsDecreased(i, j, oci, ocj, lci, lcj, A1, A2, A3))
            {
                oci  = lci;
                ocj  = lcj;
                flag = true;
            }
            double rci = right;
            double rcj = Bp - right;

            if (IsDecreased(i, j, oci, ocj, rci, rcj, A1, A2, A3))
            {
                oci  = rci;
                ocj  = rcj;
                flag = true;
            }
            if (flag)
            {
                if (Math.Abs(C[i] - 1.0) < GlobalVar.epsilon || Math.Abs(C[j] - 1.0) < GlobalVar.epsilon)
                {
                    Console.WriteLine("C[" + i + "]=" + C[i] + "\tC[" + j + "]=" + C[j]);
                    throw new Exception();
                }
                UpdateProbEdge(i, j, C[i], C[j], oci, ocj);
                C[i] = oci;
                C[j] = ocj;
            }
            return;
        }
예제 #2
0
        public List <double> IterativeMinimize()
        {
            bool ooflag = true;

            double sum = 0;

            for (int h = 0; h < prob_edge.Count; ++h)
            {
                sum += (1 - prob_edge[h]);
            }
            Console.WriteLine(sum * graph.numV / prob_edge.Count);

            List <int> nodes = new List <int>();

            foreach (int u in initNodes)
            {
                nodes.Add(u);
            }

            int tnd = 0;

            for (int rnd = 0; rnd < batch_num; ++rnd)
            {
                tnd    = rnd;
                ooflag = false;
                Util.Shuffle(nodes);
                for (int ii = 0; ii < nodes.Count; ++ii)
                {
                    int i = nodes[ii];
                    for (int jj = ii + 1; jj < nodes.Count; ++jj)
                    {
                        int j = nodes[jj];
                        if (Math.Abs(C[i] - 1.0) < GlobalVar.epsilon || Math.Abs(C[j] - 1.0) < GlobalVar.epsilon)
                        {
                            continue;
                        }
                        List <double> parameters = Parameters(i, j, C[i], C[j]);
                        if (parameters != null)
                        {
                            double Bp    = parameters[0];
                            double left  = parameters[1];
                            double right = parameters[2];
                            double A1    = parameters[3];
                            double A2    = parameters[4];
                            double A3    = parameters[5];

                            double oci  = C[i];
                            double ocj  = C[j];
                            bool   flag = false;

                            List <double> sol = Util.EquSolver(type[i], type[j], A1, A2, A3, Bp);
                            if (sol != null)
                            {
                                foreach (double root in sol)
                                {
                                    if (root >= left && root <= right)
                                    {
                                        double nci = root;
                                        double ncj = Bp - root;
                                        if (IsDecreased(i, j, oci, ocj, nci, ncj, A1, A2, A3))
                                        {
                                            oci  = nci;
                                            ocj  = ncj;
                                            flag = true;
                                        }
                                    }
                                }
                            }
                            double lci = left;
                            double lcj = Bp - left;
                            if (IsDecreased(i, j, oci, ocj, lci, lcj, A1, A2, A3))
                            {
                                oci  = lci;
                                ocj  = lcj;
                                flag = true;
                            }



                            double rci = right;
                            double rcj = Bp - right;
                            if (IsDecreased(i, j, oci, ocj, rci, rcj, A1, A2, A3))
                            {
                                oci  = rci;
                                ocj  = rcj;
                                flag = true;
                            }

                            if (flag)
                            {
                                if (Math.Abs(C[i] - 1.0) < GlobalVar.epsilon || Math.Abs(C[j] - 1.0) < GlobalVar.epsilon)
                                {
                                    Console.WriteLine("C[" + i + "]=" + C[i] + "\tC[" + j + "]=" + C[j]);
                                    throw new Exception();
                                }
                                UpdateProbEdge(i, j, C[i], C[j], oci, ocj);
                                C[i]   = oci;
                                C[j]   = ocj;
                                ooflag = true;
                            }
                        }
                    }
                }

                if (!ooflag)
                {
                    break;
                }
            }

            return(C);
        }