Beispiel #1
0
        public Dictionary(LPP lpp)
        {
            z0     = 0;
            this.a = new double[lpp.ObjFunc.VariablesNumber];
            for (int i = 0; i < a.Length; i++)
            {
                a[i] = lpp.ObjFunc.Coefficients[i];
            }

            this.basic = new int[lpp.ObjFunc.VariablesNumber];
            for (int i = 0; i < lpp.ObjFunc.VariablesNumber; i++)
            {
                this.basic[i] = i + 1;
            }
            this.slack = new int[lpp.Constraints.Length];
            for (int i = 0; i < lpp.Constraints.Length; i++)
            {
                this.slack[i] = lpp.ObjFunc.VariablesNumber + i + 1;
            }

            this.c = new double[lpp.Constraints.Length, lpp.ObjFunc.VariablesNumber + 1];
            for (int i = 0; i < lpp.Constraints.Length; i++)
            {
                this.c[i, 0] = lpp.Constraints[i].Restriction;
                for (int j = 1; j < lpp.ObjFunc.VariablesNumber + 1; j++)
                {
                    this.c[i, j] = -lpp.Constraints[i].Coefficients[j - 1];
                }
            }
        }
Beispiel #2
0
        private Dictionary initialize()
        {
            Console.WriteLine("Initialization phase...");
            Console.WriteLine("-------------------------------");
            Console.WriteLine();

            double[] auxC = new double[ObjFunc.VariablesNumber + 1];
            auxC[0] = -1;
            for (int i = 0; i < auxC.Length - 1; i++)
            {
                auxC[i + 1] = 0;
            }
            ObjectiveFunction auxOF = new ObjectiveFunction(auxC);

            Constraint[] auxCS       = new Constraint[this.Constraints.Length];
            int          leavesBasis = 0;
            double       minB        = Constraints[0].Restriction;

            for (int i = 0; i < auxCS.Length; i++)
            {
                double[] auxCC = new double[ObjFunc.VariablesNumber + 1];
                auxCC[0] = -1;
                for (int j = 0; j < auxCC.Length - 1; j++)
                {
                    auxCC[j + 1] = Constraints[i].Coefficients[j];
                }
                auxCS[i] = new Constraint(auxCC, Constraints[i].Restriction);
                if (Constraints[i].Restriction < minB)
                {
                    minB = Constraints[i].Restriction; leavesBasis = i;
                }
            }

            LPP        auxLPP = new LPP(auxOF, auxCS);
            Dictionary auxD   = new Dictionary(auxLPP);

            auxD.Print(false);
            auxD.Recalculate(0, leavesBasis);
            while (!SolutionFound(auxD))
            {
                auxD.Print(preferToLeave: 1);
                auxD.Improve(preferToLeave: 1);
            }
            auxD.Print(preferToLeave: 1);

            int len = auxD.basic.Length;

            int[] bb = new int[len];
            double[,] cc = new double[auxLPP.Constraints.Length, len + 1];
            int[] ss = new int[auxLPP.Constraints.Length];
            for (int i = 0; i < len; i++)
            {
                bb[i] = auxD.basic[i];
                for (int j = 0; j < auxLPP.Constraints.Length; j++)
                {
                    cc[j, i + 1] = auxD.c[j, i + 1];
                }
            }
            for (int j = 0; j < auxLPP.Constraints.Length; j++)
            {
                cc[j, 0] = auxD.c[j, 0]; ss[j] = auxD.slack[j];
            }

            auxD.a     = new double[len - 1];
            auxD.basic = new int[len - 1];
            auxD.slack = new int[auxLPP.Constraints.Length];
            auxD.c     = new double[auxLPP.Constraints.Length, len];

            for (int i = 0; i < auxLPP.Constraints.Length; i++)
            {
                auxD.c[i, 0] = cc[i, 0];
                int j = 1;
                while (bb[j - 1] != 1)
                {
                    auxD.c[i, j] = cc[i, j]; j++;
                }
                while (j < bb.Length)
                {
                    j++; auxD.c[i, j - 1] = cc[i, j];
                }
                auxD.slack[i] = ss[i] - 1;
            }
            int k = 0;

            while (bb[k] != 1)
            {
                auxD.basic[k] = bb[k] - 1; k++;
            }
            k++;
            while (k < bb.Length)
            {
                auxD.basic[k - 1] = bb[k] - 1; k++;
            }

            auxD.z0 = 0;
            for (int i = 0; i < this.ObjFunc.Coefficients.Length; i++)
            {
                for (int j = 0; j < auxD.slack.Length; j++)
                {
                    if (auxD.slack[j] == i + 1)
                    {
                        auxD.z0 += ObjFunc.Coefficients[i] * auxD.c[j, 0];
                        for (int m = 0; m < ObjFunc.Coefficients.Length; m++)
                        {
                            auxD.a[m] += ObjFunc.Coefficients[i] * auxD.c[j, m + 1];
                        }
                    }
                }
            }
            auxD.Print(false);

            Console.WriteLine();

            return(auxD);
        }