2011-12-22 26 views
17

Tôi đang cố chuyển đổi Công thức toán thành mã PHP.Làm thế nào để dịch Công thức toán học này trong Haskell hoặc Python? (Đã được dịch sang PHP)

Bạn có thể xem công thức trong câu trả lời được chấp nhận tại đây: Applying a Math Formula in a more elegant way (maybe a recursive call would do the trick).

Tôi không phải là người lập trình chuyên nghiệp vì vậy tôi đang cố gắng hết sức để dịch nó nhưng kỹ năng của tôi bị hạn chế và tôi đã gặp phải một số vấn đề.

Hãy bắt đầu.

Có một vectơ chứa ngăn xếp của người chơi: Tôi nghĩ rằng một mảng giá thầu nên thực hiện công việc tại đây. Tôi sẽ thêm một khóa để xác định mỗi người chơi.

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

Bây giờ anh muốn tạo ra một ma trận của các giá trị, tôi đã nghiên cứu của tôi và tìm thấy một gói PEAR gọi Math_Matrix, cài đặt nó nhưng tôi đang tự hỏi làm thế nào để tạo ra rằng loại ma trận.

Tôi lo lắng rằng tôi sẽ không thể để dịch toàn bộ mã vì ông sử dụng những tiến bộ phương pháp như cuộc gọi đệ quy, vv

Ông có thể giúp tôi?

EDIT: OLD BOUNTY THƯỞNG

tôi đã cố gắng những gì bạn đã đề nghị nhưng tôi cảm thấy như lãng phí thời gian của tôi bởi vì các kỹ năng kém lập trình của tôi.

TÔI ĐÃ ĐƯỢC CUNG CẤP CHO CUNG CẤP MỘT SỐ TIỀN MẶT 50 NẾU MỘT NGƯỜI ĐANG MUỐN GIÚP TÔI B BYNG CÁCH CHUYỂN ĐỔI CÔNG THỨC TRONG PHP. Lưu ý rằng nếu bạn nghĩ rằng dịch trong Python là dễ dàng/phù hợp hơn/khác, xin vui lòng cung cấp cho tôi một cách để bao gồm các kịch bản Python bên trong một kịch bản PHP kể từ khi tôi đang lập kế hoạch để sử dụng công thức này trong một trang web.

+0

tất cả những gì tôi có thể nói là WOW ..... Đây là một số toán học nghiêm trọng thành một ngôn ngữ lập trình không theo định hướng toán học. –

+0

Bạn có nghĩ ai đó có thể giải quyết vấn đề này trong PHP không? – KingBOB

+0

Hoặc ngôn ngữ nào tôi có thể thực hiện trong PHP có thể được sử dụng để giải quyết vấn đề này? – KingBOB

Trả lời

14

Ở đây bạn đi.

Tôi đặt mã này vào miền công cộng.

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

Ví dụ:

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

Đối với việc sử dụng các ma trận:

Trong PHP, một ma trận có thể được biểu diễn dưới dạng một mảng của mảng. Bạn có thể thấy rằng trong hàm makematrix, trả về một mảng có độ dài height, với mỗi phần tử là một mảng là width số không. Vấn đề của bạn sử dụng hoạt động ma trận sau, cả hai đều là đơn giản:

  • Thêm hai ma trận (matrixadd). Ở đây, chỉ cần thêm các phần tử của một ma trận vào các phần tử tương ứng của ma trận khác .
  • Nhân một ma trận với một số duy nhất (vô hướng) (matrixmultiply) chỉ cần liên quan đến nhân mỗi phần tử của ma trận với số đó.
+0

Nếu nó hoạt động - phenominal. Lam tôt lăm! –

+0

Bạn là thần tượng của tôi! :) – KingBOB

+0

Tôi đã phân tích mã của bạn và thật đáng tiếc! :) Vấn đề duy nhất nằm trong thuật toán toán học: quá chậm. Có thể tăng tốc mã bằng cách chỉ tính số lượng vốn chủ sở hữu được xác định trên các địa điểm không? Ý tôi là: trong trường hợp có 6 người chơi, đoạn mã trên sẽ tính toán vốn chủ sở hữu của mọi người chơi trên mỗi địa điểm cho đến vị trí thứ 6. Nếu chúng ta chỉ cần vốn chủ sở hữu của họ ở vị trí số 1 và thứ 2, chúng ta có thể bỏ qua đoạn mã còn lại không? Sẽ hữu ích khi có một số thứ như print_r (equitymatrix ($ mystacks, 2)); Trường hợp số ở lại cho các địa điểm chúng tôi muốn tính toán vốn chủ sở hữu. – KingBOB

0

Tôi đoán câu hỏi lớn nhất là những gì bạn dự định sử dụng để làm. Cuối cùng tôi thực sự khuyên bạn nên sử dụng PHP. Nó không được thiết kế cho loại công việc này và cuối cùng bạn sẽ gây ra rất nhiều công việc cho bản thân.

Nếu bạn chỉ đang tìm phương tiện tính toán, tôi khuyên bạn nên sử dụng Octave (Phiên bản mã nguồn mở của MATLAB) Nếu bạn thực sự muốn xây dựng một chương trình xung quanh nó, bạn nên nhìn vào Python bằng mô-đun NumPy: http://numpy.scipy.org/


Nếu bạn có khả năng, tôi khuyên bạn nên sử dụng mod_python để chạy NumPy để xử lý việc này. Nó có thể sẽ là phương tiện đơn giản nhất để thực hiện nó vì NumPy có thể xử lý nguyên bản các Ma trận. Nói cách đó, bạn nên xem xét các lớp sau tồn tại để xử lý các ma trận trong PHP. Một số cá nhân đã phát triển một số lớp học được thiết kế đặc biệt để thao tác Ma trận.

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

+0

Tôi muốn tạo một trang web như thế này: http://www.icmpoker.com/Calculator.aspx Dường như nó sử dụng một thuật toán tương tự để tính toán chứng khoán. – KingBOB

+0

Đã đi trước và thêm một số thông tin cụ thể về những gì bạn đang có sau cùng với một số liên kết đến các lớp được thiết kế riêng cho Matrix Math trong PHP. Tôi vẫn nghĩ rằng Python sẽ xử lý nó tốt hơn, nhưng nó khó thực hiện hơn một chút tùy thuộc vào sự kiểm soát bạn có trên webhost của bạn. – Drahkar

+0

Cảm ơn người đàn ông, tôi sẽ làm một số nghiên cứu để đạt được điều này trong PHP bởi vì tôi không biết Python và thực hiện nó trong một trang web nên làm cho nó phức tạp hơn ... – KingBOB

0

Nếu bạn có Matlab cài đặt, với hộp công cụ toán học mang tính biểu tượng,

bạn có thể sử dụng ccode chức năng để dịch công thức này (hoặc bất kỳ khác) để c-mã (trong đó rất giống với php).

Các vấn đề liên quan