2010-11-05 19 views
6

के रूप में काम नहीं कर रहा है इसलिए मैं एक ह्युरिस्टिक एल्गोरिदम लागू कर रहा हूं, और मैं इस समारोह में आया हूं।सी ++ का उपयोग करके कार्यान्वित एक पेपर से संभाव्यता घनत्व समारोह,

मेरे पास 1 से एन (0 से एन, 1 से सी, डब्ल्यू/ई) की एक सरणी है। मैं कई तत्वों को चुनना चाहता हूं जिन्हें मैं दूसरी सरणी में कॉपी करूंगा। पैरामीटर वाई को देखते हुए, (y < = 1), मैं उन संख्याओं का वितरण करना चाहता हूं जिनकी औसत (y * n) है। इसका मतलब है कि जब भी मैं इस समारोह को कॉल करता हूं, तो यह मुझे 0 और एन के बीच एक संख्या देता है, और इन संख्याओं का औसत y * n है।

लेखक के अनुसार, "एल" एक यादृच्छिक संख्या है: 0 < एल < एन। मेरे परीक्षण कोड पर वर्तमान में 0 < = l < = n उत्पन्न हो रहा है। और मेरे पास सही कोड था, लेकिन मैं इसके साथ घंटों तक गड़बड़ कर रहा हूं, और मैं इसे वापस कोड करने के लिए आलसी हूं।

तो मैं समारोह के पहले भाग कोडित, वाई < = 0.5 मैं y 0.2 करने के लिए सेट के लिए, और एन 100 इसका मतलब है कि यह 0 से 99 के बीच एक नंबर लौटना पड़ा, औसत 20. और साथ करने के लिए परिणाम 0 और एन के बीच नहीं हैं, लेकिन कुछ तैरते हैं। और बड़ा एन है, यह फ्लोट छोटा है।

यह सी परीक्षण कोड है। "एक्स" "एल" पैरामीटर है।

0.03354 
0.00484 
0.00003 
0.00029 
0.00020 
0.00028 
0.00263 
0.01619 
0.00032 
0.00000 
0.03598 
0.03975  
0.00704 
0.00176 
0.00001 
0.01333 
0.03396 
0.02795 
0.00005 
0.00860 

लेख है:

//hate how code tag works, it's not even working now 
int n = 100; 
float y = 0.2; 
float n_copy; 

for(int i = 0 ; i < 20 ; i++) 
{ 
    float x = (float) (rand()/(float)RAND_MAX); // 0 <= x <= 1 
    x = x * n;        // 0 <= x <= n 
    float p1 = (1 - y)/(n*y); 
    float p2 = (1 - (x/n)); 
    float exp = (1 - (2*y))/y; 
    p2 = pow(p2, exp); 
    n_copy = p1 * p2; 
    printf("%.5f\n", n_copy); 
} 

और यहाँ कुछ परिणाम (5 दशमलव छोटा कर दिया) कर रहे हैं

http://www.scribd.com/doc/3097936/cAS-The-Cunning-Ant-System

पृष्ठों 6 और 7

या खोज " सीएएस: चालाक चींटी प्रणाली "गूगल पर।

तो मैं गलत क्या कर रहा हूं? मुझे विश्वास नहीं है कि लेखक गलत है, क्योंकि इस कार्य को वर्णित 5 से अधिक कागजात हैं।

मेरे सभी इंटर्ननेट जो भी मेरी मदद करता है। यह मेरे काम के लिए महत्वपूर्ण है।

धन्यवाद :)

+1

कोड टैग का उपयोग न करें। SO wierd है, यह कोड इंगित करने के लिए 4 रिक्त स्थान का उपयोग करता है। बस कोड कॉपी करें, फिर इसे सभी का चयन करें और फिर कोड बनाने के लिए 1010 बटन दबाएं। –

+3

ऐसा इसलिए है क्योंकि प्रश्न और उत्तर बॉक्स मार्कडाउन का उपयोग करते हैं: http://daringfireball.net/projects/markdown/syntax – zwol

