2011-12-22 16 views
17

Estoy tratando de convertir una Fórmula matemática en código PHP.¿Cómo traducir esta fórmula matemática en Haskell o Python? (Se tradujo en PHP)

Se puede ver la fórmula en la respuesta aceptada aquí: Applying a Math Formula in a more elegant way (maybe a recursive call would do the trick).

No soy un codificador profesional, así que estoy haciendo mi mejor esfuerzo para traducirlo, pero mis conocimientos son limitados y que he encontrado varios problemas.

Comencemos.

hay un vector que contiene las pilas de los jugadores: Creo que una matriz bidimensional debe hacer el trabajo aquí. Agregaría una clave para identificar a cada jugador.

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

ahora quiere crear una matriz de valores, lo hice mis investigaciones y encontró un paquete PEAR llamada Math_Matrix, lo instalamos, pero me pregunto cómo crear ese tipo de matriz.

Me preocupa que no voy a ser capaz de traducir el código completo porque utiliza métodos avances como las llamadas recursivas etc.

¿Me podría ayudar?

EDIT: VIEJO RECOMPENSA BOUNTY

he intentado lo que usted ha sugerido, pero me siento como perder el tiempo a causa de mis habilidades de programación pobres.

HE decidido ofrecer A 50 BOUNTY Si alguien quiere HELP ME mediante la traducción de esa fórmula en PHP.

Tenga en cuenta que si cree que traducir en Python es más fácil/más adecuado/otro, proporcione una forma de incluir el script de Python dentro de un script PHP ya que planeo usar esta fórmula en un sitio web.

+0

todo lo que puedo decir es WOW ..... Esta es una matemática seria en un lenguaje de programación no matemático. –

+0

¿Crees que alguien podría resolver esto en PHP? – KingBOB

+0

¿O qué lenguaje que puedo implementar en PHP se puede usar para resolver esto? – KingBOB

Respuesta

14

Aquí tienes.

que coloque este código en el dominio público.

# 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; 
} 

Ejemplo:

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

En cuanto al uso de matrices:

En PHP, una matriz se puede representar como una matriz de matrices. Puede ver que en la función makematrix, que devuelve una matriz de longitud height, con cada elemento que es una matriz de width ceros. Su problema utiliza los siguientes operaciones de la matriz, los cuales son simples:

  • la adición de dos matrices (matrixadd). Aquí, simplemente agregue los elementos de una matriz a los elementos correspondientes de la otra matriz.
  • Multiplicando una matriz por un solo número (un escalar) (matrixmultiply) simplemente implica multiplicar cada elemento de la matriz por ese número.
+0

Si funciona - fenomenal. ¡Gran trabajo! –

+0

¡Eres mi ídolo! :) – KingBOB

+0

¡He analizado tu código y es impresionante! :) El único problema está en el algoritmo matemático en sí: demasiado lento. ¿Es posible acelerar el código calculando solo una cantidad determinada de capital en los lugares? Quiero decir: en un escenario donde hay 6 jugadores, el código anterior calcularía la equidad de cada jugador en cada lugar hasta el 6to lugar. Si solo necesitamos su capital en 1er y 2º lugar, podemos omitir el código remanente, ¿o no? Sería útil tener algo como print_r (equitymatrix ($ mystacks, 2)); Donde el número se mantiene para los lugares en los que queremos calcular el capital. – KingBOB

0

supongo que la pregunta más importante es lo que se va a utilizar esto para. Al final, realmente recomendaría no usar PHP. No está diseñado para este tipo de trabajo y terminará causando mucho trabajo para usted más tarde.

Si solo está buscando un medio para calcularlo, recomendaría usar Octave (la versión de OpenSource de MATLAB) Si realmente desea construir un programa alrededor de él, debe buscar en Python usando el módulo NumPy: http://numpy.scipy.org/


Si tiene la capacidad, le recomendaría usar mod_python para ejecutar NumPy para manejar esto. Probablemente sea la forma más sencilla de hacerlo, ya que NumPy puede manejar matrices de forma nativa. Salvo eso, debería mirar las siguientes clases que existen para manejar matrices en PHP. Algunas personas han desarrollado algunas clases diseñadas específicamente para manipular matrices.

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

+0

Me gustaría crear un sitio web como este: http://www.icmpoker.com/Calculator.aspx Parece que utiliza un algoritmo similar para calcular las acciones. – KingBOB

+0

Se adelantó y agregó más información específica sobre lo que está buscando junto con algunos enlaces a clases diseñadas específicamente para Matrix Math en PHP. Sigo pensando que Python lo manejaría mejor, pero es un poco más difícil de implementar dependiendo del control que tengas sobre tu servidor web. – Drahkar

+0

Gracias hombre, voy a hacer algunas investigaciones para lograr esto en PHP porque no sé Python y su implementación en un sitio web debería hacerlo aún más complejo ... – KingBOB

0

Si tiene instalado Matlab, con la caja de herramientas matemáticas simbólica,

puede utilizar la función ccode con el fin de traducir esta fórmula (o cualquier otro) a c-código (que es muy similar a php)

Cuestiones relacionadas