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