उत्तर

4

डीएमकी वास्तव में सही है, लेकिन मैंने सोचा कि मैं और अधिक विस्तारित करता हूं और यहां कुछ भ्रम को समझाने की कोशिश करता हूं। मैं निश्चित रूप से असफल हो सकता था। f_s(l), आपके सुंदर सूत्र में आपके पास फ़ंक्शन है, संभावना वितरण फ़ंक्शन है। यह आपको 0 और 3 के बीच दिए गए इनपुट l के लिए बताता है, l की संभावना सेगमेंट की लंबाई है। 0 और n के बीच के सभी मानों के लिए योग (अभिन्न) 1 के बराबर होना चाहिए।

पृष्ठ 7 के शीर्ष पर वाला आलेख इस बिंदु को भ्रमित करता है। यह l बनाम f_s(l) प्लॉट करता है, लेकिन आपको पक्ष में रखे भटकने वाले कारकों के लिए देखना होगा। आप देखते हैं कि नीचे दिए गए मान 0 से 1 तक जाते हैं, लेकिन पक्ष में x n का एक कारक है, जिसका अर्थ है कि l मान वास्तव में 0 से n तक जाते हैं। इसके अलावा, वाई-अक्ष पर x 1/n है जिसका अर्थ है कि ये मान वास्तव में लगभग 3 तक नहीं जाते हैं, वे 3/n पर जाते हैं।

तो अब आप क्या करते हैं? खैर, आपको l पर संभाव्यता वितरण फ़ंक्शन को एकीकृत करके संचयी वितरण फ़ंक्शन के लिए हल करने की आवश्यकता है जो वास्तव में बहुत खराब नहीं होता है (मैंने इसे l के लिए x का उपयोग करके वुल्फ्राम मैथमैटिका ऑनलाइन इंटीग्रेटर के साथ किया और केवल y के लिए समीकरण का उपयोग करके < = .5)। हालांकि वह अनिश्चित अनंत का उपयोग कर रहा था और आप 0 से l पर x के साथ वास्तव में एकीकरण कर रहे हैं। यदि हम परिणामस्वरूप समीकरण को कुछ चर (उदाहरण के लिए जेड) के बराबर सेट करते हैं, तो लक्ष्य अब z12 के फ़ंक्शन के रूप में l के लिए हल करना है। z यहां 0 और 1 के बीच एक यादृच्छिक संख्या है। यदि आप चाहें तो मैं इस भाग के लिए एक प्रतीकात्मक सॉल्वर का उपयोग करने का प्रयास कर सकता हूं (मैं चाहता हूं)। फिर आपने इस वितरण से यादृच्छिक l एस चुनने में सक्षम होने का लक्ष्य हासिल नहीं किया है, आपने निर्वाण भी प्राप्त किया है।

एक छोटे से अधिक काम किया

मैं थोड़ा और अधिक मदद करेंगे। मैंने y < = .5 के लिए जो कहा, मैंने कोशिश की, लेकिन मैं जिस प्रतीकात्मक बीजगणित प्रणाली का उपयोग कर रहा था वह उलटा करने में सक्षम नहीं था (कुछ अन्य सिस्टम सक्षम हो सकता है)। हालांकि, मैंने .5 < वाई < = 1. के लिए समीकरण का उपयोग करने का प्रयास करने का निर्णय लिया। यह बहुत आसान हो गया है।अगर मैं f_s(l) में एक्स के लिए l बदल रहा

y/n/(1 - y) * (x/n)^((2 * y - 1)/(1 - y)) 

मिलता 0 से l को मैं (मेथेमेटिका के ऑनलाइन इंटीग्रेटर का प्रयोग करके) मिला एक्स पर इस घालमेल:

(l/n)^(y/(1 - y)) 

ऐसा नहीं है कि तुलना में बहुत अच्छे नहीं मिलता है इस तरह की चीज के साथ। अगर मैं जेड को यह बराबर सेट और l के लिए हल मैं:

