Example #1
0
        /// <summary>
        /// Dùng phương pháp tuyến tính tối ưu 3x + y với yêu cầu sau:
        /// 0	≤	x	≤	1
        /// 0	≤	y	≤	2
        ///     x + y	≤	2
        ///
        /// Kết quả:
        /// - Giá trị: 4
        /// - x = 1
        /// - y = 1
        ///
        /// Main steps in solving the problem
        /// - Create the variables
        /// - Define the constraints
        /// - Define the objective function
        /// - Declare the solver—the method that implements an algorithm for finding the optimal solution
        /// - Invoke the solver and display the results
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            // Create the linear solver with the GLOP backend.
            var solver = new Google.OrTools.LinearSolver.Solver("SimpleLpProgram", Google.OrTools.LinearSolver.Solver.GLOP_LINEAR_PROGRAMMING);

            // Create the variables x and y.
            var x = solver.MakeNumVar(0.0, 1.0, "x");
            var y = solver.MakeNumVar(0.0, 2.0, "y");

            Console.WriteLine("Number of variables = " + solver.NumVariables());

            // Create a linear constraint, 0 <= x + y <= 2.
            var ct = solver.MakeConstraint(0.0, 2.0, "ct");

            ct.SetCoefficient(x, 1);
            ct.SetCoefficient(y, 1);

            Console.WriteLine("Number of constraints = " + solver.NumConstraints());

            // Create the objective function, 3 * x + y.
            var objective = solver.Objective();

            objective.SetCoefficient(x, 3);
            objective.SetCoefficient(y, 1);
            objective.SetMaximization();

            solver.Solve();

            Console.WriteLine("Solution:");
            Console.WriteLine("Objective value = " + objective.Value());
            Console.WriteLine("x = " + x.SolutionValue());
            Console.WriteLine("y = " + y.SolutionValue());

            Console.ReadLine();
        }
Example #2
0
        /// <summary>
        /// feasible_region.png
        /// Dùng phương pháp tuyến tính Glop tối ưu 3x + 4y với yêu cầu sau:
        /// x + 2y	≤	14
        /// 3x – y	≥	0
        /// x – y	≤	2
        ///
        /// Kết quả:
        /// x = 6.0
        /// y = 4.0
        /// Giá trị = 34.0
        ///
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            var solver = new Google.OrTools.LinearSolver.Solver("LinearProgrammingExample", Google.OrTools.LinearSolver.Solver.GLOP_LINEAR_PROGRAMMING);
            // x and y are continuous non-negative variables.
            var x = solver.MakeNumVar(0.0, double.PositiveInfinity, "x");
            var y = solver.MakeNumVar(0.0, double.PositiveInfinity, "y");

            // x + 2y <= 14.
            var c0 = solver.MakeConstraint(double.NegativeInfinity, 14.0);

            c0.SetCoefficient(x, 1);
            c0.SetCoefficient(y, 2);

            // 3x - y >= 0.
            var c1 = solver.MakeConstraint(0.0, double.PositiveInfinity);

            c1.SetCoefficient(x, 3);
            c1.SetCoefficient(y, -1);

            // x - y <= 2.
            var c2 = solver.MakeConstraint(double.NegativeInfinity, 2.0);

            c2.SetCoefficient(x, 1);
            c2.SetCoefficient(y, -1);

            // Objective function: 3x + 4y.
            var objective = solver.Objective();

            objective.SetCoefficient(x, 3);
            objective.SetCoefficient(y, 4);
            objective.SetMaximization();

            solver.Solve();

            Console.WriteLine("Number of variables = " + solver.NumVariables());
            Console.WriteLine("Number of constraints = " + solver.NumConstraints());
            // The value of each variable in the solution.
            Console.WriteLine("Solution:");
            Console.WriteLine("x = " + x.SolutionValue());
            Console.WriteLine("y = " + y.SolutionValue());
            // The objective value of the solution.
            Console.WriteLine("Optimal objective value = " + solver.Objective().Value());

            Console.ReadLine();
        }
