Как перевести эту математическую формулу в Haskell или Python? (Был переведен в PHP) - PullRequest
17 голосов
/ 22 декабря 2011

Я пытаюсь преобразовать математическую формулу в код PHP.

Вы можете увидеть формулу в принятом ответе здесь: Применение математической формулы более элегантным способом (возможно, рекурсивный вызовмог бы сделать свое дело) .

Я не профессиональный кодер, поэтому я стараюсь изо всех сил перевести его, но мои навыки ограничены, и я столкнулся с несколькими проблемами.

Давайте начнем.

Есть вектор, содержащий стеки игроков: я думаю, что двумерный массив должен работать здесь.Я бы добавил ключ для идентификации каждого игрока.

$array = array(1 => 2000, 3 => 5000 ...);

Теперь он хочет создать Матрицу ценностей, я провел исследования и нашел пакет PEAR с именем Math_Matrix, установил его, но мне интересно, какчтобы создать такую ​​матрицу.

Я боюсь, что не смогу перевести весь код, потому что он использует такие методы, как рекурсивные вызовы и т. д.

Не могли бы вы мне помочь?

РЕДАКТИРОВАТЬ: СТАРЫЙ КРУПНЫЙ НАГРАД

Я попробовал то, что вы предложили, но мне хочется тратить свое время из-за моих плохих навыков программирования.* Я решил предложить 50 займов, если кто-то хочет помочь мне, переведя эту формулу на PHP.

Обратите внимание, что если вы считаете, что перевод на Python проще / более подходит / другой, пожалуйста, предоставьте мнеспособ включить скрипт Python в скрипт PHP, так как я планирую использовать эту формулу на веб-сайте.

Ответы [ 3 ]

14 голосов
/ 29 декабря 2011

Вот, пожалуйста.

Я размещаю этот код в открытом доступе.

# Function to make an array of 'width' zeros
function makerow($width){
 $row=array();
 for($x=0;$x<$width;$x++){
   $row[$x]=0;
 }
 return $row;
}

# Function to make a width*height matrix
function makematrix($width,$height){
 $matrix=array();
 for($y=0;$y<$height;$y++){
  $matrix[$y]=array();
  for($x=0;$x<$width;$x++){
   $matrix[$y][$x]=0;
  }
 }
 return $matrix;
}

# Adds one matrix to another
function matrixadd(&$matrixdest,&$matrixsrc){
 for($i=0;$i<count($matrixdest);$i++){
  for($j=0;$j<count($matrixdest[$i]);$j++){
   $matrixdest[$i][$j]+=$matrixsrc[$i][$j];
  }
 }
}

# Multiplies a matrix by a scalar
function matrixmultiply(&$matrix,$scalar){
 for($i=0;$i<count($matrix);$i++){
  for($j=0;$j<count($matrix[$i]);$j++){
   $matrix[$i][$j]*=$scalar;
  }
 }
}

# Calculates the equity of each place. Rows indicate players;
# columns indicate places (0 is 1st place, 1 is second, and so on)
# The parameter 'places' is optional.  If not given, uses the 
# number of stacks.
function equitymatrix(&$stacks, $places=-1){
 if($places==-1){
  # replace places with the stack count
  $places=count($stacks);
 }
 if(count($stacks)<=1){
  return array(array(1));
 }  
 $totalStacks=0;
 for($i=0;$i<count($stacks);$i++){
  $totalStacks+=$stacks[$i];
 }
 # Optimize for case where there is only one place
 if($places==1){
  $matrix=makematrix(1,count($stacks));
  for($i=0;$i<count($stacks);$i++){
   $matrix[$i][0]=$stacks[$i]*1.0/$totalStacks;
  }
  return $matrix;
 }
 # Optimize for case where there are two places
 if($places==2){
  $matrix=makematrix(2,count($stacks));
  for($i=0;$i<count($stacks);$i++){
   $matrix[$i][0]=$stacks[$i]*1.0/$totalStacks;
  }
  for($i=0;$i<count($stacks);$i++){
   for($j=0;$j<count($stacks);$j++){
    if($i!=$j){
     $matrix[$i][1]+=$matrix[$j][0]*($stacks[$i]*1.0/($totalStacks-$stacks[$j]));
    }
   }
  }
  return $matrix;
 }
 # Calculate the probabilities of each player getting first place
 $probabilities=array();
 for($i=0;$i<count($stacks);$i++){
  $probabilities[$i]=$stacks[$i]*1.0/$totalStacks;
 }
 #echo(count($stacks)." ".$places."\n");
 $subequities=array();
 for($i=0;$i<count($stacks);$i++){
  $substacks=array();
  # Assume that player i would be in first place
  # Create a new array with i's stack removed
  for($j=0;$j<count($stacks);$j++){
   if($j!=$i){
    array_push($substacks,$stacks[$j]);
   }
  }
  # Find the subequity of the remaining players
  $subequities[$i]=equitymatrix($substacks,
    min($places,count($substacks)));
  for($j=0;$j<count($subequities[$i]);$j++){
   array_unshift($subequities[$i][$j],0);
  }
  # Add player i back
  $newrow=makerow($places);
  $newrow[0]=1;
  array_splice($subequities[$i],$i,0,array($newrow));
 }
 $equities=makematrix($places,count($stacks));
 for($i=0;$i<count($stacks);$i++){
  # Multiply the probabilities
  matrixmultiply($subequities[$i],$probabilities[$i]);
  # Add the subequity
  matrixadd($equities,$subequities[$i]);
 }
 return $equities;
}

Пример:

$mystacks=array(10,40,30,20);
print_r(equitymatrix($mystacks));

Что касается использованияmatrices:

В PHP матрица может быть представлена ​​в виде массива массивов.Вы можете видеть это в функции makematrix, которая возвращает массив длины height, где каждый элемент представляет собой массив width нулей.В вашей задаче используются следующие матричные операции, обе из которых просты:

  • Добавление двух матриц (matrixadd).Здесь просто добавьте элементы одной матрицы к соответствующим элементам другой матрицы.
  • Умножение матрицы на одно число (скаляр) (matrixmultiply) просто включает умножение каждого элемента матрицы наномер.
0 голосов
/ 30 декабря 2011

Если у вас установлен Matlab с символическим набором математических инструментов,

Вы можете использовать функцию ccode, чтобы перевести эту формулу (или любую другую) в c-код (который очень похож на php).

0 голосов
/ 22 декабря 2011

Думаю, самый большой вопрос - для чего вы планируете это использовать.В конце я бы порекомендовал не использовать PHP.Он не предназначен для этого типа работы, и вы в конечном итоге будете создавать для себя много работы позже.

Если вы просто ищете способ его расчета, я бы порекомендовал использовать Octave (версия OpenSourceof MATLAB) Если вы действительно хотите построить программу вокруг нее, вам следует изучить Python с помощью модуля NumPy: http://numpy.scipy.org/


Если у вас есть такая возможность, я бы порекомендовал использовать mod_python для запуска NumPyчтобы справиться с этим.Скорее всего, это будет самый простой способ сделать это, поскольку NumPy может работать с матрицами.За исключением этого, вы должны посмотреть на следующие классы, которые существуют для обработки матриц в PHP.Некоторые люди разработали некоторые классы, разработанные специально для манипулирования Матрицами.

http://www.phpkode.com/scripts/item/matrix-new/ http://www.phpclasses.org/package/2859-PHP-Perform-operations-with-matrices.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...