Ejemplo n.º 1
0
        // Configuration for engine / gears combinations
        public void ConfigureFirstDomain(EngineType engine)
        {
            Console.WriteLine("Engine / Gears");
            // Create model
            CpModel model = new CpModel();

            IntVar gas      = model.NewBoolVar("gas");
            IntVar electric = model.NewBoolVar("electric");

            IntVar manual    = model.NewBoolVar("manual");
            IntVar automatic = model.NewBoolVar("automatic");

            model.AddBoolXor(new[] { electric, gas });
            model.AddBoolOr(new[] { manual, automatic });
            model.Add(electric != manual);

            // Instantiate Solver
            CpSolver solver = new CpSolver();

            // Create SolutionPrinter as callback method
            SolutionPrinter cb =
                new SolutionPrinter(new IntVar[] { gas, electric, manual, automatic });

            solver.SearchAllSolutions(model, cb);
            Console.WriteLine(String.Format("Number of solutions found: {0}",
                                            cb.SolutionCount()));

            var firstDomain = cb.FeasibleSolutions();
            var engines     = _engineService.Get();
            var gears       = _gearService.Get();

            string gearType      = null;;
            string manualGear    = null;
            string automaticGear = null;

            if (engine == EngineType.Gas)
            {
                var index = firstDomain.FindIndex(x => x.Identifier == gas.ShortString() && x.State == 1);

                foreach (var s in firstDomain)
                {
                    if (firstDomain[index + 2].State == 1 && firstDomain[index + 3].State == 1)
                    {
                        manualGear    = firstDomain[index + 2].Identifier;
                        automaticGear = firstDomain[index + 3].Identifier;
                    }
                }

                List <Gear>   feasibleGears   = gears.FindAll(x => x.type == manualGear || x.type == automaticGear);
                List <Engine> feasibleEngines = engines.FindAll(x => x.type == gas.ShortString());

                feasible_engines_ = feasibleEngines;
                feasible_gears_   = feasibleGears;
            }

            if (engine == EngineType.Electric)
            {
                var index = firstDomain.FindIndex(x => x.Identifier == electric.ShortString() && x.State == 1);

                if (firstDomain[index + 2].State == 1)
                {
                    gearType = firstDomain[index + 2].Identifier;
                }

                List <Gear>   feasibleGears   = gears.FindAll(x => x.type == gearType);
                List <Engine> feasibleEngines = engines.FindAll(x => x.type == electric.ShortString());

                feasible_engines_ = feasibleEngines;
                feasible_gears_   = feasibleGears;
            }
        }