/// <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(); }
/// <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(); }
/// <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(); }