我实现了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)
);
}
}
答案 0 :(得分:0)
好的,我解决了,计算没问题但是实施错了:)
@Carlos Hauberger发现了第一个错误
第二个,是我的错误 - 对数只能将正值作为参数作为负面原因NaN