l = n * z^(1/y - 1)  for .5 < y <= 1 

एक त्वरित जांच y = 1. इस मामले में के लिए है, तो हम कोई बात नहीं क्या z है l = n मिलता है। अब तक सब ठीक है। अब, आप सिर्फ जेड (0 और 1 के बीच एक यादृच्छिक संख्या) उत्पन्न करते हैं और आपको l मिलता है जिसे आप 5,y < == 1. के लिए वांछित वितरित करते हैं। 1. लेकिन प्रतीक्षा करें, पेज 7 पर आलेख को देखते हुए आप देखते हैं कि संभावना वितरण समारोह सममित है। इसका मतलब है कि हमवाई < = .5 के मान को खोजने के लिए उपर्युक्त परिणाम का उपयोग कर सकते हैं। >n-l और y - - हम सिर्फ l बदलने>1-y और

n - l = n * z^(1/(1 - y) - 1) 

l = n * (1 - z^(1/(1 - y) - 1))  for 0 < y <= .5 

वैसे भी मिलता है, जब तक कि मैं कुछ त्रुटि कहीं कर दिया कि आपकी समस्या का समाधान करना चाहिए। सौभाग्य।

+0

धन्यवाद, जस्टिन। अंतर्ज्ञान और पोस्ट शीर्षक के आधार पर मेरा जवाब लिखने के बाद, मैं वास्तव में बाहर गया, आपको पता है, पेपर पढ़ें - और मुझे खुशी है कि मैंने ऐसा किया क्योंकि यह उन सभी अच्छी चीजों से भरा है जो मैंने पहले नहीं देखा था। किसी भी मामले में, मुझे लगता है कि आपने यहां कुछ महत्वपूर्ण बिंदुओं को मारा है। विशेष रूप से सामान्यीकरण [0, एन) से अधिक है, जब मैं इसे [0,1) से अधिक उम्मीद करता। – dmckee

+0

@dmckee, हाँ, मुझे लगता है कि यह सामान बहुत अच्छा है। मैंने एल्गोरिदम के इस प्रकार के बारे में थोड़ा सा पढ़ा है, लेकिन ज्यादा नहीं। मैं खुद को इस सामान में और अधिक प्राप्त करना चाहता हूं। –

+0

ओह लड़का ... मैंने ग्राफ पर उन कारकों को देखा, और मैं एक्स अक्ष को समझ गया, लेकिन 'x 1/n' मैंने अनदेखा किया। तो मैंने आपका पाठ पढ़ा, और मैंने अपने दो साल के कैलकुस को याद दिलाया, लेकिन मुझे आपको कुछ कहना है .. यह अंग्रेजी में है, और मैं एक चीज़ को समझ नहीं पाया (मैं ब्राजीलियाई हूं, इसलिए मेरा कोर्स पुर्तगाली में था)। क्या आप इसे सबसे आसान तरीका करने में मेरी मदद कर सकते हैं? मैं इसे कार्यान्वित करूंगा, और मैं सबसे अच्छा प्रदर्शन चाहता हूं, एक सामान्य वितरण यादृच्छिक संख्या प्राप्त करने के लिए बहुत अधिक गणना नहीं। बीटीडब्ल्यू, यह मेरी डिग्री पर मेरे अंतिम कार्य के लिए है, यह चींटी सिस्टम और क्यूएपी के बारे में है। – hfingler

0

यह देखते हुए कि कोई भी मान एल के लिए, वाई, एन के रूप में वर्णित, नियम आप p1 फोन और p2 में [0,1 दोनों कर रहे हैं) और exp [1 में है, ..) बनाने पाउ (पी 2, एक्सपी) भी [0,1) में है, इस प्रकार मैं नहीं देखता कि आप कभी भी श्रेणी [0, एन)

6

