Алгоритм системы оценки прогноза - PullRequest
0 голосов
/ 03 июля 2019

Я пытаюсь написать универсальную систему подсчета очков для лиги прогнозирования.У меня есть модель, определенная (почти полностью завершенная) для системы начисления баллов.Система начисления очков основана на Лиге.У лиги будет система league_scoring, определенная как super_user.Я не думаю, что есть способ обойти это, кроме создания предопределенного набора атрибутов, и пользователь затем назначает точки для этого (или есть?).Оценка лиги будет определять, как рассчитывается ряд прогнозов для набора прогнозов (пользовательских прогнозов).Оценка лиги также может иметь набор вопросов League_questions, дополнительных вопросов типа прогнозирования с вопросом и ответом типа оператора (да / нет, либо строкой, либо числом), а также количеством баллов, назначенных этому вопросу.Таким образом, если пользователь предсказывает ответ на этот вопрос, он получает назначенные очки, например, «сколько калиток Индия получит в игре Y».

Я создал модель данных, из которой только что скопировал скоринговую часть, так как не верю, что другая нужна для понимания моего вопроса.

enter image description here

Я предоставил код для расчета ряда прогнозов.По сути, существует список прогнозов, предопределенных для данного пользователя.Выполните итерацию этих прогнозов для каждого пользователя, сравните их с фактическим (текущим / полным) результатом и обновите результаты (таблица).

  List<Prediction> predictionsForCurrentResultList = predictionsByUserMap.get(result.equalsFixture());
        if(predictionsForCurrentResultList != null) {
            for (Prediction prediction : predictionsForCurrentResultList) {
                logger.info("Prediction is " + prediction);
                logger.info("Result is              " + result);
                Standing tmpStanding = userStandingMap.get(prediction.getPlayerId().trim().toUpperCase());
                if(tmpStanding == null) {
                    tmpStanding = new Standing();
                    tmpStanding.setPlayerId(prediction.getPlayerId());
                }
                boolean wrongResult = true;
                if(prediction.equalsFixture().equals(result.equalsFixture())) {
                    if(prediction.equalsString().equals(result.equalsString())) {
                        tmpStanding.setCorrectScores(leagueScoring.getCorrectScorePoints());
                        wrongResult = false;
                    }
                    if(prediction.getHomeTeamScore().equals(result.getHomeTeamScore())) {
                        tmpStanding.setHomeScorePoints(leagueScoring.getHomeScorePoints());
                        tmpStanding.setPointsTotal(1);
                        tmpStanding.setPointsForRound(1);
                    }
                    if(prediction.getAwayTeamScore().equals(result.getAwayTeamScore())) {
                        tmpStanding.setPointsTotal(1);
                        tmpStanding.setAwayScorePoints(leagueScoring.getAwayScorePoints());
                        tmpStanding.setPointsForRound(1);
                    }    //2                         - 2    is 0                 =      3                         -      3    is 0
                         //3                         - 1    is 2                 =      5                         -      3    is 2
                    if(prediction.getHomeTeamScore() - result.getHomeTeamScore() == prediction.getAwayTeamScore() - result.getAwayTeamScore()) {
                        //correct result and margin is
                        tmpStanding.setPointsTotal(leagueScoring.getCorrectMarginPoints());
                        tmpStanding.setPointsForRound(1);
                        tmpStanding.setPointsTotal(2);
                        wrongResult = false;
                    } else if((prediction.getHomeTeamScore() > prediction.getAwayTeamScore() && result.getHomeTeamScore() > result.getAwayTeamScore())
                            || (prediction.getAwayTeamScore() > prediction.getHomeTeamScore() && result.getAwayTeamScore() > result.getHomeTeamScore())) {
                        wrongResult = false;
                        tmpStanding.setPointsTotal(2);
                    }
                    if(wrongResult) {
                        tmpStanding.setWrongResults(1);
                    } else if(!wrongResult && !prediction.equalsString().equals(result.equalsString())){
                        tmpStanding.setCorrectResults(1);
                    }
                    userStandingMap.put(tmpStanding.getPlayerId().trim().toUpperCase(), tmpStanding);
                }
            }
            return new ArrayList<>(userStandingMap.values());
        }
        return standings;

Я действительно не хочу входить в тип действия правила dsl иличто-нибудь подобное.Я не хочу вводить ограничения на оценку или вопросы.Я думаю о нескольких способах, но приведенный выше код является довольно грубой силой логики if / else.Я бы предпочел функциональные обратные вызовы или какую-то другую общую форму оценки, которая не ограничена моей заранее определенной моделью.Возможно, модель должна быть более гибкой.По сути, я хочу, чтобы пользователь мог определить Лигу с любой системой подсчета очков и вопросами, которые задает пользователь.

Как сделать приведенный выше код более универсальным, чтобы можно было использовать любую систему подсчета очков, основанную на приведенной выше модели?Или настроить модель, чтобы учесть более общий алгоритм?

...