Мне интересно, достаточно ли этого алгоритма для нахождения наилучшего значения с помощью взвешенной системы. Что-нибудь, что я мог бы добавить, чтобы сделать это лучше?
в этом примере я бы хотел, чтобы вероятность того, что $object->get()
вернет test4, будет в 4 раза больше, чем вероятность того, что он вернет test1.
class weightCalculator {
var $data = array();
var $universe = 0;
function add( $data, $probability ){
$this->data[ $x = sizeof( $this->data ) ] = new stdClass;
$this->data[ $x ]->value = $data;
$this->universe += $this->data[ $x ]->probability = abs( $probability );
}
function get(){
if( !$this->universe ){
return null;
}
$x = round( mt_rand( 0, $this->universe ) );
$max = 0;
$i = 0;
while( $x > $max ){
$max += $this->data[ $i++ ]->probability;
}
$val=-1;
if($this->universe==1){
$val = $this->data[$i]->value;
} else {
$val = $this->data[$i-1]->value;
}
return $val;
}
}
$object = new weightCalculator;
$object->add( 'test1', 10 );
$object->add( 'test2', 20 );
$object->add( 'test3', 30 );
$object->add( 'test4', 40 );