反向Elo算法

时间:2017-07-26 16:58:30

标签: java algorithm math mathematical-expressions

我实现了elo算法但是它的工作方式完全相反,因为我混合了结果(设置胜利在哪里失败和相反......)这个小细节使我的结果失败 - 这就是为什么问题是 - 我怎么能扭转呢?

我只有新的Elo和旧的elo,因为我正在收集统计数据。

我的算法看起来与wiki完全一样: https://en.wikipedia.org/wiki/Elo_rating_system#Theory

是:

all

我试图扭转它但可能我在计算中犯了一个错误:

public class EloAlgorithm {

   public static Integer calculateRating(Integer myRating, Integer opponentRating, EloGameResultValue result) {
       myRating += calculateEloDelta(myRating, opponentRating, result);
       if (myRating<0){
           return 0;
       }
       return myRating;
   }

   private static Integer calculateEloDelta(Integer myRating, Integer opponentRating, EloGameResultValue result){
       Double myChanceToWin = 1 / (1 + Math.pow(10, (opponentRating - myRating) / 400));
       Long eloDelta = Math.round(getKFactor(myRating) * (result.getValue() - myChanceToWin));
       return eloDelta.intValue();
   }

   private static double getKFactor(Integer myRating) {
      if(myRating < 2100) return 32.0;
      else if(myRating >= 2100 && myRating < 2400) return 24;
      else return 16;
   }
}

你能帮我找一个错误或推荐更好的解决方案吗?

编辑:按要求:

我通过JUnit

测试它
public static Integer fetchOponentRatingFromDifference(int myOldRating, int myNewRating, EloGameResultValue result){
    double delta = myNewRating - myOldRating;

    double k = getKFactor(myOldRating);
    double myChanceToWin =  (k* result.getValue() - difference)/k ;

    double log = Math.log10(1/myChanceToWin - 1);
    Double resultToReturn = 400*log + myOldRating;

    return (int)Math.round(resultToReturn);
}

}

然而,主要的方法是:

public class EloValueBinaryFinderTest {
     @Test
     public void eloValueFinderTest(){   
     System.out.println(
       EloValueBinaryFinder.fetchOponentRatingFromDifference(952,968)
     );
}

EloGameResultValue是必要的只是一个枚举:

public class EloValueBinaryFinderTest {
      public static void main(String... args){
      System.out.println(
         EloValueBinaryFinder.fetchOponentRatingFromDifference(952,968)
      );
   }
}

1 个答案:

答案 0 :(得分:0)

好的,我解决了,计算没问题但是实施错了:)

@Carlos Hauberger发现了第一个错误

第二个,是我的错误 - 对数只能将正值作为参数作为负面原因NaN