コード例 #1
0
        public override string MakeTransform(SimplexTable inputTable, out SimplexTable outputTable, out bool success)
        {
            outputTable = new SimplexTable(inputTable);
            string result = "<h3>Dual simplex method</h3><br>Let's use dual simplex method.<br>";

            PrepareForMethod(outputTable, out outputTable, ref result);

            result += "Step 0:<br>";
            result += PrintTableToHTML(outputTable, curBasis, curDelta);
            result += "<br><br>";

            int    iterNum     = 0;
            string checkResult = "";

            while (CanContinue(outputTable, out checkResult, out success))
            {
                if (iterNum++ > 0)
                {
                    result += $"Step {iterNum}:<br>";
                }
                int minBIndex = FindIndexOfMin(outputTable.bVector);

                var gamas = new List <SimplexCoef>();
                for (int j = 0; j < outputTable.NumOfVariables; j++)
                {
                    if (outputTable.aMatrix[minBIndex][j].value.Sign >= 0)
                    {
                        gamas.Add(null);
                        continue;
                    }

                    gamas.Add(curDelta[j] / (-outputTable.aMatrix[minBIndex][j]));
                }

                int minGamaIndex = FindIndexOfMin(gamas);
                result += $"{outputTable.cLables[minGamaIndex].Value} going inside the basis.<br>";
                result += $"{outputTable.cLables[curBasis[minBIndex]].Value} going outside the basis.<br>";

                var jordanTransform = new JordanTransform(minBIndex, minGamaIndex);
                result += jordanTransform.MakeTransform(outputTable, out outputTable, out bool s);

                ReevaluateBasisAndDeltas(outputTable);

                int numOfVariablesBeforeRemovingUnused = outputTable.NumOfVariables;
                result += RemoveUnusedSinteticVariables(outputTable, out outputTable, curBasis);
                if (outputTable.NumOfVariables != numOfVariablesBeforeRemovingUnused)
                {
                    ReevaluateBasisAndDeltas(outputTable);
                }

                result += PrintTableToHTML(outputTable, curBasis, curDelta);
                result += "<br><br>";
            }

            result += checkResult;

            if (success)
            {
                result += FormAnswer(outputTable, curBasis);
            }
            return(result);
        }
コード例 #2
0
        public virtual string MakeTransform(SimplexTable inputTable, out SimplexTable outputTable, out bool success)
        {
            outputTable = new SimplexTable(inputTable);
            string result = "<h3>Simplex method: </h3><br>Let's use simplex method.<br>";

            PrepareForMethod(outputTable, out outputTable, ref result);

            result += "<br>";
            if (outputTable.costFIsInverted)
            {
                result += "Cost function is inverted: <br>";
            }

            result += PrintCostFunction(outputTable);
            result += "<br>Step 0:<br>";
            result += PrintTableToHTML(outputTable, curBasis, curDelta);
            result += "<br><br>";

            int    iterNum = 0;
            string checkResult;

            while (CanContinue(outputTable, curDelta, out checkResult, out success))
            {
                if (iterNum++ > 0)
                {
                    result += $"Step {iterNum}:<br>";
                }
                int minDeltaIndex = FindIndexOfMin(curDelta);

                var tetas = new List <SimplexCoef>();
                for (int i = 0; i < outputTable.NumOfConstrains; i++)
                {
                    if (outputTable.aMatrix[i][minDeltaIndex].value.Sign <= 0)
                    {
                        tetas.Add(null);
                        continue;
                    }
                    tetas.Add(outputTable.bVector[i] / outputTable.aMatrix[i][minDeltaIndex]);
                }

                int minTetaIndex = FindIndexOfMin(tetas);
                result += $"{outputTable.cLables[minDeltaIndex].Value} going inside the basis.<br>";
                result += $"{outputTable.cLables[curBasis[minTetaIndex]].Value} going outside the basis.<br>";

                var jordanTransform = new JordanTransform(minTetaIndex, minDeltaIndex);
                result += jordanTransform.MakeTransform(outputTable, out outputTable, out bool s);
                ReevaluateBasisAndDeltas(outputTable);

                int numOfVariablesBeforeRemovingUnused = outputTable.NumOfVariables;
                result += RemoveUnusedSinteticVariables(outputTable, out outputTable, curBasis);
                if (outputTable.NumOfVariables != numOfVariablesBeforeRemovingUnused)
                {
                    ReevaluateBasisAndDeltas(outputTable);
                }

                result += PrintTableToHTML(outputTable, curBasis, curDelta);
                result += "<br><br>";
            }

            result += checkResult;

            if (success)
            {
                result += FormAnswer(outputTable, curBasis);
            }
            result += "<br>";

            return(result);
        }