反向的Elo算法
问题描述:
我实现ELO算法但它是在完全相反的方式工作,我混合的结果(赢设置在哪里失去的,相反的。)这小小的细节辜负我的结果 - 为什么问题是,这就是 - 我怎样才能扭转?反向的Elo算法
我只有新的Elo老ELO因为我是garhering统计..
我的算法是完全一样的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的
的UE'int'而不是'Integer'和'double'而不是'double'当你不强制,更容易,您能不能给测试主要方法? – azro
请来到这里https://chat.*.com/rooms/info/150213/elo-algo?tab=general更好说话 – azro
和谨慎与整数除法:例如'380/400 = 0',同时'(双)380/400 = 380.0/400 = 380/400.0 = 0.95' –