Esempio n. 1
0
        public void DeterminDuality()
        {
            originalLP.DisplayCurrentTable();

            LinearProgram duality = (LinearProgram)originalLP.Clone();

            if (originalLP.Type == LPType.Max)
            {
                duality.Type = LPType.Min;
            }
            else
            {
                duality.Type = LPType.Max;
            }

            duality.LinearProgramMatrix = new double[originalLP.CountX + 1, originalLP.RowCount];

            //Fill X Values
            for (int i = 1; i < originalLP.RowCount; i++)
            {
                for (int j = 0; j <= originalLP.CountX; j++)
                {
                    duality.LinearProgramMatrix[j, i] = originalLP.LinearProgramMatrix[i, j];
                }
            }

            double[] rhs = new double[originalLP.CountX + 1];

            //Fill RHS
            for (int i = 1; i <= originalLP.CountX; i++)
            {
                rhs[i] = originalLP.LinearProgramMatrix[0, i];
            }

            duality.CountA = 0;
            duality.CountS = 0;
            duality.CountE = originalLP.CountX;
            duality.CountX = originalLP.RowCount - 1;

            double[,] eArray = new double[duality.CountE + 1, duality.CountE];

            //Handle URS
            for (int i = 0; i < eArray.GetLength(1); i++)
            {
                eArray[i + 1, i] = 1;
            }

            double[,] finalLP = new double[duality.RowCount, duality.ColumnCount + eArray.GetLength(0)];

            for (int i = 0; i < finalLP.GetLength(0); i++)
            {
                int mainCol = 0;

                //Saves the LP
                for (int orgCol = 0; orgCol < duality.ColumnCount; orgCol++)
                {
                    finalLP[i, orgCol] = duality.LinearProgramMatrix[i, orgCol] * -1;

                    mainCol++;
                }

                //Saves the E's
                for (int eCol = 0; eCol < duality.CountE; eCol++)
                {
                    finalLP[i, mainCol] = eArray[i, eCol];

                    mainCol++;
                }

                //Saves the RHS
                finalLP[i, duality.ColumnCount + duality.CountE] = rhs[i];
            }

            for (int i = 1; i < originalLP.RowCount; i++)
            {
                finalLP[0, i] = originalLP.LinearProgramMatrix[i, originalLP.ColumnCount - 1] * -1;
            }

            duality.LinearProgramMatrix       = finalLP;
            duality.LinearProgramMatrix[0, 0] = 1;

            Console.WriteLine("Duality Initial Table");
            duality.DisplayCurrentTable();
            Console.WriteLine();

            Dual dual = new Dual(duality);

            duality = dual.Solve();

            Console.WriteLine();

            if (optimalSoltution.GetBasicVariables()[0] == duality.GetBasicVariables()[0])
            {
                Console.WriteLine("Strong Duality");
            }
            else
            {
                Console.WriteLine("Weak Duality");
            }
        }
