मुझे लगता है कि मैं मैट्रिक्स में प्रत्येक बिंदु की जांच करता हूं और इसके पड़ोसियों के आधार पर इसका द्रव्यमान समझता हूं। अंक के लिए द्रव्यमान दूरी के वर्ग के साथ गिर जाएगा। फिर आप शीर्ष चार बिंदुओं को एक दूसरे से न्यूनतम दूरी के साथ चुन सकते हैं।
यहां कुछ पायथन कोड है जो मैंने प्रत्येक बिंदु के लिए द्रव्यमान को खोजने के दृष्टिकोण को चित्रित करने के लिए एक साथ चाबुक किया है। कुछ सेटअप अपने उदाहरण मैट्रिक्स का उपयोग करते हुए:
matrix = [[1.0 if x == "X" else 0.0 for x in y] for y in """.XX......
.XXX..X..
.....XXX.
......X..
.XX......
.X.......
.X.......
....XX...
....XX...""".split("\n")]
HEIGHT = len(matrix)
WIDTH = len(matrix[0])
Y_RADIUS = HEIGHT/2
X_RADIUS = WIDTH/2
एक भी बिंदु के लिए द्रव्यमान की गणना करने के लिए:
def distance(x1, y1, x2, y2):
'Manhattan distance http://en.wikipedia.org/wiki/Manhattan_distance'
return abs(y1 - y2) + abs(x1 - x2)
def mass(m, x, y):
_mass = m[y][x]
for _y in range(max(0, y - Y_RADIUS), min(HEIGHT, y + Y_RADIUS)):
for _x in range(max(0, x - X_RADIUS), min(WIDTH, x + X_RADIUS)):
d = max(1, distance(x, y, _x, _y))
_mass += m[_y][_x]/(d * d)
return _mass
नोट: मैं Manhattan दूरी (उर्फ Cityblock, उर्फ Taxicab रेखागणित) का उपयोग कर रहा हूँ यहाँ क्योंकि मैं डॉन यूक्लिडियन दूरी का उपयोग करके जोड़ा गया सटीकता एसकर्ट() को कॉल करने की लागत के लायक नहीं है।
हमारे मैट्रिक्स के माध्यम से बार-बार दोहराना और जैसे tuples की एक सूची का निर्माण (एक्स, वाई, बड़े पैमाने पर (एक्स, वाई)):
point_mass = []
for y in range(0, HEIGHT):
for x in range(0, WIDTH):
point_mass.append((x, y, mass(matrix, x, y)))
प्रत्येक बिंदु के लिए बड़े पैमाने पर पर सूची सॉर्ट:
from operator import itemgetter
point_mass.sort(key=itemgetter(2), reverse=True)
कि अनुसार क्रमबद्ध सूची में शीर्ष 9 अंक को देखते हुए:
(6, 2, 6.1580555555555554)
(2, 1, 5.4861111111111107)
(1, 1, 4.6736111111111107)
(1, 4, 4.5938888888888885)
(2, 0, 4.54)
(4, 7, 4.4480555555555554)
(1, 5, 4.4480555555555554)
(5, 7, 4.4059637188208614)
(4, 8, 4.3659637188208613)
हम उच्चतम से न्यूनतम और filte करने के लिए काम करेंगे, तो आर दूर अंक है कि बहुत पहले से ही अंक हम मिल जाएगा देखा के करीब हैं (के बाद से मैं समय समाप्त हो चुकी है अब कोड में यह करने के लिए मैं इसे स्वयं कर रहा हूँ ...):
(6, 2, 6.1580555555555554)
(2, 1, 5.4861111111111107)
(1, 4, 4.5938888888888885)
(4, 7, 4.4480555555555554)
है कौन सा अपने मैट्रिक्स को देखने से एक सुंदर सहज परिणाम (ध्यान दें कि आपके उदाहरण की तुलना करते समय निर्देशांक शून्य आधारित होते हैं)।