using System; using CenterSpace.NMath.Core; namespace CenterSpace.NMath.Examples.CSharp { class LinearProgrammingExample { /// <summary> /// A .NET example in C# showing how to solve a linear system using linear programming and /// the primal simplex method. /// </summary> static void Main( string[] args ) { // A farmer has 640 acres of farmland. It can be planted with wheat, barley, corn or a // combination of the three. The farmer wishes to maximize his profit subject to the // limits on land, fertilizer, and water. // Currently, wheat is $3.38/bushel. The farmer can expect a yield of 55 bushels/acre. double wheatPrice = 3.38; double wheatYield = 55.0; double wheatRevenuePerAcre = wheatPrice * wheatYield; // Currently, barley is $1.98/bushel. The farmer can expect a yield of 75 bushels/acre. double barleyPrice = 1.98; double barleyYield = 75.0; double barleyRevenuePerAcre = barleyPrice * barleyYield; // Currently, corn is $1.70/bushel. The farmer can expect a yield of 110 bushels/acre. double cornPrice = 1.70; double cornYield = 110.0; double cornRevenuePerAcre = cornPrice * cornYield; Console.WriteLine(); // Therefore, the objective function is: Console.Write( "Maximize " + wheatRevenuePerAcre + "w + " ); Console.WriteLine( barleyRevenuePerAcre + "b + " + cornRevenuePerAcre + "c" ); Console.WriteLine( "where" ); Console.WriteLine(); var revenue = new DoubleVector( wheatRevenuePerAcre, barleyRevenuePerAcre, cornRevenuePerAcre ); var lpProblem = new LinearProgrammingProblem( revenue ); // The farmer has 8,000 lbs of nitrogen fertilizer. Its known that wheat requires // 12 lb/acre, barley 5 lb/acre and corn 22 lb/acre. Console.WriteLine( "12w + 5b + 22c <= 8000" ); lpProblem.AddUpperBoundConstraint( new DoubleVector( 12.0, 5.0, 22.0 ), 8000.0 ); // The farmer has 22,000 lbs of phosphate fertilizer. Its known that wheat requires // 30 lb/acre, barley 8 lb/acre and corn 50 lb/acre. Console.WriteLine( "30w + 8b + 50c <= 22000" ); lpProblem.AddUpperBoundConstraint( new DoubleVector( 30.0, 8.0, 50.0 ), 22000.0 ); // The farmer has a permit for 1,000 acre-feet of water. Wheat requires 1.5 ft of water, // barley requires 0.7 and corn 2.2. Console.WriteLine( "1.5w + 0.7b + 2.2c <= 1200" ); lpProblem.AddUpperBoundConstraint( new DoubleVector( 1.5, 0.7, 2.2 ), 1200.0 ); // The farmer has a maximum of 640 acres for planting. Console.WriteLine( "w + b + c <= 640" ); lpProblem.AddUpperBoundConstraint( new DoubleVector( 1.0, 1.0, 1.0 ), 640.0 ); for ( int i = 0; i < revenue.Length; i++ ) { lpProblem.AddLowerBound( i, 0.0 ); } // Create an LP solver var solver = new PrimalSimplexSolver(); // Solve solver.Solve( lpProblem ); // Was a finite solution found? Console.WriteLine(); if ( solver.Result == PrimalSimplexSolver.SolveResult.Optimal ) { Console.WriteLine( "solution: " + solver.OptimalX.ToString( "f0" ) ); Console.WriteLine(); Console.WriteLine( "optimal value: " + solver.OptimalObjectiveFunctionValue.ToString( "f0" ) ); } Console.WriteLine(); // Lets say the farmer is also contractually obligated to farm at least 10 acres // of barley. Console.WriteLine( "Add variable bound: b >= 10" ); lpProblem.AddLowerBound( 1, 10.0 ); // Solve again solver.Solve( lpProblem ); // Good? Console.WriteLine(); if ( solver.Result == PrimalSimplexSolver.SolveResult.Optimal ) { Console.WriteLine( "solution: " + solver.OptimalX.ToString( "f0" ) ); Console.WriteLine(); Console.WriteLine( "optimal value: " + solver.OptimalObjectiveFunctionValue.ToString( "f0" ) ); } Console.WriteLine(); Console.WriteLine( "Press Enter Key" ); Console.Read(); } // Main } // class } // namespace← All NMath Code Examples