Esempio n. 2
0
        //TODO: WILL BREAK IF SOLUTION IS NOT YET SOLVED OR IF YOU ADD CONSTRAINT TO A COLUMN WITH NO X SOLUTION
        public static LinearProgram AddBasicConstraint
            (LinearProgram linearProgram, int column, int ConstraintType, int rhs)
        {
            if (ConstraintType != GREATER_THAN && ConstraintType != LESS_THAN)
            {
                throw new ArgumentException
                          ("The argument passed to AddBasicConstraint for ConstraintType does not match the expected value");
            }

            LinearProgram tempLp        = (LinearProgram)linearProgram.Clone();
            int           constraintRow = linearProgram.RowCount;

            double[,] newArray = new double[linearProgram.RowCount + 1, linearProgram.ColumnCount + 1];
            for (int c = 0; c < linearProgram.ColumnCount - 1; c++)
            {
                for (int r = 0; r < linearProgram.RowCount; r++)
                {
                    newArray[r, c] = linearProgram.LinearProgramMatrix[r, c];
                }
            }
            for (int i = 0; i < linearProgram.RowCount; i++)
            {
                newArray[i, linearProgram.ColumnCount] = linearProgram.LinearProgramMatrix[i, linearProgram.ColumnCount - 1];
            }
            for (int i = 0; i < linearProgram.RowCount; i++)
            {
                newArray[i, linearProgram.ColumnCount - 1] = 0;
            }

            newArray[constraintRow, column] = 1;
            newArray[constraintRow, linearProgram.ColumnCount] = rhs;

            newArray[constraintRow, linearProgram.ColumnCount - 1] = 1;


            //Constraint has been added, now check vilidity
            int conflictingRow = 0;

            for (int i = 0; i < linearProgram.RowCount; i++)
            {
                if (newArray[i, column] == 1)
                {
                    conflictingRow = i;
                    break;
                }
            }
            if (ConstraintType == GREATER_THAN)
            {
                tempLp.CountE++;
                for (int i = 0; i < linearProgram.ColumnCount + 1; i++)
                {
                    newArray[constraintRow, i] = newArray[constraintRow, i] - newArray[conflictingRow, i];
                }
                newArray[constraintRow, linearProgram.ColumnCount - 1] *= -1;
            }
            else
            {
                tempLp.CountS++;
                for (int i = 0; i < linearProgram.ColumnCount + 1; i++)
                {
                    newArray[constraintRow, i] = newArray[constraintRow, i] - newArray[conflictingRow, i];
                }
            }

            if (newArray[constraintRow, linearProgram.ColumnCount - 1] < 0)
            {
                for (int i = 0; i < linearProgram.ColumnCount + 1; i++)
                {
                    newArray[constraintRow, i] *= -1;
                }
            }
            tempLp.LinearProgramMatrix = newArray;

            tempLp.DisplayCurrentTable();

            return(tempLp);
        }