Example #3
0
        /// <summary>
        /// Chế độ ăn kiêng Stigler
        ///
        /// Chất dinh dưỡng             Lượng khuyến nghị hàng ngày
        /// Calo                        3.000 Calo
        /// Chất đạm                    70 gram
        /// Canxi                       .8 gam
        /// Bàn là                      12 miligam
        /// Vitamin A                   5.000 IU
        /// Thiamine (Vitamin B1)       1,8 miligam
        /// Riboflavin (Vitamin B2)     2,7 miligam
        /// Niacin                      18 miligam
        /// Axit ascoricic (Vitamin C)  75 miligam
        ///
        /// Thực phẩm đánh giá 1944 theo các cột
        /// Tên thực phẩm, Đơn vị, Giá 1939(cents),	Calo, Protein(g), Canxi(g), Sắt(mg), Vitamin A(IU), Thiamine(mg), Riboflavin(mg), Niacin(mg), Axit ascoricic(mg)
        ///
        /// Untitled.png
        ///
        /// Kết quả:
        /// Wheat Flour (Enriched) = 0.029519
        /// Liver (Beef) = 0.001893
        /// Cabbage = 0.011214
        /// Spinach = 0.005008
        /// Navy Beans, Dried = 0.061029
        /// Optimal annual price: $39.66
        ///
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            var data = new object[][] {
                new object[] { "Wheat Flour (Enriched)", "10 lb.", 36, 44.7, 1411, 2, 365, 0, 55.4, 33.3, 441, 0 },
                new object[] { "Macaroni", "1 lb.", 14.1, 11.6, 418, 0.7, 54, 0, 3.2, 1.9, 68, 0 },
                new object[] { "Wheat Cereal (Enriched)", "28 oz.", 24.2, 11.8, 377, 14.4, 175, 0, 14.4, 8.8, 114, 0 },
                new object[] { "Corn Flakes", "8 oz.", 7.1, 11.4, 252, 0.1, 56, 0, 13.5, 2.3, 68, 0 },
                new object[] { "Corn Meal", "1 lb.", 4.6, 36.0, 897, 1.7, 99, 30.9, 17.4, 7.9, 106, 0 },
                new object[] { "Hominy Grits", "24 oz.", 8.5, 28.6, 680, 0.8, 80, 0, 10.6, 1.6, 110, 0 },
                new object[] { "Rice", "1 lb.", 7.5, 21.2, 460, 0.6, 41, 0, 2, 4.8, 60, 0 },
                new object[] { "Rolled Oats", "1 lb.", 7.1, 25.3, 907, 5.1, 341, 0, 37.1, 8.9, 64, 0 },
                new object[] { "White Bread (Enriched)", "1 lb.", 7.9, 15.0, 488, 2.5, 115, 0, 13.8, 8.5, 126, 0 },
                new object[] { "Whole Wheat Bread", "1 lb.", 9.1, 12.2, 484, 2.7, 125, 0, 13.9, 6.4, 160, 0 },
                new object[] { "Rye Bread", "1 lb.", 9.1, 12.4, 439, 1.1, 82, 0, 9.9, 3, 66, 0 },
                new object[] { "Pound Cake", "1 lb.", 24.8, 8.0, 130, 0.4, 31, 18.9, 2.8, 3, 17, 0 },
                new object[] { "Soda Crackers", "1 lb.", 15.1, 12.5, 288, 0.5, 50, 0, 0, 0, 0, 0 },
                new object[] { "Milk", "1 qt.", 11, 6.1, 310, 10.5, 18, 16.8, 4, 16, 7, 177 },
                new object[] { "Evaporated Milk (can)", "14.5 oz.", 6.7, 8.4, 422, 15.1, 9, 26, 3, 23.5, 11, 60 },
                new object[] { "Butter", "1 lb.", 30.8, 10.8, 9, 0.2, 3, 44.2, 0, 0.2, 2, 0 },
                new object[] { "Oleomargarine", "1 lb.", 16.1, 20.6, 17, 0.6, 6, 55.8, 0.2, 0, 0, 0 },
                new object[] { "Eggs", "1 doz.", 32.6, 2.9, 238, 1.0, 52, 18.6, 2.8, 6.5, 1, 0 },
                new object[] { "Cheese (Cheddar)", "1 lb.", 24.2, 7.4, 448, 16.4, 19, 28.1, 0.8, 10.3, 4, 0 },
                new object[] { "Cream", "1/2 pt.", 14.1, 3.5, 49, 1.7, 3, 16.9, 0.6, 2.5, 0, 17 },
                new object[] { "Peanut Butter", "1 lb.", 17.9, 15.7, 661, 1.0, 48, 0, 9.6, 8.1, 471, 0 },
                new object[] { "Mayonnaise", "1/2 pt.", 16.7, 8.6, 18, 0.2, 8, 2.7, 0.4, 0.5, 0, 0 },
                new object[] { "Crisco", "1 lb.", 20.3, 20.1, 0, 0, 0, 0, 0, 0, 0, 0 },
                new object[] { "Lard", "1 lb.", 9.8, 41.7, 0, 0, 0, 0.2, 0, 0.5, 5, 0 },
                new object[] { "Sirloin Steak", "1 lb.", 39.6, 2.9, 166, 0.1, 34, 0.2, 2.1, 2.9, 69, 0 },
                new object[] { "Round Steak", "1 lb.", 36.4, 2.2, 214, 0.1, 32, 0.4, 2.5, 2.4, 87, 0 },
                new object[] { "Rib Roast", "1 lb.", 29.2, 3.4, 213, 0.1, 33, 0, 0, 2, 0, 0 },
                new object[] { "Chuck Roast", "1 lb.", 22.6, 3.6, 309, 0.2, 46, 0.4, 1, 4, 120, 0 },
                new object[] { "Plate", "1 lb.", 14.6, 8.5, 404, 0.2, 62, 0, 0.9, 0, 0, 0 },
                new object[] { "Liver (Beef)", "1 lb.", 26.8, 2.2, 333, 0.2, 139, 169.2, 6.4, 50.8, 316, 525 },
                new object[] { "Leg of Lamb", "1 lb.", 27.6, 3.1, 245, 0.1, 20, 0, 2.8, 3.9, 86, 0 },
                new object[] { "Lamb Chops (Rib)", "1 lb.", 36.6, 3.3, 140, 0.1, 15, 0, 1.7, 2.7, 54, 0 },
                new object[] { "Pork Chops", "1 lb.", 30.7, 3.5, 196, 0.2, 30, 0, 17.4, 2.7, 60, 0 },
                new object[] { "Pork Loin Roast", "1 lb.", 24.2, 4.4, 249, 0.3, 37, 0, 18.2, 3.6, 79, 0 },
                new object[] { "Bacon", "1 lb.", 25.6, 10.4, 152, 0.2, 23, 0, 1.8, 1.8, 71, 0 },
                new object[] { "Ham, smoked", "1 lb.", 27.4, 6.7, 212, 0.2, 31, 0, 9.9, 3.3, 50, 0 },
                new object[] { "Salt Pork", "1 lb.", 16, 18.8, 164, 0.1, 26, 0, 1.4, 1.8, 0, 0 },
                new object[] { "Roasting Chicken", "1 lb.", 30.3, 1.8, 184, 0.1, 30, 0.1, 0.9, 1.8, 68, 46 },
                new object[] { "Veal Cutlets", "1 lb.", 42.3, 1.7, 156, 0.1, 24, 0, 1.4, 2.4, 57, 0 },
                new object[] { "Salmon, Pink (can)", "16 oz.", 13, 5.8, 705, 6.8, 45, 3.5, 1, 4.9, 209, 0 },
                new object[] { "Apples", "1 lb.", 4.4, 5.8, 27, 0.5, 36, 7.3, 3.6, 2.7, 5, 544 },
                new object[] { "Bananas", "1 lb.", 6.1, 4.9, 60, 0.4, 30, 17.4, 2.5, 3.5, 28, 498 },
                new object[] { "Lemons", "1 doz.", 26, 1.0, 21, 0.5, 14, 0, 0.5, 0, 4, 952 },
                new object[] { "Oranges", "1 doz.", 30.9, 2.2, 40, 1.1, 18, 11.1, 3.6, 1.3, 10, 1998 },
                new object[] { "Green Beans", "1 lb.", 7.1, 2.4, 138, 3.7, 80, 69, 4.3, 5.8, 37, 862 },
                new object[] { "Cabbage", "1 lb.", 3.7, 2.6, 125, 4.0, 36, 7.2, 9, 4.5, 26, 5369 },
                new object[] { "Carrots", "1 bunch", 4.7, 2.7, 73, 2.8, 43, 188.5, 6.1, 4.3, 89, 608 },
                new object[] { "Celery", "1 stalk", 7.3, 0.9, 51, 3.0, 23, 0.9, 1.4, 1.4, 9, 313 },
                new object[] { "Lettuce", "1 head", 8.2, 0.4, 27, 1.1, 22, 112.4, 1.8, 3.4, 11, 449 },
                new object[] { "Onions", "1 lb.", 3.6, 5.8, 166, 3.8, 59, 16.6, 4.7, 5.9, 21, 1184 },
                new object[] { "Potatoes", "15 lb.", 34, 14.3, 336, 1.8, 118, 6.7, 29.4, 7.1, 198, 2522 },
                new object[] { "Spinach", "1 lb.", 8.1, 1.1, 106, 0, 138, 918.4, 5.7, 13.8, 33, 2755 },
                new object[] { "Sweet Potatoes", "1 lb.", 5.1, 9.6, 138, 2.7, 54, 290.7, 8.4, 5.4, 83, 1912 },
                new object[] { "Peaches (can)", "No. 2 1/2", 16.8, 3.7, 20, 0.4, 10, 21.5, 0.5, 1, 31, 196 },
                new object[] { "Pears (can)", "No. 2 1/2", 20.4, 3.0, 8, 0.3, 8, 0.8, 0.8, 0.8, 5, 81 },
                new object[] { "Pineapple (can)", "No. 2 1/2", 21.3, 2.4, 16, 0.4, 8, 2, 2.8, 0.8, 7, 399 },
                new object[] { "Asparagus (can)", "No. 2", 27.7, 0.4, 33, 0.3, 12, 16.3, 1.4, 2.1, 17, 272 },
                new object[] { "Green Beans (can)", "No. 2", 10, 1.0, 54, 2, 65, 53.9, 1.6, 4.3, 32, 431 },
                new object[] { "Pork and Beans (can)", "16 oz.", 7.1, 7.5, 364, 4, 134, 3.5, 8.3, 7.7, 56, 0 },
                new object[] { "Corn (can)", "No. 2", 10.4, 5.2, 136, 0.2, 16, 12, 1.6, 2.7, 42, 218 },
                new object[] { "Peas (can)", "No. 2", 13.8, 2.3, 136, 0.6, 45, 34.9, 4.9, 2.5, 37, 370 },
                new object[] { "Tomatoes (can)", "No. 2", 8.6, 1.3, 63, 0.7, 38, 53.2, 3.4, 2.5, 36, 1253 },
                new object[] { "Tomato Soup (can)", "10 1/2 oz.", 7.6, 1.6, 71, 0.6, 43, 57.9, 3.5, 2.4, 67, 862 },
                new object[] { "Peaches, Dried", "1 lb.", 15.7, 8.5, 87, 1.7, 173, 86.8, 1.2, 4.3, 55, 57 },
                new object[] { "Prunes, Dried", "1 lb.", 9, 12.8, 99, 2.5, 154, 85.7, 3.9, 4.3, 65, 257 },
                new object[] { "Raisins, Dried", "15 oz.", 9.4, 13.5, 104, 2.5, 136, 4.5, 6.3, 1.4, 24, 136 },
                new object[] { "Peas, Dried", "1 lb.", 7.9, 20.0, 1367, 4.2, 345, 2.9, 28.7, 18.4, 162, 0 },
                new object[] { "Lima Beans, Dried", "1 lb.", 8.9, 17.4, 1055, 3.7, 459, 5.1, 26.9, 38.2, 93, 0 },
                new object[] { "Navy Beans, Dried", "1 lb.", 5.9, 26.9, 1691, 11.4, 792, 0, 38.4, 24.6, 217, 0 },
                new object[] { "Coffee", "1 lb.", 22.4, 0, 0, 0, 0, 0, 4, 5.1, 50, 0 },
                new object[] { "Tea", "1/4 lb.", 17.4, 0, 0, 0, 0, 0, 0, 2.3, 42, 0 },
                new object[] { "Cocoa", "8 oz.", 8.6, 8.7, 237, 3, 72, 0, 2, 11.9, 40, 0 },
                new object[] { "Chocolate", "8 oz.", 16.2, 8.0, 77, 1.3, 39, 0, 0.9, 3.4, 14, 0 },
                new object[] { "Sugar", "10 lb.", 51.7, 34.9, 0, 0, 0, 0, 0, 0, 0, 0 },
                new object[] { "Corn Syrup", "24 oz.", 13.7, 14.7, 0, 0.5, 74, 0, 0, 0, 5, 0 },
                new object[] { "Molasses", "18 oz.", 13.6, 9.0, 0, 10.3, 244, 0, 1.9, 7.5, 146, 0 },
                new object[] { "Strawberry Preserves", "1 lb.", 20.5, 6.4, 11, 0.4, 7, 0.2, 0.2, 0.4, 3, 0 }
            };

            var nutrients = new object[][] {
                new object[] { "Calories (1000s)", 3 },
                new object[] { "Protein (grams)", 70 },
                new object[] { "Calcium (grams)", 0.8 },
                new object[] { "Iron (mg)", 12 },
                new object[] { "Vitamin A (1000 IU)", 5 },
                new object[] { "Vitamin B1 (mg)", 1.8 },
                new object[] { "Vitamin B2 (mg)", 2.7 },
                new object[] { "Niacin (mg)", 18 },
                new object[] { "Vitamin C (mg)", 75 }
            };

            var solver = new Google.OrTools.LinearSolver.Solver("SolveStigler", Google.OrTools.LinearSolver.Solver.GLOP_LINEAR_PROGRAMMING);

            //Declare an array to hold our nutritional data.
            var food = new Google.OrTools.LinearSolver.Variable[data.Length];

            //Objective: minimize the sum of (price-normalized) foods.
            var objective = solver.Objective();

            for (int i = 0; i < data.Length; i++)
            {
                food[i] = solver.MakeNumVar(0.0, double.PositiveInfinity, data[i][0].ToString());
                objective.SetCoefficient(food[i], 1);
            }
            objective.SetMinimization();

            //Create the constraints, one per nutrient.
            var constraints = new Google.OrTools.LinearSolver.Constraint[nutrients.Length];

            for (int i = 0; i < nutrients.Length; i++)
            {
                constraints[i] = solver.MakeConstraint(Convert.ToDouble(nutrients[i][1]), double.PositiveInfinity);
                for (int j = 0; j < data.Length; j++)
                {
                    constraints[i].SetCoefficient(food[j], Convert.ToDouble(data[j][i + 3]));
                }
            }

            var status = solver.Solve();

            if (status == Google.OrTools.LinearSolver.Solver.OPTIMAL)
            {
                //Display the amounts (in dollars) to purchase of each food.
                double price = 0;
                var    nutrs = new double[nutrients.Length];

                for (int i = 0; i < data.Length; i++)
                {
                    price += food[i].SolutionValue();
                    for (int j = 0; j < nutrients.Length; j++)
                    {
                        nutrs[j] += Convert.ToDouble(data[i][j + 3]) * food[i].SolutionValue();
                    }
                    if (food[i].SolutionValue() > 0)
                    {
                        Console.WriteLine(data[i][0] + " = " + food[i].SolutionValue().ToString("#0.000000"));
                    }
                }
                Console.WriteLine("Optimal annual price: " + (365 * price).ToString("#0.00"));

                Console.WriteLine("\n\nNutrient:");
                for (int i = 0; i < nutrients.Length; i++)
                {
                    Console.WriteLine(nutrients[i][0] + " = " + nutrs[i].ToString("#0.00") + " / " + Convert.ToDouble(nutrients[i][1]).ToString("#0.00"));
                }
            }
            else if (status == Google.OrTools.LinearSolver.Solver.FEASIBLE)
            {
                Console.WriteLine("A potentially suboptimal solution was found.");
            }
            else
            {
                Console.WriteLine("The solver could not solve the problem.");
            }

            Console.ReadLine();
        }