Задания
Версия для печати и копирования в MS Word
Тип 27 № 78083
i

Фраг­мент звёзд­но­го неба спро­еци­ро­ван на плос­кость с де­кар­то­вой си­сте­мой ко­ор­ди­нат. Учёный решил про­ве­сти кла­сте­ри­за­цию по­лу­чен­ных точек, яв­ля­ю­щих­ся изоб­ра­же­ни­я­ми звёзд, то есть раз­бить их мно­же­ство на N не­пе­ре­се­ка­ю­щих­ся не­пу­стых под­мно­жеств (кла­сте­ров) так, что они будут ле­жать внут­ри сек­то­ра окруж­но­сти ра­ди­у­са R  =  50 с цен­траль­ным углом 20°.

Га­ран­ти­ру­ет­ся, что такое раз­би­е­ние су­ще­ству­ет и един­ствен­но.

Будем на­зы­вать цен­тром кла­сте­ра точку этого кла­сте­ра, Будем на­зы­вать цен­тром кла­сте­ра точку этого кла­сте­ра, сумма квад­ра­тов рас­сто­я­ний от ко­то­рой до всех осталь­ных точек кла­сте­ра ми­ни­маль­на. Рас­сто­я­ние между двумя точ­ка­ми на плос­ко­сти A(x1; y1) и B(x2; y2) вы­чис­ля­ет­ся по фор­му­ле:

d левая круг­лая скоб­ка A, B пра­вая круг­лая скоб­ка = ко­рень из: на­ча­ло ар­гу­мен­та: левая круг­лая скоб­ка x_2 минус x_1 пра­вая круг­лая скоб­ка в квад­ра­те плюс левая круг­лая скоб­ка y_2 минус y_1 пра­вая круг­лая скоб­ка в квад­ра­те конец ар­гу­мен­та .

В файле А хра­нят­ся дан­ные о звёздах трёх кла­сте­ров, для ко­то­рых цен­тром окруж­но­сти яв­ля­ет­ся точка C(5, –9). В каж­дой стро­ке за­пи­са­на ин­фор­ма­ция о рас­по­ло­же­нии на карте одной звез­ды: сна­ча­ла ко­ор­ди­на­та х, затем ко­ор­ди­на­та у. Зна­че­ния даны в услов­ных еди­ни­цах. Из­вест­но, что ко­ли­че­ство звёзд не пре­вы­ша­ет 1000.

В файле Б хра­нят­ся дан­ные о звёздах шести кла­сте­ров, для ко­то­рых цен­тром окруж­но­сти яв­ля­ет­ся точка C(–10, –7). Из­вест­но, что ко­ли­че­ство звёзд не пре­вы­ша­ет 10 000. Струк­ту­ра хра­не­ния ин­фор­ма­ции о звёздах в файле Б ана­ло­гич­на файлу А.

Файл A

Файл B

Для каж­до­го файла опре­де­ли­те ко­ор­ди­на­ты цен­тра каж­до­го кла­сте­ра, затем вы­чис­ли­те два числа: Pх  — сред­нее ариф­ме­ти­че­ское абс­цисс цен­тров кла­сте­ров, и Py  — сред­нее ариф­ме­ти­че­ское ор­ди­нат цен­тров кла­сте­ров.

В от­ве­те за­пи­ши­те че­ты­ре числа: в пер­вой стро­ке сна­ча­ла целую часть про­из­ве­де­ния |Pх| × 10 000, затем целую часть про­из­ве­де­ния |Py| × 10 000 для файла А, во вто­рой стро­ке  — ана­ло­гич­ные дан­ные для файла Б. Воз­мож­ные дан­ные од­но­го из фай­лов ил­лю­стри­ро­ва­ны гра­фи­ком.

Вни­ма­ние! Гра­фик при­ведён в ил­лю­стра­тив­ных целях для про­из­воль­ных зна­че­ний, не име­ю­щий от­но­ше­ния к за­да­нию. Для вы­пол­не­ния за­да­ния ис­поль­зуй­те дан­ные из при­ла­га­е­мых фай­лов.

Ответ:

Спрятать решение

Ре­ше­ние.

По­стро­им диа­грам­мы для файла А и Б. Для этого вос­поль­зу­ем­ся таб­лич­ным ре­дак­то­ром.

 

Диа­грам­ма для файла А:

Диа­грам­ма для файла Б:

 

При­ведём ре­ше­ние на языке Python для фай­лов А и Б.

def euclidean_dist_sq(p1, p2):

return (p2[0] - p1[0])**2 + (p2[1] - p1[1])**2

 

def find_center(points):

if not points:

return None

min_sum = float('inf')

best = None

for cand in points:

s = sum(euclidean_dist_sq(cand, p) for p in points)

if s < min_sum:

min_sum = s

best = cand

return best

 

def process_file(path, clusters):

stars = []

with open(path) as f:

for line in f:

parts = line.strip().split()

if len(parts) == 2:

try:

x = float(parts[0].replace(',', '.'))

y = float(parts[1].replace(',', '.'))

stars.append((x, y))

except:

continue

cl = [[] for _ in range(clusters)]

if path == '27_А.txt':

for p in stars:

if p[1] < -7:

cl[0].append(p)

elif 34 > p[0] > 11 and 11 > p[1] > -5:

cl[1].append(p)

else:

cl[2].append(p)

elif path == '27_Б.txt':

for p in stars:

if p[1] < -5:

cl[0].append(p)

elif p[1] < p[0] + 1:

cl[1].append(p)

elif p[1] < 2*p[0] + 11:

cl[2].append(p)

elif p[1] < 13*p[0] + 120:

cl[3].append(p)

elif p[1] > -2.5*p[0] - 30:

cl[4].append(p)

else:

cl[5].append(p)

centers = [find_center(c) for c in cl if c]

cx = sum(c[0] for c in centers) / len(centers)

cy = sum(c[1] for c in centers) / len(centers)

return cx, cy

 

# Об­ра­бот­ка фай­лов

cx_a, cy_a = process_file('27_А.txt', 3)

print(f"Файл А: {int(abs(cx_a)*10000)}; {int(abs(cy_a)*10000)}")

 

cx_b, cy_b = process_file('27_Б.txt', 6)

print(f"Файл Б: {int(abs(cx_b)*10000)}; {int(abs(cy_b)*10000)}")

 

Ответ: 186569; 4613; 35070; 53852.


Аналоги к заданию № 78052: 78083 Все