Esempio n. 3
0
        //Loop this?
        public static void SensitivityAnalysisMenu()
        {
            try
            {
                //Sensitivity Analysis Menu
                Console.WriteLine(@"
                                  IP SOLVER
________________________________________________________________________________________
                                                                                        
                           SENSITIVITY ANALYSIS

                       
             1. Display the range of a selected Non-Basic Variable.
             2. Apply and display a change of a selected Non-Basic Variable.
             3. Display the range of a selected Basic Variable.
             4. Apply and display a change of a selected Basic Variable.
             5. Display the range of a selected constraint right-hand-side value.
             6. Apply and display a change of a selected constraint right-hand-side value.
             7. Display the range of a selected variable in a Non-Basic Variable column.
             8. Apply and display a change of a selected variable in a Non-Basic Variable column.
             9. Add a new activity to an optimal solution.
             10. Add a new constraint to an optimal solution.
             11. Display the shadow prices.
             12. Duality
");

                Console.WriteLine("\nSolved LP\n");
                linearProgram.DisplayCurrentTable();
                Console.WriteLine();

                int userInputSensitivityAnalysis = int.Parse(Console.ReadLine());

                SensitivityMenu smenu = (SensitivityMenu)userInputSensitivityAnalysis;
                switch (smenu)
                {
                case SensitivityMenu.display1:
                    //TODO Display the range of a selected Non-Basic Variable.
                    //SensivitityAnalysis.GetNonBasicVariables(linearProgram);

                    Console.WriteLine("Enter the column Number: (Z Column = Column 0)");

                    int rowNumber = int.Parse(Console.ReadLine());

                    Console.WriteLine("Ranges for Non Basic Variables");
                    SensivitityAnalysis.GetNBVRange(SensivitityAnalysis.GetFormatedSensistivityMatrix(linearProgram.LinearProgramMatrix), rowNumber);
                    Console.ReadKey();

                    break;

                case SensitivityMenu.display2:
                    //TODO Display the range of a selected Non-Basic Variable.
                    Console.WriteLine("Enter the column Number: (Z Column = Column 0)");

                    int columnNumber = int.Parse(Console.ReadLine());

                    Console.WriteLine("Enter the row Number: (Z Column = Column 0)");

                    rowNumber = int.Parse(Console.ReadLine());

                    if (linearProgram.GetBasicVariables()[columnNumber] != 0)
                    {
                        Console.WriteLine("Not NBV");
                    }
                    else
                    {
                        Console.WriteLine("ENter NEw Value:");

                        int valuenew = int.Parse(Console.ReadLine());

                        linearProgram.LinearProgramMatrix[rowNumber, columnNumber] = valuenew;

                        linearProgram.DisplayCurrentTable();

                        if (LpTools.CheckIfIPIsSolved(linearProgram))
                        {
                            Console.WriteLine("No Change");
                            Console.ReadKey();
                        }
                        else
                        {
                            LinearProgram linearProgramNew = (LinearProgram)linearProgram.Clone();

                            Dual dual2 = new Dual(linearProgramNew);

                            dual2.Solve();

                            if (LpTools.CheckIfIPIsSolved(linearProgramNew))
                            {
                                linearProgramNew.DisplaySolution();
                            }
                            else
                            {
                                Console.WriteLine("No solution");
                                Console.ReadKey();
                            }
                        }
                    }



                    break;

                case SensitivityMenu.display3:
                    //TODO Display the range of a selected Basic Variable.
                    Console.WriteLine("Enter the column Number: (Z Column = Column 0)");

                    rowNumber = int.Parse(Console.ReadLine());



                    Console.WriteLine("Ranges for Basic variables");
                    SensivitityAnalysis.GetRangesForSelectedBV(SensivitityAnalysis.GetFormatedSensistivityMatrix(linearProgram.LinearProgramMatrix), rowNumber);
                    Console.ReadKey();
                    break;

                case SensitivityMenu.display4:
                    //TODO Apply and display a change of a selected Basic Variable.
                    break;

                case SensitivityMenu.display5:
                    //TODO Display the range of a selected constraint right-hand-side value.
                    //Console.WriteLine("Enter the row Number: (Z Row = Row 0)");

                    //rowNumber = int.Parse(Console.ReadLine());

                    Console.WriteLine("Ranges for RHS variables");
                    SensivitityAnalysis.GetRangesForRHS(SensivitityAnalysis.GetFormatedSensistivityMatrix(linearProgram.LinearProgramMatrix), linearProgram);
                    Console.ReadKey();
                    break;

                case SensitivityMenu.display6:
                    //TODO Apply and display a change of a selected constraint right-hand-side value.
                    break;

                case SensitivityMenu.display7:
                    //TODO Display the range of a selected variable in a Non-Basic Variable column.
                    break;

                case SensitivityMenu.display8:
                    //TODO Apply and display a change of a selected variable in a Non-Basic Variable column.
                    Console.WriteLine("Under Construction");
                    Console.ReadKey();
                    break;

                case SensitivityMenu.display9:
                    //TODO Add a new activity to an optimal solution.
                    break;

                case SensitivityMenu.display10:
                    //TODO Add a new constraint to an optimal solution.
                    Console.WriteLine("Enter the X Number: (Z Row = Row 0)");

                    rowNumber = int.Parse(Console.ReadLine());

                    Console.WriteLine("Type:\n1. <= \n2 . >=");

                    int sign = int.Parse(Console.ReadLine());

                    Console.WriteLine("RHS:");

                    int rhs = int.Parse(Console.ReadLine());

                    linearProgram = LpTools.AddBasicConstraint(linearProgram, rowNumber, sign - 1, rhs);

                    Console.WriteLine("New Table");
                    linearProgram.DisplayCurrentTable();

                    LinearProgram newLP = (LinearProgram)linearProgram.Clone();

                    Dual dual = new Dual(newLP);

                    dual.Solve();

                    if (LpTools.CheckIfIPIsSolved(newLP))
                    {
                        linearProgram.DisplaySolution();
                    }
                    else
                    {
                        Console.WriteLine("No solution");
                        Console.ReadKey();
                    }

                    break;

                case SensitivityMenu.display11:
                    //TODO Display the shadow prices.
                    Console.WriteLine("shadow prices.");
                    SensivitityAnalysis.GetShadowPrices(SensivitityAnalysis.GetFormatedSensistivityMatrix(linearProgram.LinearProgramMatrix), linearProgram);
                    Console.ReadKey();
                    break;

                case SensitivityMenu.display12:
                    //TODO Duality

                    Duality duality = new Duality(linearProgram);

                    duality.DeterminDuality();
                    Console.ReadKey();

                    break;

                default:
                    break;
                }
            }
            catch (FormatException)
            {
                Console.WriteLine("Invalid Input");
            }
        }