2012-02-09 13 views
12

मैं समानांतर में एक सिमुलेशन के कई उदाहरण चलाना चाहते हैं के लिए अलग यादृच्छिक बीज के साथ बहु, लेकिन प्रत्येक सिमुलेशन अपनी स्वतंत्र डेटा सेट होने के साथ। इस प्रकारका उपयोग अजगर प्रत्येक प्रक्रिया

वर्तमान में मैं यह लागू:

P = mp.Pool(ncpus) # Generate pool of workers 
for j in range(nrun): # Generate processes 
    sim = MDF.Simulation(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat,savetemp) 
    lattice = MDF.Lattice(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, kb, ks, kbs, a, p, q, massL, randinit, initvel, parangle,scaletemp,savetemp) 
    adatom1 = MDF.Adatom(tstep, temp, time, writeout, boundaryxy, boundaryz, relax, insert, lat, ra, massa, amorse, bmorse, r0, z0, name, lattice, samplerate,savetemp)   
    P.apply_async(run,(j,sim,lattice,adatom1),callback=After) # run simulation and ISF analysis in each process 
P.close() 
P.join() # start processes 

जहां sim, adatom1 और lattice समारोह run जो सिमुलेशन शुरू की के लिए पारित वस्तुओं रहे हैं।

हालांकि, मुझे हाल ही में पता चला है कि प्रत्येक बैच मैं एक साथ चलाता हूं (यानी, प्रत्येक ncpus सिमुलेशन रन के कुल nrun में से चलाता है) सटीक समान परिणाम देता है।

किसी को यहाँ इसे ठीक करने के प्रबुद्ध कर सकते हैं?

+0

में पाया जा सकता कैसे आप परिणाम प्राप्त करते हैं? –

+0

क्या इसमें यादृच्छिक संख्या शामिल है? आप बीज कैसे लगा रहे हैं? इन्हें अलग क्यों होना चाहिए? यदि आप दो बार एक ही प्रक्रिया चलाते हैं तो यह दो बार एक ही परिणाम उत्पन्न करना चाहिए। आपको क्यों लगता है कि वे अलग होना चाहिए? –

+0

फ़ंक्शन 'रन' सिमुलेशन शुरू करता है और परिणाम देता है जो सभी परिणामों को समेकित करने के लिए 'आफ्टर' फ़ंक्शन को निर्देशित करता है। प्रत्येक सिमुलेशन में यादृच्छिक प्रारंभिक स्थितियां होती हैं, इसलिए मुझे अलग-अलग परिणाम होने की उम्मीद है। मैं एक बीज का उपयोग नहीं करता जो मुझे लगता है। मैं निम्नलिखित कोड का उपयोग करें: randshift = np.random.rand (क, ख) -0.5 * np.ones ((ए, बी)) –

उत्तर

15

बस मैं यह दूसरों के लिए स्पष्ट करना एक वास्तविक जवाब जोड़ना होगा सोचा।

aix in this question से जवाब का हवाला देते हुए:

कि यूनिक्स पर हर वर्कर प्रोसेस माता पिता प्रक्रिया से यादृच्छिक संख्या जनरेटर का एक ही राज्य विरासत में क्या होता है है। यह है क्यों वे समान छद्म-यादृच्छिक अनुक्रम उत्पन्न करते हैं।

बीज को ठीक से सेट करने के लिए random.seed() विधि (या scipy/numpy समकक्ष) का उपयोग करें। this numpy thread भी देखें।

+1

यह गारंटी देता है कि प्रत्येक नई प्रक्रिया के साथ यादृच्छिक संख्याओं का उपयोग करने वाली कोई भी लाइब्रेरी एक नई यादृच्छिक संख्या के साथ सही ढंग से शुरू हो जाएगी? या क्या हमें प्रत्येक पुस्तकालय के लिए यादृच्छिक संख्या सेट करने की आवश्यकता है? –

0

समस्या के लिए एक समाधान समारोह run जो यादृच्छिक कार्यों run से कहा जाता है के लिए एक नया बीज आवंटित में scipy.random.seed() उपयोग करने के लिए किया गया था।

ऐसा ही एक समस्या (जिसमें से मैं समाधान प्राप्त) multiprocessing.Pool seems to work in Windows but not in ubuntu?

+0

क्या यादृच्छिक संख्याओं का उपयोग करने वाली हर प्रक्रिया के लिए यादृच्छिक संख्या सेट करने का कोई तरीका नहीं है? मान लें कि मॉड्यूल यादृच्छिक, numpy, scipy, tensorflow का उपयोग करता है और कौन जानता है और क्या। यह सुनिश्चित करने का एकमात्र तरीका है कि प्रक्रिया में से प्रत्येक के माध्यम से जाने के लिए एक अलग यादृच्छिक बीज है और मैन्युअल रूप से राज्य सेट करें? –

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