1. Соблюдайте Правила форума и проявляйте уважение к другим участникам беседы.

Scorе, DotaElo

Тема в разделе 'Кодинг/Собственные решения', создана пользователем Discover, 7 фев 2011.

  1. Discover Ньюфаг

    Сообщения:
    91
    Спасибы:
    0
    Подскажите в чем проблема, меняю score формулу, запускаю dot_elo
    и ничего не изменяется, в чем проблема?
    у меня GhostOne
    была где то тема, но ответа не нашел...

    и есть ли статейка, как составить свою формулу ?
    конкретно хотелось бы поставить , как написано в конфиге dota open stats метод лиги
  2. JiLiZART Администрация

    Сообщения:
    815
    Спасибы:
    35
    Сборка бота GHost:
    Ghost++ 17.1
    Дата начала использования бота:
    12.12.04
    в dota_elo вшита своя формула, формула в GhostOne указывается для обновления очков по этой формуле из оболочки и вывода статсов командой !sd
  3. Discover Ньюфаг

    Сообщения:
    91
    Спасибы:
    0
    тоесть надо меня формулу в dota elo ?
  4. Griffon Ньюфаг

    Сообщения:
    6
    Спасибы:
    0
    Была идея заменить elo_recalculate_ratings приблизительно на такой код (не проверено):
    Код:
    void elo_recalculate_ratings(int num_players, float *player_ratings, int *player_teams, int num_teams, float *team_ratings, float *team_winners)
    {
    		int i;
    		float Ea, E1, E2;
    		float K = 15.0;
    		float F;
    		
    		/* Calculate the ELO piont expectations. */
    		Ea = 1.0 / (1.0 + pow(10.0, ((team_ratings[1] - team_ratings[0]) / 400.0)));
    		
    		/* Calculate incriment for each team. */
    		if (team_winers[0]) 
    			E1 = (1.0 - Ea) * K;
    		else
    			E1 = -1.0 * Ea * K;
    		E2 = -1.0 * E1;
    		
    		/* Calculate new ratings for each player. */
    		for (i = 0; i < num_players; i++) {
    			int team = num_teams > 0 ? player_teams[i] : i;
    			
    			/* Calculate personal rating factor. */
    			F = 3 * (20 - player_ratings[i]/100);
    			if (player_ratings[i] < 1000)
    					F = 30.0;
    			else if (player_ratings[i] < 1500)
    					F = 15.0;
    			else if (player_ratings[i] > 2400)
    					F = 5.0;
    					
    			/* Recalculate factor considering that the incriment calculation was performed for the average case. */
    			F = F * F / K;
    			/* Recalculate factor depending on the possible contribution to the game. */
    			F = F * player_ratings[i] / team_ratings[team];
    			
    			if (team)
    				player_ratings[i] += E2 * F;
    			else
    				player_ratings[i] += E1 * F;
    		}
    }
    
    И удалить всё остальное. Да вот только попробовать так и не удалось.

    :spy:
  5. Deals Старожила

    Сообщения:
    784
    Спасибы:
    21
    Сборка бота GHost:
    Ghost One 1.7.266
    Skype:
    Мой статус
    А что ты хотел сделать?
  6. Griffon Ньюфаг

    Сообщения:
    6
    Спасибы:
    0
    Да особо ничего, просто этот код должен заменять весь тот бардак с интегрированием по кривой, которая ещё и представлена не в виде функции, а в виде таблицы. Ну и соответственно с ним легче экспериментировать.
    Правда я не знаю как поведёт себя конкретно этот код, ибо написал его по памяти прямо тут, но математику решения легко проследить.
  7. dev Ньюфаг

    Сообщения:
    51
    Спасибы:
    0
    Сборка бота GHost:
    0.0
    Я кстати вшил update_dota_elo в сервер и в бот как отдельный класс, который выполнятся в отдельном потоке, после окончания игры, или через определеный промежуток времени. Думаю это пока самый простой выход из ситуации, т.к конечному юзеру нужно будет просто изменить строчку в конфиге и все. Нужно стремится к простоте

    п.с
    Привет грифон :)
  8. Griffon Ньюфаг

    Сообщения:
    6
    Спасибы:
    0
    Видел. Ты там уже новый сервер накатал. : - )

    п.с. и тебе привет.
  9. fake Старожила

    Сообщения:
    1.624
    Спасибы:
    19
    Дата начала использования бота:
    11.11.11
    я так понимаю, что твой код это попытка использования формулы Эло, но я не понимаю почему
    этот код
    Код:
         /* Calculate the ELO piont expectations. */
          Ea = 1.0 / (1.0 + pow(10.0, ((team_ratings[1] - team_ratings[0]) / 400.0)));
          
          /* Calculate incriment for each team. */
          if (team_winers[0]) 
             E1 = (1.0 - Ea) * K;
          else
             E1 = -1.0 * Ea * K;
          E2 = -1.0 * E1;
    выполняется для всей тимы?
    насколько я понимаю эта часть
    Код:
    Ea = 1.0 / (1.0 + pow(10.0, ((team_ratings[1] - team_ratings[0]) / 400.0)));
    должна выполнятся для каждого игрока и выглядить примерно так
    Код:
    Ea = 1.0 / (1.0 + pow(10.0, ((player_rating[i] - team_ratings[0]) / 400.0)));
    Еще здесь нету даже минимальной проверки на количество тим, тоесть если будет 1 тима и бот все таки запустит подсчет рейтинга, то апдейт_дота_ело.ехе вылетит, я не знаю как выполняется функция system()
    но в случае если она блокирующая(а скорее всего так, ибо насколько я помню в консоли бота выводит инфу с апдейтдота_ело), то бот(ghost one который после игры выполняет этот фаил) зависнет тоже.
  10. Griffon Ньюфаг

    Сообщения:
    6
    Спасибы:
    0
    Все проверки выполняются в elo.cpp. Формула эло считается в зависимости от рейтинга команд, а затем уже применяются личные факторы. Этому есть достаточные основания.