Example #1
0
        private static DataModel GetDataModel(string currentItem)
        {
            string score = currentItem.Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries)[0];

            int scoreFirstCommand  = int.Parse(score.Split(new[] { "-" }, StringSplitOptions.RemoveEmptyEntries)[0]);
            int scoreSecondCommand = int.Parse(score.Split(new[] { "-" }, StringSplitOptions.RemoveEmptyEntries)[1]);

            return(new DataModel
            {
                Score = score,
                ScoreFirstCommand = scoreFirstCommand,
                ScoreSecondCommand = scoreSecondCommand,
                Probability = double.Parse(currentItem.Split(new[] { "|" }, StringSplitOptions.RemoveEmptyEntries)[1]),
                ResultCommand = ProbabilityProvider.GetResultCommand(scoreFirstCommand, scoreSecondCommand)
            });
        }
Example #2
0
        private void btn1_Click(object sender, RoutedEventArgs e)
        {
            ForecastModel forecastModel = InitProvider.GetForecastModel();

            #region validation
            Regex timeRegexp  = new Regex(@"^(\d{1,4})$");
            Regex scoreRegexp = new Regex(InitProvider.GetRegexpValidator(dataModels));

            //валидации формы нет, отсев данных происходит в момент клика
            double currentTime = 0;
            double maxTime     = 90 * 60;
            string score       = "0-0";

            int scoreFirstCommand  = 0;
            int ScoreSecondCommand = 0;


            if (timeRegexp.IsMatch(textBoxTime.Text))
            {
                currentTime = double.Parse(textBoxTime.Text);
            }

            if (scoreRegexp.IsMatch(textBoxScore.Text))
            {
                score              = textBoxScore.Text;
                scoreFirstCommand  = int.Parse(score.Split(new[] { "-" }, StringSplitOptions.RemoveEmptyEntries)[0]);
                ScoreSecondCommand = int.Parse(score.Split(new[] { "-" }, StringSplitOptions.RemoveEmptyEntries)[1]);
            }

            if (currentTime < 0)
            {
                currentTime = 0;
            }

            if (currentTime > maxTime)
            {
                currentTime = maxTime;
            }
            #endregion

            //Основная идея - последующий отрезок матча воспринимается как отдельный матч.
            //Чем ближе к концу - тем больше вероятность текущего счета стремится к единице.
            //В момент, когда время равняется 90 минутам, невозможен иной исход, нежели тот, который задан.
            //Данная концепция согласуется с ситуацией, когда на N-ой минуте уже достигнут максимальный по таблице счет.
            //В этом случае, если не воспринимать оставшуюся часть игры, как отдельно взятый матч с ограниченным временем,
            //Можно прийти к результату, что изменений в матче происходить не будет. Однако, это не совсем логично.
            //Поэтому, в зависимости от счета, меняется и таблица результата,
            //И появляется, пусть и с меньшей вероятностью, ситуация, когда будет забито больше мячей, чем за все предбыдущие матчи.

            double timeLeftKoef = (maxTime - currentTime) / maxTime;

            #region update forecastModel
            var currentDataModels = ProbabilityProvider.GetCurrentDataModels(dataModels, timeLeftKoef,
                                                                             scoreFirstCommand, ScoreSecondCommand);
            //Эта вероятность (текущий счет) будет стремиться к единицы к концу матча.
            var currentFreeProbability = 1.0 - currentDataModels.Sum(x => x.Probability);
            var currentDataModel       = ProbabilityProvider.GetCurrentDataModel(scoreFirstCommand, ScoreSecondCommand, currentFreeProbability);

            forecastModel.CurrentDataModel          = currentDataModel;
            forecastModel.CurrentScoreFirstCommand  = scoreFirstCommand;
            forecastModel.CurrentScoreSecondCommand = ScoreSecondCommand;
            forecastModel.CurrentTime = currentTime;
            forecastModel.DataModels  = currentDataModels;

            #region probability
            //Надо ли загонять вероятности в 1? (с позиции математики - надо,
            //Однако, тут вычисления приближенные, и можно их все округлить вниз до знака, и потом добавить к какой-либо
            //(Мне, наверное, пришлась бы по душе большая) вероятности это значение)). Можно и поделить значения
            //Между всеми вероятностями. Но не придется ли снова нормировать значения?
            forecastModel.ProbabilityModels.Add(ProbabilityProvider.GetProbilityCommandWinOrDrawOrLose(
                                                    ResultCommandEnum.FirstCommandWin, currentDataModel, currentDataModels));
            forecastModel.ProbabilityModels.Add(ProbabilityProvider.GetProbilityCommandWinOrDrawOrLose(
                                                    ResultCommandEnum.SecondCommandWin, currentDataModel, currentDataModels));
            forecastModel.ProbabilityModels.Add(ProbabilityProvider.GetProbilityCommandWinOrDrawOrLose(
                                                    ResultCommandEnum.Draw, currentDataModel, currentDataModels));

            forecastModel.ProbabilityModels.Add(ProbabilityProvider.GetProbabilityOneScoreFirstAndSecondCommand(currentDataModels));
            forecastModel.ProbabilityModels.Add(ProbabilityProvider.GetProbabilityCommandScoreOne(
                                                    ResultCommandEnum.FirstCommandScoreOne, currentDataModels));
            forecastModel.ProbabilityModels.Add(ProbabilityProvider.GetProbabilityCommandScoreOne(
                                                    ResultCommandEnum.SecondCommandScoreOne, currentDataModels));
            forecastModel.ProbabilityModels.Add(ProbabilityProvider.GetProbabilityOneScoreFirstOrSecondCommand(currentDataModels));
            #endregion
            #endregion

            GetCurrentProbabilityTable(forecastModel);
            GetCurrentSpecificProbability(forecastModel);
        }