2011-12-22 9 views
17

私は数式をPHPコードに変換しようとしています。この数式をHaskellまたはPythonでどのように翻訳するのですか? (PHPで翻訳されました)

受け入れられた回答の式はApplying a Math Formula in a more elegant way (maybe a recursive call would do the trick)です。

私はプロのコーダーではありませんので、翻訳には最善を尽くしていますが、スキルは限られており、いくつかの問題が発生しました。

始めましょう。

プレイヤーのスタックを含むベクターがあります。二次元配列では、ここで作業を行う必要があります。私は各プレーヤーを識別するためのキーを追加します。

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

は今、彼は、値のマトリックスを作成したい私は私の研究を行なったし、Math_Matrixと呼ばれるPEARパッケージを見つけ、それをインストールされているが、私は、マトリックスのようなものを作成する方法を思ったんだけど。

彼は再帰呼び出しのような進歩の方法を使用していますので、私は、私はコード全体を翻訳することができなくなることを心配しているなど

あなたは私を助けてもらえますか?

EDIT:OLD BOUNTY報酬

私はあなたが提案してきたが、私は私のために悪いプログラミング技術の私の時間を無駄にするように感じるものを試してみました。

私は、PHPで書かれた書式を翻訳することによって誰かが私を助けたいと思っていた場合、50の恩恵を受けると決めました。

Pythonでの翻訳がより簡単/より適切であると思う場合、私はこの式をウェブサイトで使用する予定であるため、PythonスクリプトをPHPスクリプトに含める方法を教えてください。

+0

私が言うことができるのは、ワウです。これは、非数学指向プログラミング言語の深刻な数学です。 –

+0

誰かがこれをPHPで解決できると思いますか? – KingBOB

+0

これを解決するためにPHPで実装できる言語はどれですか? – KingBOB

答えて

14

私はこのコードをパブリックドメインに置きます。

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

:PHPで

、マトリックスは、配列の配列として表すことができます。関数makematrixには、長さがheight, の配列が返され、各要素の配列はwidthで、 であることがわかります。

  • 追加二つの行列(matrixadd):あなたの問題は簡単で、どちらも以下 行列演算を使用します。ここでは、一方の行列の要素を他方の行列の対応する要素に追加します。
  • 行列を単一の数値(スカラー)(matrixmultiply)に単純に を乗じるには、行列の各要素にその数を掛けます。
+0

それが動作すれば - phenominal。よくやった! –

+0

あなたは私のアイドルです! :) – KingBOB

+0

私はあなたのコードを分析し、それは素晴らしいです! :) 唯一の問題は数学アルゴリズムそのものです。遅すぎます。 場所の特定の数のエクイティのみを計算してコードを高速化できますか? つまり、6人のプレイヤーがいるシナリオでは、上記のコードは各プレイヤーのすべてのプレイヤーの6位までのエクイティを計算します。 第1位と第2位の株式しか必要としない場合は、残存するコードをスキップできますか? print_r(equitymatrix($ mystacks、2))のようなものを使うと便利です。 ここで、株価は、株主資本を計算したい場所にとどまります。 – KingBOB

0

私は最大の問題は、これを使用する予定だと思います。最後に、私はPHPを使用しないことを本当にお勧めします。このタイプの仕事のために設計されておらず、後で自分自身で多くの仕事を引き起こすでしょう。

計算方法を探しているのであれば、Octave(OpenSource Version of MATLAB)を使用することをお勧めします。実際にプログラムを作成したい場合は、NumPyモジュールを使用してPythonを調べる必要があります。http://numpy.scipy.org/


能力があれば、これを処理するNumPyを実行するにはmod_pythonを使用することをおすすめします。 NumPyがネイティブに行列を扱うことができるため、これを実行する最も簡単な方法です。それを除けば、PHPで行列を扱うために存在する以下のクラスを見てください。一部の人は、行列を操作するために特別に設計されたクラスをいくつか開発しました。あなたが行くここ

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

+0

私はこのようなウェブサイトを作りたいと思う:http://www.icmpoker.com/Calculator.aspx それは株式を計算するために同様のアルゴリズムを使用するように見える。 – KingBOB

+0

PHPのMatrix Math用に特別に設計されたクラスへのリンクとともに、後になっていることに固有の情報を追加しました。私はまだPythonがそれをよりうまく処理できると思っていますが、ウェブホスト上のコントロールに応じて実装するのが少し難しいと思います。 – Drahkar

+0

ありがとう、私はPythonを知らず、ウェブサイトでそれを実装すると、もっと複雑にする必要があるので、PHPでこれを達成するためにいくつかの研究をしていきます。 – KingBOB

0

あなたは、MATLABは、PHPに非常によく似ている(C-コードにこの式(またはその他)を変換するために、ccode機能を使用することができ、シンボリック数学のツールボックスで、

をインストールしている場合)。

関連する問題