2014-12-16 15 views
5

Tôi đang cố gắng tạo ra một mã hiệu quả để tạo ra một số vectơ vị trí ngẫu nhiên mà sau đó tôi sử dụng để tính toán một hàm tương quan cặp. Tôi tự hỏi nếu có cách đơn giản để thiết lập một hạn chế về khoảng cách tối thiểu cho phép giữa bất kỳ hai điểm được đặt trong hộp của tôi.Làm cách nào để tôi có thể đặt giới hạn khoảng cách tối thiểu để tạo điểm bằng numpy.random.rand?

Mã của tôi hiện nay là như sau:

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 

trước đây tôi đã cố gắng sử dụng một vòng lặp mà tính toán tất cả các khoảng cách cho mỗi điểm như nó đã được thực hiện và sau đó chấp nhận hoặc từ chối. Phương pháp này rất chậm nếu tôi sử dụng nhiều điểm.

+1

Bạn có thể sử dụng một biến thể của [thuật toán này] (http://stackoverflow.com/questions/6002407/placing-random-circles-without-overlap-and-without-using-brute-force/6002708 # 6002708), nhưng báo trước là nó có độ phân giải tối thiểu (và nó càng cao thì càng tốn kém). – Rufflewind

Trả lời

1

Như tôi đã hiểu, bạn đang tìm kiếm một thuật toán để tạo nhiều điểm ngẫu nhiên trong một hộp sao cho không có hai điểm nào gần hơn một khoảng cách tối thiểu. Nếu đây là vấn đề của bạn, thì bạn có thể tận dụng lợi thế của vật lý thống kê, và giải quyết nó bằng cách sử dụng phần mềm động học phân tử. Hơn nữa, bạn cần động lực phân tử hoặc Monte Carlo để có được giải pháp chính xác cho vấn đề này.

Bạn đặt nguyên tử N vào hộp hình chữ nhật, tạo tương tác đẩy của bán kính cố định giữa chúng (chẳng hạn như tương tác Lennard-Jones đã chuyển) và chạy mô phỏng một thời gian (cho đến khi bạn thấy rằng các điểm trải đều cái hộp). Theo định luật vật lý thống kê, bạn có thể chỉ ra rằng các vị trí của các điểm sẽ là ngẫu nhiên tối đa do ràng buộc mà các điểm không thể gần hơn một khoảng cách nào đó. Điều này sẽ không đúng nếu bạn sử dụng thuật toán lặp lại, chẳng hạn như đặt từng điểm một và từ chối chúng nếu chúng chồng chéo

Tôi ước tính thời gian chạy là vài giây cho 10000 điểm và vài phút cho 100k. Tôi sử dụng OpenMM cho tất cả các mô phỏng động lực moelcular của tôi.

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