嘿伙计们我想实施elo算法来评估我的局域网中的玩家。我的php脚本包含以下内容。
<?php
class Rating
{
const KFACTOR = 16;
protected $_ratingA;
protected $_ratingB;
protected $_scoreA;
protected $_scoreB;
protected $_expectedA;
protected $_expectedB;
protected $_newRatingA;
protected $_newRatingB;
public function __construct($ratingA,$ratingB,$scoreA,$scoreB)
{
$this->_ratingA = $ratingA;
$this->_ratingB = $ratingB;
$this->_scoreA = $scoreA;
$this->_scoreB = $scoreB;
$expectedScores = $this -> _getExpectedScores($this -> _ratingA,$this -> _ratingB);
$this->_expectedA = $expectedScores['a'];
$this->_expectedB = $expectedScores['b'];
$newRatings = $this ->_getNewRatings($this -> _ratingA, $this -> _ratingB, $this -> _expectedA, $this -> _expectedB, $this -> _scoreA, $this -> _scoreB);
$this->_newRatingA = $newRatings['a'];
$this->_newRatingB = $newRatings['b'];
}
public function setNewSettings($ratingA,$ratingB,$scoreA,$scoreB)
{
$this -> _ratingA = $ratingA;
$this -> _ratingB = $ratingB;
$this -> _scoreA = $scoreA;
$this -> _scoreB = $scoreB;
$expectedScores = $this -> _getExpectedScores($this -> _ratingA,$this -> _ratingB);
$this -> _expectedA = $expectedScores['a'];
$this -> _expectedB = $expectedScores['b'];
$newRatings = $this ->_getNewRatings($this -> _ratingA, $this -> _ratingB, $this -> _expectedA, $this -> _expectedB, $this -> _scoreA, $this -> _scoreB);
$this -> _newRatingA = $newRatings['a'];
$this -> _newRatingB = $newRatings['b'];
}
public function getNewRatings()
{
return array (
'a' => $this -> _newRatingA,
'b' => $this -> _newRatingB
);
}
protected function _getExpectedScores($ratingA,$ratingB)
{
$expectedScoreA = 1 / ( 1 + ( pow( 10 , ( $ratingB - $ratingA ) / 400 ) ) );
$expectedScoreB = 1 / ( 1 + ( pow( 10 , ( $ratingA - $ratingB ) / 400 ) ) );
return array (
'a' => $expectedScoreA,
'b' => $expectedScoreB
);
}
protected function _getNewRatings($ratingA,$ratingB,$expectedA,$expectedB,$scoreA,$scoreB)
{
$newRatingA = $ratingA + ( self::KFACTOR * ( $scoreA - $expectedA ) );
$newRatingB = $ratingB + ( self::KFACTOR * ( $scoreB - $expectedB ) );
return array (
'a' => $newRatingA,
'b' => $newRatingB
);
}
}
//first player won
$first_player_rating=200;
$second_player_rating=200;
$n=new Rating($first_pic_rating,$second_pic_rating,1400,1400);
$a=$n->getNewRatings();
var_dump($a);
?>
我已经将first_player_rating和second_player_rating都给了200,这是错误的,但问题是,如果第一个玩家刚赢得比赛,first_player_rating和second_player_rating的值应该多少......
答案 0 :(得分:2)
这种做法错了......
<?php
class elo
{
private $Ra,$Rb,$Pa,$Pb;
public $won,$NRa,$NRb;
function __construct($Ra,$Rb,$won)//$Ra and $Rb are rating given...
{
$k=24;
$this->Ra=$Ra;
$this->Rb=$Rb;
$Pa=1/(1+10^(($Rb-$Ra)/400));
$Pb=1/(1+10^(($Ra-$Rb)/400));
$this->won=$won;
if($won=="first")
{
$this->NRa=$this->Ra+($k*$Pa);
$this->NRb=$this->Rb-($k*$Pb);
}else
{
$this->NRa=$this->Ra-($k*$Pa);
$this->NRb=$this->Rb+($k*$Pb);
}
}
function getNewRatings()
{
$result=array($this->NRa,$this->NRb);
return $result;
}
}
?>
<?php
require_once('elo.php');
$n=new elo(1400,1400,"first");
$a=$n->getNewRatings();
var_dump($a);
?>
现在可以使用给定的类......