के साथ आउटपुट कैसे प्राप्त करेंगे, आप गलत समझ सकते हैं कि आपसे क्या अपेक्षा की जाती है।

एक (उचित रूप से सामान्यीकृत) पीडीएफ दिया गया है, और इसके साथ एक यादृच्छिक वितरण को फेंकना चाहते हैं, तो आप पीडीएफ को एकीकृत करके संचयी संभाव्यता वितरण (सीडीएफ) बनाते हैं, फिर सीडीएफ को घुमाते हैं, और एक समान यादृच्छिक भविष्यवाणी का उपयोग करते हैं उलटा समारोह का तर्क।


थोड़ा और विस्तार।

f_s(l) पीडीएफ है, और [0,n) पर सामान्यीकृत किया गया है।

अब आप इसे बनाने के लिए CDF

g_s(l') = \int_0^{l'} dl f_s(l) 

ध्यान दें कि यह एक अनिर्दिष्ट endpoint जो मैं l' कहा जाता है करने के लिए एक निश्चित अभिन्न अंग है एकीकृत। सीडीएफ तदनुसार l' का एक कार्य है। मान लें कि हमारे पास सामान्यीकरण सही है, g_s(N) = 1.0। यदि ऐसा नहीं है तो हम इसे ठीक करने के लिए एक सरल गुणांक लागू करते हैं।

अगला सीडीएफ उलटा करें और परिणाम G^{-1}(x) पर कॉल करें। इसके लिए आप शायद गामा का एक विशेष मूल्य चुनना चाहते हैं।

फिर [0,n) पर वर्दी यादृच्छिक संख्या फेंक दें, और x पर G^{-1} पर तर्क के रूप में उनका उपयोग करें। परिणाम [0,1) के बीच होना चाहिए, और f_s के अनुसार वितरित किया जाना चाहिए।

जस्टिन की तरह, आप गणित के लिए कंप्यूटर बीजगणित प्रणाली का उपयोग कर सकते हैं।

+0

तो 'f_s (l)' एक सीडीएफ है? [0, एन] यादृच्छिक संख्या प्राप्त करने के लिए मुझे क्या करना चाहिए? क्षमा करें, मैं वास्तव में संभावना में नहीं हूं, वास्तव में मुझे लगभग अस्वीकार कर दिया गया है (यह शब्द अजीब लगता है .. अनुवादित Google पर अनुवाद किया गया है) संभावना वर्ग पर। वैसे भी, हमने इस तरह की चीजें नहीं सीखी हैं .. ओह, आपके स्पष्टीकरण के लिए धन्यवाद :) – hfingler

+0

तो मुझे जो नंबर चाहिए ([0, n] और avg y के साथ) का एकमात्र तरीका, क्या आपने कहा है? मुझे नहीं लगता कि एकीकृत करना एक अच्छा विचार होगा, क्योंकि यह इतना आसान/तेज़ नहीं है। मुझे जितनी जल्दी संभव हो सके, कम गणना संभव है। अगर मुझे ऐसा करना है, तो मुझे लगता है कि मैं कुछ और सरल, वितरण का अध्ययन करूंगा। – hfingler

+0

@ पोलर: यदि आप संभव हो तो * प्रतीकात्मक रूप से * एकीकृत और उलटा करना चाहते हैं, और कोड में केवल परिणाम ('G^{- 1}') लागू करें। आप ** निश्चित रूप से ** प्रत्येक पास पर संख्यात्मक रूप से एकीकृत नहीं करना चाहते हैं! यदि आपको संख्यात्मक रूप से एकीकृत करना होगा तो आप इसे एक बार करेंगे, और उलटा परिणाम को सामान्यीकृत हिस्टोग्राम के रूप में स्टोर करेंगे। इस विवरण के बारे में अन्य प्रश्न हैं कि हिस्टोग्राम के खिलाफ संख्या कैसे आकर्षित करें। आप इसे सबसे अधिक संख्यात्मक विश्लेषण ग्रंथों में भी पा सकते हैं। – dmckee