2014-12-16 3 views
5

मैं कई यादृच्छिक स्थिति वेक्टर उत्पन्न करने के लिए एक कुशल कोड उत्पन्न करने की कोशिश कर रहा हूं जिसका उपयोग मैं एक जोड़ी सहसंबंध समारोह की गणना के लिए करता हूं। मैं सोच रहा हूं कि मेरे बॉक्स में रखे गए किसी भी दो बिंदुओं के बीच न्यूनतम दूरी पर बाधा स्थापित करने का सीधा तरीका है या नहीं।numpy.random.rand के साथ अंक उत्पन्न करने के लिए मैं न्यूनतम दूरी बाधा कैसे निर्धारित कर सकता हूं?

मेरे कोड वर्तमान में इस प्रकार है:

def pointRun(number, dr): 
""" 
Compute the 3D pair correlation function 
for a random distribution of 'number' particles 
placed into a 1.0x1.0x1.0 box. 
""" 
## Create array of distances over which to calculate. 
    r = np.arange(0., 1.0+dr, dr) 

## Generate list of arrays to define the positions of all points, 
## and calculate number density. 
    a = np.random.rand(number, 3) 
    numberDensity = len(a)/1.0**3 

## Find reference points within desired region to avoid edge effects. 
    b = [s for s in a if all(s > 0.4) and all(s < 0.6) ] 

## Compute pairwise correlation for each reference particle 
    dist = scipy.spatial.distance.cdist(a, b, 'euclidean') 
    allDists = dist[(dist < np.sqrt(3))] 

## Create histogram to generate radial distribution function, (RDF) or R(r) 
    Rr, bins = np.histogram(allDists, bins=r, density=False) 

## Make empty containers to hold radii and pair density values. 
    radii = [] 
    rhor = [] 

## Normalize RDF values by distance and shell volume to get pair density. 
    for i in range(len(Rr)): 
     y = (r[i] + r[i+1])/2. 
     radii.append(y) 
     x = np.average(Rr[i])/(4./3.*np.pi*(r[i+1]**3 - r[i]**3)) 
     rhor.append(x) 

## Generate normalized pair density function, by total number density 
    gr = np.divide(rhor, numberDensity) 
    return radii, gr 

मैं पहले कि प्रत्येक बिंदु के लिए सभी दूरी की गणना के रूप में यह किया गया था और उसके बाद स्वीकार या अस्वीकार कर एक पाश का उपयोग कर की कोशिश की है। यदि मैं बहुत सारे अंक का उपयोग करता हूं तो यह विधि बहुत धीमी थी।

+1

आप [इस एल्गोरिदम] के एक संस्करण का उपयोग करने में सक्षम हो सकते हैं (http://stackoverflow.com/questions/6002407/placing-random-circles-without-overlap-and-without-using-brute-force/6002708 # 6002708), लेकिन चेतावनी यह है कि इसमें न्यूनतम रिज़ॉल्यूशन है (और जितना अधिक महंगा होगा उतना ही महंगा है)। – Rufflewind

उत्तर

1

जैसा कि मैंने समझा, आप एक बॉक्स में कई यादृच्छिक बिंदु बनाने के लिए एक एल्गोरिदम खोज रहे हैं जैसे कि कोई भी दो बिंदु कुछ न्यूनतम दूरी से करीब न हो। यदि यह आपकी समस्या है, तो आप सांख्यिकीय भौतिकी का लाभ उठा सकते हैं, और आणविक गतिशीलता सॉफ्टवेयर का उपयोग करके इसे हल कर सकते हैं। इसके अलावा, आपको इस समस्या का सटीक समाधान प्राप्त करने के लिए आणविक गतिशीलता या मोंटे कार्लो की आवश्यकता है।

आप आयताकार बॉक्स में एन परमाणु रखते हैं, उनके बीच एक निश्चित त्रिज्या (जैसे लेनार्ड-जोन्स इंटरैक्शन) को स्थानांतरित करने के लिए एक प्रतिकूल बातचीत करते हैं, और कुछ समय के लिए सिमुलेशन चलाते हैं (जब तक आप देखते हैं कि अंक समान रूप से फैले हुए नहीं हैं डिब्बा)। सांख्यिकीय भौतिकी के नियमों से आप दिखा सकते हैं कि अंक की स्थिति अधिकतम यादृच्छिक बाध्यता दी गई है कि अंक कुछ दूरी से अधिक नहीं हो सकते हैं। यह सच नहीं हो, तो आप इस तरह के अंक एक-एक करके रख कर उन्हें खारिज करता है, तो वे ओवरलैप

मैं 10000 अंक के लिए कई सेकंड के क्रम का अनुमान होता है, और 100k के लिए कई मिनट के रूप में पुनरावृत्ति एल्गोरिथ्म का उपयोग करें, होगा। मैं अपने सभी moelcular गतिशीलता सिमुलेशन के लिए ओपनएमएम का उपयोग करें।

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