Exemple #1
0
        [Authorize] // Запрещены анонимные обращения к данной странице
        public ActionResult RezultUniversal()
        {
            SteelMeltingMixtureDatabase _database = new SteelMeltingMixtureDatabase();

            List <Components>         components         = _database.Components.Where(p => p.Owner.ID_User == _users.CurrentUser.ID_User && p.IsSolve == true).ToList();
            List <Elements>           elements           = _database.Elements.Where(p => p.Owner.ID_User == _users.CurrentUser.ID_User && p.IsSolve == true).ToList();
            List <ComponentsElements> componentsElements = _database.ComponentsElements.Where(p => p.Owner.ID_User == _users.CurrentUser.ID_User && p.IsSolve == true).ToList();

            SolverUniversalModel sm = new SolverUniversalModel(
                _users,
                components,
                elements,
                componentsElements
                );

            // максимальное количество методов раскроя заготовок
            int _maxComponents = _database.Components.Count(o => o.Owner.ID_User == _users.CurrentUser.ID_User && o.IsSolve == true);

            double[] val        = new double[_maxComponents + 1];
            var      db_variant = _database.Variants.Where(p => p.Owner.ID_User == _users.CurrentUser.ID_User).FirstOrDefault();

            val = sm.SolverSteelMeltingMixture(db_variant);

            // ! Save input data to Session
            //Session["input_data"] = input_data;

            List <double> lst = val.OfType <double>().ToList();

            ViewBag.Rashet = lst;

            //return View(input_data);
            return(View());
        }
        public ActionResult Index(Object sender)
        {
            SteelMeltingMixtureDatabase _database = new SteelMeltingMixtureDatabase();

            _database.ComponentsElements.RemoveRange(_database.ComponentsElements.Where(o => o.Owner.ID_User == _users.CurrentUser.ID_User));
            _database.SaveChanges();

            return(RedirectToAction("Index"));
        }
            public SimpleMembershipInitializer()
            {
                Database.SetInitializer <SteelMeltingMixtureDatabase>(null);

                try
                {
                    using (var context = new SteelMeltingMixtureDatabase())
                    {
                        if (!context.Database.Exists())
                        {
                            // Создание базы данных SimpleMembership без применения миграции Entity Framework
                            ((IObjectContextAdapter)context).ObjectContext.CreateDatabase();
                        }
                    }
                    // Настройка  ASP.NET Simple Membership
                    // 1 параметр - имя строки подключения к базе данных.
                    // 2 параметр - таблица, которая содержит информацию о пользователях
                    // 3 параметр - имя колонки в таблице, которая отвечает за хранение логина
                    // 4 параметр - autoCreateTables автоматическое создание таблиц если они не существуют в базе
                    WebSecurity.InitializeDatabaseConnection("SteelMeltingMixtureConnection", "UserProfile", "ID_User", "UserName", autoCreateTables: true);

                    SimpleRoleProvider       roles      = (SimpleRoleProvider)Roles.Provider;
                    SimpleMembershipProvider membership = (SimpleMembershipProvider)Membership.Provider;

                    // Проверка наличия роли Admin
                    if (!roles.RoleExists("Admin"))
                    {
                        roles.CreateRole("Admin");
                    }

                    // Проверка наличия роли Operator
                    if (!roles.RoleExists("Operator"))
                    {
                        roles.CreateRole("Operator");
                    }

                    // Поиск пользователя с логином admin для роли Admin
                    if (membership.GetUser("admin", false) == null)
                    {
                        membership.CreateUserAndAccount("admin", "qwe123");          // создание пользователя
                        roles.AddUsersToRoles(new[] { "admin" }, new[] { "Admin" }); // установка роли для пользователя
                    }

                    //// Поиск пользователя с логином user1 для роли Operator
                    //if (membership.GetUser("user1", false) == null)
                    //{
                    //    membership.CreateUserAndAccount("user1", "qwe123"); // создание пользователя
                    //    roles.AddUsersToRoles(new[] { "user1" }, new[] { "Operator" }); // установка роли для пользователя
                    //}
                }
                catch (Exception ex)
                {
                    throw new InvalidOperationException("The ASP.NET Simple Membership database could not be initialized. For more information, please see http://go.microsoft.com/fwlink/?LinkId=256588", ex);
                }
            }
        public ActionResult ExternalLoginConfirmation(RegisterExternalLoginModel model, string returnUrl)
        {
            string provider       = null;
            string providerUserId = null;

            if (User.Identity.IsAuthenticated || !OAuthWebSecurity.TryDeserializeProviderUserId(model.ExternalLoginData, out provider, out providerUserId))
            {
                return(RedirectToAction("Manage"));
            }

            if (ModelState.IsValid)
            {
                // Insert a new user into the database
                using (SteelMeltingMixtureDatabase db = new SteelMeltingMixtureDatabase())
                {
                    UserProfile user = db.UserProfiles.FirstOrDefault(u => u.UserName.ToLower() == model.UserName.ToLower());
                    // Check if user already exists
                    if (user == null)
                    {
                        // Insert name into the profile table
                        db.UserProfiles.Add(new UserProfile {
                            UserName = model.UserName
                        });
                        db.SaveChanges();

                        OAuthWebSecurity.CreateOrUpdateAccount(provider, providerUserId, model.UserName);
                        OAuthWebSecurity.Login(provider, providerUserId, createPersistentCookie: false);

                        return(RedirectToLocal(returnUrl));
                    }
                    else
                    {
                        ModelState.AddModelError("UserName", "Пользователь с таким именем уже существует. Пожалуйста, введите другое имя.");
                    }
                }
            }

            ViewBag.ProviderDisplayName = OAuthWebSecurity.GetOAuthClientData(provider).DisplayName;
            ViewBag.ReturnUrl           = returnUrl;
            return(View(model));
        }
