2011-12-22 14 views
17

मैं एक गणित फॉर्मूला को PHP कोड में बदलने की कोशिश कर रहा हूं।हास्केल या पायथन में इस गणित फॉर्मूला का अनुवाद कैसे करें? (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 बुलाया पाया, इसे स्थापित लेकिन मैं मैट्रिक्स की इस प्रकार की बनाने का तरीका सोच रहा हूँ।

मुझे चिंता है कि पूरे कोड अनुवाद करने में सक्षम है क्योंकि वह पुनरावर्ती कॉल आदि

क्या आप मेरी मदद कर सकते हैं की तरह अग्रिम तरीकों का उपयोग करता नहीं होगा हूँ?

संपादित करें: पुराने इनाम पुरस्कार

मैंने कोशिश की कि तुम क्या सुझाव दिया है, लेकिन मैं क्योंकि मेरे गरीब प्रोग्रामिंग कौशल के अपने समय बर्बाद कर की तरह लग रहा है।

मैंने PHP में फॉर्मूला को ट्रांसफर करके मेरी सहायता करने के लिए कुछ बाध्यता देने के लिए 50 बाउंटी ऑफ़र करने का निर्णय लिया है।

ध्यान दें कि यदि आपको लगता है कि पाइथन में अनुवाद करना आसान/अधिक उपयुक्त/अन्य है, तो कृपया मुझे एक 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)); 

मैट्रिक्स का उपयोग करने के रूप में:

पीएचपी में, एक मैट्रिक्स सरणियों की एक सरणी के रूप में प्रतिनिधित्व किया जा सकता है। आप देख सकते हैं कि फ़ंक्शन makematrix में, जो लंबाई height, की एक सरणी देता है जिसमें प्रत्येक तत्व width शून्य का सरणी होता है।

  • दो मैट्रिक्स जोड़ना (matrixadd): आपकी समस्या निम्नलिखित मैट्रिक्स आपरेशन, जो दोनों के सरल हैं उपयोग करता है। यहां, बस एक मैट्रिक्स के तत्वों को अन्य मैट्रिक्स के संबंधित तत्वों में जोड़ें।
  • एक एकल संख्या (एक स्केलर) (matrixmultiply) द्वारा मैट्रिक्स को गुणा करना बस में उस संख्या से मैट्रिक्स के प्रत्येक तत्व को गुणा करना शामिल है।
+0

यदि यह काम करता है - phenominal। अच्छा काम! –

+0

तुम मेरी मूर्ति हो! :) – KingBOB

+0

मैंने आपके कोड का विश्लेषण किया है और यह बहुत ही अजीब है! :) गणित एल्गोरिदम में ही एकमात्र समस्या है: बहुत धीमी। यह स्थानों पर इक्विटी का केवल एक निर्धारित संख्या की गणना के द्वारा कोड तेजी लाने के लिए संभव है? मेरा मतलब है: एक परिदृश्य में जहां 6 खिलाड़ी हैं, ऊपर दिया गया कोड 6 वें स्थान तक प्रत्येक स्थान पर प्रत्येक खिलाड़ी की इक्विटी की गणना करेगा। यदि हमें केवल प्रथम और दूसरी जगह पर उनकी इक्विटी की आवश्यकता है तो क्या हम शेष कोड छोड़ सकते हैं, है ना? प्रिंट_आर (इक्विटीमैट्रिक्स ($ mystacks, 2)) जैसे कुछ होना उपयोगी होगा; जहां नंबर उन स्थानों के लिए रहता है जहां हम इक्विटी की गणना करना चाहते हैं। – KingBOB

0

मुझे लगता है कि सबसे बड़ा सवाल यह है कि आप इसका उपयोग करने की योजना बना रहे हैं। अंत में मैं वास्तव में PHP का उपयोग करने के खिलाफ सिफारिश करेंगे। यह इस प्रकार के काम के लिए डिज़ाइन नहीं किया गया है और आप बाद में अपने लिए बहुत काम कर सकते हैं।

यदि आप इसकी गणना करने के साधन की तलाश में हैं, तो मैं ऑक्टेव (MATLAB का ओपनसोर्स संस्करण) का उपयोग करने की अनुशंसा करता हूं यदि आप वास्तव में इसके आसपास एक प्रोग्राम बनाना चाहते हैं, तो आपको न्यूमपी मॉड्यूल का उपयोग करके पायथन में देखना चाहिए: http://numpy.scipy.org/


आप की क्षमता है, तो मैं इस संभाल करने NumPy चलाने के लिए mod_python का उपयोग कर की सिफारिश करेंगे। यह संभवतः ऐसा करने का सबसे आसान माध्यम होगा क्योंकि न्यूमपी मूल रूप से मैट्रिस को संभाल सकता है। इसे छोड़कर, आपको निम्न वर्गों को देखना चाहिए जो PHP में matrices को संभालने के लिए मौजूद हैं। कुछ व्यक्तियों ने विशेष रूप से मैट्रिस में हेरफेर करने के लिए डिज़ाइन की गई कुछ कक्षाएं विकसित की हैं।

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 में मैट्रिक्स मैथ के लिए विशेष रूप से डिज़ाइन की गई कक्षाओं के कुछ लिंक के साथ आप जो कुछ भी कर रहे हैं उसके लिए कुछ और जानकारी निर्दिष्ट की। मुझे अभी भी लगता है कि पाइथन इसे बेहतर तरीके से संभाल लेगा, लेकिन आपके वेबहोस्ट पर आपके नियंत्रण के आधार पर इसे लागू करना थोड़ा मुश्किल है। – Drahkar

+0

धन्यवाद आदमी, मैं PHP में इसे प्राप्त करने के लिए कुछ शोध करूँगा क्योंकि मुझे पायथन नहीं पता है और इसे वेबसाइट में लागू करने से इसे और भी जटिल बनाना चाहिए ... – KingBOB

0

आप मैटलैब प्रतीकात्मक गणित टूलबॉक्स साथ इंस्टॉल है, तो,

आप सी कोड को यह सूत्र (या किसी अन्य) (जो बहुत php के समान है अनुवाद करने के लिए ccode समारोह का उपयोग कर सकते)।

संबंधित मुद्दे