gpt4 book ai didi

java - 反向 Elo 算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:05:06 25 4
gpt4 key购买 nike

我实现了 elo 算法,但是当我混合结果时它以完全相反的方式工作(设置赢,输和相反..)这个小细节使我的结果失败 - 这就是为什么问题是 - 我如何才能扭转它?

我在收集统计数据时只有新的 Elo 和旧的 Elo..

我的算法看起来和 wiki 上的一模一样: https://en.wikipedia.org/wiki/Elo_rating_system#Theory

即:

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

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

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

你能帮我找出其中的错误或推荐更好的解决方案吗?

编辑:按照要求:

我通过 JUnit 测试它

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

然而主要的方法是:

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

必要的 EloGameResultValue 只是一个枚举:

public enum EloGameResultValue {
WIN(1),
DRAW(0.5),
LOSE(0);

Double value;

EloGameResultValue(double value) {
this.value = value;
}

public Double getValue() {
return value;
}


public Boolean isWin() {
if(value.equals(1.0)){
return true;
}
if(value.equals(0.0)){
return false;
}
return null;
}

}

最佳答案

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

@Carlos Hauberger 很好地发现了第一个错误

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

关于java - 反向 Elo 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45333180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com