Exemple #5
0
        public double[] SolverSteelMeltingMixture(Variants variants)
        {
            _variants = variants;

            #region --- Решение с использованием Solver Foundation

            SteelMeltingMixtureDatabase _database  = new SteelMeltingMixtureDatabase();
            List <SolverRowModel>       solverList = new List <SolverRowModel>();
            double[] mKoefNerav = new double[_components.Count];

            // заполнить списки
            int countItemComponents = 0;
            foreach (Components itemComponents in _components)
            {
                int countItemElements = 0;
                foreach (Elements itemElements in _elements)
                {
                    var db_ValElement = _database.ComponentsElements
                                        .Where(p => p.ID_Component == itemComponents.ID_Component &&
                                               p.ID_Element == itemElements.ID_Element &&
                                               p.ID_Variant == _variants.ID_Variant &&
                                               p.Owner.ID_User == _users.CurrentUser.ID_User &&
                                               p.IsSolve == true)
                                        .FirstOrDefault();
                    mKoefNerav[countItemElements] = 0.01 * db_ValElement.Val;
                    countItemElements++;
                }

                var db_Components = _database.Components
                                    .Where(p => p.ID_Component == itemComponents.ID_Component &&
                                           p.Owner.ID_User == _users.CurrentUser.ID_User &&
                                           p.IsSolve == true)
                                    .FirstOrDefault();

                switch (_maxElements)
                {
                case 2:

                    solverList.Add(new SolverRowModel
                    {
                        xId        = countItemComponents + 1,
                        Koef       = 0.01 * db_Components.Cost,
                        Min        = db_Components.MinValComponent,
                        Max        = db_Components.MaxValComponent,
                        KoefNerav1 = mKoefNerav[0],
                        KoefNerav2 = mKoefNerav[1]
                    });

                    break;

                case 3:
                    solverList.Add(new SolverRowModel
                    {
                        xId        = countItemComponents + 1,
                        Koef       = 0.01 * db_Components.Cost,
                        Min        = db_Components.MinValComponent,
                        Max        = db_Components.MaxValComponent,
                        KoefNerav1 = mKoefNerav[0],
                        KoefNerav2 = mKoefNerav[1],
                        KoefNerav3 = mKoefNerav[2],
                    });
                    break;

                case 4:
                    solverList.Add(new SolverRowModel
                    {
                        xId        = countItemComponents + 1,
                        Koef       = 0.01 * db_Components.Cost,
                        Min        = db_Components.MinValComponent,
                        Max        = db_Components.MaxValComponent,
                        KoefNerav1 = mKoefNerav[0],
                        KoefNerav2 = mKoefNerav[1],
                        KoefNerav3 = mKoefNerav[2],
                        KoefNerav4 = mKoefNerav[3],
                    });
                    break;

                default:
                    break;
                }
                countItemComponents++;
            }

            SolverContext context = SolverContext.GetContext();
            Model         model   = context.CreateModel();

            Set users = new Set(Domain.Any, "users");

            Parameter k = new Parameter(Domain.Real, "Koef", users);
            k.SetBinding(solverList, "Koef", "xId");

            Parameter min = new Parameter(Domain.Real, "Min", users);
            min.SetBinding(solverList, "Min", "xId");

            Parameter max = new Parameter(Domain.Real, "Max", users);
            max.SetBinding(solverList, "Max", "xId");

            Parameter[] KoefNerav = new Parameter[_maxElements];

            for (int i = 0; i < KoefNerav.Length; i++)
            {
                KoefNerav[i] = new Parameter(Microsoft.SolverFoundation.Services.Domain.Real, "KoefNerav" + (i + 1).ToString(), users);
                KoefNerav[i].SetBinding(solverList, "KoefNerav" + (i + 1).ToString(), "xId");
            }

            Parameter[] KoefNeravRows = new Parameter[3 + _maxElements];
            KoefNeravRows[0] = k;
            KoefNeravRows[1] = min;
            KoefNeravRows[2] = max;
            for (int i = 3; i < KoefNeravRows.Length; i++) // заполняем, начиная с 3 элемента
            {
                KoefNeravRows[i] = KoefNerav[i - 3];
            }

            model.AddParameters(KoefNeravRows);

            Decision choose = new Decision(Domain.RealNonnegative, "choose", users);
            model.AddDecision(choose);

            model.AddGoal("goal", GoalKind.Minimize, Model.Sum(Model.ForEach(users, xId => choose[xId] * k[xId])));

            // Добавить ограничения-неравенства по каждому химическому элементу
            int count = 0;
            foreach (Elements itemElements in _elements)
            {
                var db_MinValElement = _database.Elements
                                       .Where(p => p.ID_Element == itemElements.ID_Element &&
                                              p.Owner.ID_User == _users.CurrentUser.ID_User &&
                                              p.IsSolve == true)
                                       .FirstOrDefault();
                model.AddConstraint("Nerav_Max_" + (count + 1).ToString(), Model.Sum(Model.ForEach(users, xId => KoefNeravRows[count + 3][xId] * choose[xId])) <= db_MinValElement.MaxValElement);
                model.AddConstraint("Nerav_Min_" + (count + 1).ToString(), Model.Sum(Model.ForEach(users, xId => KoefNeravRows[count + 3][xId] * choose[xId])) >= db_MinValElement.MinValElement);
                count++;
            }

            // Добавить прямые ограничения по каждой переменной
            model.AddConstraint("c_choose", Model.ForEach(users, xId => (min[xId] <= choose[xId] <= max[xId])));

            // Добавить ограничение по сумме всех переменных, сумма = 100 %
            model.AddConstraint("c_sum", Model.Sum(Model.ForEach(users, xId => choose[xId])) == 100);

            try
            {
                Solution solution = context.Solve();
                Report   report   = solution.GetReport();

                String reportStr = "";

                for (int i = 0; i < solverList.Count; i++)
                {
                    reportStr += "Значение X" + (i + 1).ToString() + ": " + choose.GetDouble(solverList[i].xId) + "\n";
                }
                reportStr += "\n" + report.ToString();

                //MessageBox.Show(reportStr);
            }
            catch (Exception ex)
            {
                //MessageBox.Show("При решении задачи оптимизации возникла исключительная ситуация");
            }

            #endregion --- Решение с использованием Solver Foundation

            #region --- Формирование массива с результатами расчета

            double[] out_values = new double[_maxComponents + 1]; // для каждого Xi + величина целевой функции

            double SumCost = 0;                                   // целевая функция (суммарная стоимость шихты)
            for (int i = 0; i < out_values.Length - 1; i++)
            {
                out_values[i] = Math.Round(choose.GetDouble(solverList[i].xId), 2);
                SumCost       = SumCost + Math.Round(solverList[i].Koef * choose.GetDouble(solverList[i].xId), 2);
            }
            out_values[_maxComponents] = Math.Round(SumCost, 2); // последний элемент массива - это целевая функция (суммарная стоимость шихты)

            #endregion --- Формирование массива с результатами расчета

            return(out_values);
        }