Пример #1
0
        /// <summary>
        /// The app main method.
        /// </summary>
        /// <param name="args">The arguments to the application.</param>
        private static void Main(string[] args)
        {
            var context = SolverContext.GetContext();
            var model   = context.CreateModel();

            // Defining houses
            var house1 = new Decision(Domain.Set(1), "House_1");
            var house2 = new Decision(Domain.Set(2), "House_2");
            var house3 = new Decision(Domain.Set(3), "House_3");
            var house4 = new Decision(Domain.Set(4), "House_4");
            var house5 = new Decision(Domain.Set(5), "House_5");

            model.AddDecisions(house1, house2, house3, house4, house5);

            // Defining nationalities
            var norwegian  = Define("Norwegian");
            var englishman = Define("Englishman");
            var swedish    = Define("Swedish");
            var danish     = Define("Danish");
            var german     = Define("German");

            model.AddDecisions(norwegian, englishman, swedish, danish, german);

            // Defining house colors
            var red    = Define("Red");
            var green  = Define("Green");
            var white  = Define("White");
            var blue   = Define("Blue");
            var yellow = Define("Yellow");

            model.AddDecisions(red, green, white, blue, yellow);

            // Defining pets
            var dog   = Define("Dog");
            var cat   = Define("Cat");
            var bird  = Define("Bird");
            var horse = Define("Horse");
            var fish  = Define("Fish");

            model.AddDecisions(dog, cat, bird, horse, fish);

            // Defining drinks
            var tea    = Define("Tea");
            var coffee = Define("Coffee");
            var milk   = Define("Milk");
            var beer   = Define("Beer");
            var water  = Define("Water");

            model.AddDecisions(tea, coffee, milk, beer, water);

            // Defining cigarettes
            var pallMall = Define("PallMall");
            var winfield = Define("Winfield");
            var marlboro = Define("Marlboro");
            var dunhill  = Define("Dunhill");
            var rothmans = Define("Rothmans");

            model.AddDecisions(pallMall, winfield, marlboro, dunhill, rothmans);

            // Defining the rules
            model.AddConstraints(
                "constraints",
                Model.AllDifferent(house1, house2, house3, house4, house5),
                Model.AllDifferent(norwegian, englishman, swedish, danish, german),
                Model.AllDifferent(red, green, white, blue, yellow),
                Model.AllDifferent(dog, cat, bird, horse, fish),
                Model.AllDifferent(tea, coffee, milk, beer, water),
                Model.AllDifferent(pallMall, winfield, marlboro, dunhill, rothmans),
                englishman == red,                /* rule #1 */
                swedish == dog,                   /* rule #2 */
                danish == tea,                    /* rule #3 */
                white - green == 1,               /* rule #4 */
                house1 == norwegian,              /* rule #5 */
                green == coffee,                  /* rule #6 */
                pallMall == bird,                 /* rule #7 */
                house3 == milk,                   /* rule #8 */
                dunhill == yellow,                /* rule #9 */
                Model.Abs(marlboro - cat) == 1,   /* rule #10 */
                Model.Abs(horse - dunhill) == 1,  /* rule #11 */
                winfield == beer,                 /* rule #12 */
                Model.Abs(norwegian - blue) == 1, /* rule #13 */
                german == rothmans,               /* rule #14 */
                Model.Abs(marlboro - water) == 1 /* rule #15 */);

            var solution = context.Solve(new ConstraintProgrammingDirective());
            var report   = solution.GetReport();

            Console.Write(report);

            foreach (var decision in solution.Decisions)
            {
                if (decision.Name == fish.Name)
                {
                    Console.WriteLine(new string('-', 50));
                    Console.WriteLine("Solution: The 'Fish' lives at house #{0}", decision.GetString());
                    Console.WriteLine(new string('-', 50));
                }
            }

            Console.WriteLine("Press [Enter] To Exit...");
            Console.ReadLine();
        }
Пример #2
0
        public void CalculateRecipeLP(DataRow finalAnalog, DataTable closenessAnalogs)
        {
            var solver = SolverContext.GetContext();

            solver.ClearModel();
            var model = solver.CreateModel();

            Term generalError = 0; //функция которую минимизируем

            double sul_0  = Convert.ToDouble(textBoxSUL.Text);
            double V350_0 = Convert.ToDouble(textBox350.Text);
            double par_0  = Convert.ToDouble(textBoxPAR.Text);
            double SPG_0  = Convert.ToDouble(textBoxSPG.Text);
            double CST_0  = Convert.ToDouble(textBoxCST.Text);

            Term mixSul  = 0;
            Term mixV350 = 0;
            Term mixPar  = 0;
            Term mixSPG  = 0;
            Term mixCST  = 0;

            Term generalConstraint = 0;// сумма рецепта = 1

            for (int i = 0; i < Convert.ToInt32(closenessAnalogs.Rows.Count); i++)
            {
                Decision alpha = new Decision(Domain.RealRange(0, 1), $"alpha{i}");
                model.AddDecision(alpha);
                model.AddConstraint($"constraintAlpha{i}", 0 <= alpha <= 1);

                mixSul  += alpha * Convert.ToDouble(closenessAnalogs.Rows[i]["Сера"]);
                mixV350 += alpha * Convert.ToDouble(closenessAnalogs.Rows[i]["Выход 350С"]);
                mixPar  += alpha * Convert.ToDouble(closenessAnalogs.Rows[i]["Парафины"]);
                mixSPG  += alpha / Convert.ToDouble(closenessAnalogs.Rows[i]["Плотность"]);
                mixCST  += alpha * Convert.ToDouble(closenessAnalogs.Rows[i]["Вязкость"]) /
                           Convert.ToDouble(closenessAnalogs.Rows[i]["Плотность"]);
                generalConstraint += alpha;
            }
            mixSPG = 1 / mixSPG;
            mixCST = mixCST * mixSPG;

            model.AddConstraint($"sumAlpha", generalConstraint == 1);

            //TODO: Проверка делителей на 0
            generalError = Convert.ToDouble(textBox11.Text) * Model.Abs((mixSul - sul_0) / sul_0) +
                           Convert.ToDouble(textBox7.Text) * Model.Abs((mixV350 - V350_0) / V350_0) +
                           Convert.ToDouble(textBox8.Text) * Model.Abs((mixPar - par_0) / par_0) +
                           Convert.ToDouble(textBox9.Text) * Model.Abs((mixSPG - SPG_0) / SPG_0) +
                           Convert.ToDouble(textBox10.Text) * Model.Abs((mixCST - CST_0) / CST_0);
            model.AddGoal("ComplicatedGoal", GoalKind.Minimize, generalError);

            var solution  = solver.Solve();
            var solutions = solution.Decisions.ToList();

            label13.Text = $"Целевая функция = {Math.Round(solution.Goals.First().ToDouble(), 4)}";

            for (int i = 0; i < solutions.Count(); i++)
            {
                closenessAnalogs.Rows[i]["Рецепт"] = solutions[i].ToDouble();
                var a = solutions[i].ToDouble();
            }
            foreach (DataRow a in closenessAnalogs.Rows)
            {
                finalAnalog["Сера"]       = Convert.ToDouble(finalAnalog["Сера"]) + Convert.ToDouble(a["Рецепт"]) * Convert.ToDouble(a["Сера"]);
                finalAnalog["Выход 350С"] = Convert.ToDouble(finalAnalog["Выход 350С"]) + Convert.ToDouble(a["Рецепт"]) * Convert.ToDouble(a["Выход 350С"]);
                finalAnalog["Парафины"]   = Convert.ToDouble(finalAnalog["Парафины"]) + Convert.ToDouble(a["Рецепт"]) * Convert.ToDouble(a["Парафины"]);
                finalAnalog["Плотность"]  = Convert.ToDouble(finalAnalog["Плотность"]) + Convert.ToDouble(a["Рецепт"]) * Convert.ToDouble(a["Плотность"]);
                finalAnalog["Вязкость"]   = Convert.ToDouble(finalAnalog["Вязкость"]) + Convert.ToDouble(a["Рецепт"]) * Convert.ToDouble(a["Вязкость"]);

                finalAnalog["Рецепт"]     = Convert.ToDouble(finalAnalog["Рецепт"]) + Convert.ToDouble(a["Рецепт"]);
                finalAnalog["Расстояние"] = CalculateDistance(finalAnalog);
                a["Рецепт"]           = Math.Round(Convert.ToDouble(a["Рецепт"]), 4);
                finalAnalog["Рецепт"] = Math.Round(Convert.ToDouble(finalAnalog["Рецепт"]), 4);
            }
        }