Задания
Версия для печати и копирования в MS Word
Тип 27 № 78052
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 для файла А.

import math

f = open('27.txt')

claster = [[] for i in range(3)]

for s in f:

x,y = [float(c) for c in s.split()]

if y < -7:

claster[0].append ([x,y])

elif 34 > x > 11 and 11 > y > -5:

claster[1].append ([x,y])

else:

claster[2].append ([x,y])

def cent(cl):

rad = []

for i in cl:

rad.append((sum(math.dist(i,j) for j in cl),i))

return min(rad)[1]

center = [cent(i) for i in claster]

x = abs(sum(x for x, y in center)/3*10000)

y = abs(sum(y for x, y in center)/3*10000)

print(int(x),int(y))

 

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

import math

f = open('27.txt')

claster = [[] for i in range(6)]

for s in f:

x,y = [float(c) for c in s.split()]

if y < -5:

claster[0].append ([x,y])

elif y < x + 1:

claster[1].append ([x,y])

elif y < 2*x + 11:

claster[2].append ([x,y])

elif y < 13*x + 120:

claster[3].append ([x,y])

elif y > -2.5*x - 30:

claster[4].append ([x,y])

else:

claster[5].append ([x,y])

def cent(cl):

rad = []

for i in cl:

rad.append((sum(math.dist(i,j) for j in cl),i))

return min(rad)[1]

center = [cent(i) for i in claster]

x = abs(sum(x for x, y in center)/6*10000)

y = abs(sum(y for x, y in center)/6*10000)

print(int(x),int(y))

 

 

 

 

Ответ: 178755; 2896; 37392; 50998.

 

 

При­ведём ре­ше­ние Юрия Кра­силь­ни­ко­ва на языке Python.

from math import dist,degrees,atan2

def clusterization(stars,borders,point): # кла­сте­ри­за­ция

clusters=[[] for _ in range(len(borders)-1)]

for s in stars:

angle=degrees(atan2(s[1]-point[1],s[0]-point[0]))

x=[borders[i] < angle < borders[i+1] for i in range(len(borders)-1)]

if any(x): clusters[x.index(True)].append(s)

return clusters

def center(cluster): # на­хож­де­ние цен­тра кла­сте­ра

sumdist=[sum([dist(star1,star2) for star1 in cluster]) for star2 in cluster]

return cluster[sumdist.index(min(sumdist))]

# Файл A

stars = [tuple(map(float,s.replace(',','.').split())) for s in open('271.txt')]

clusters=clusterization(stars,[-10,20,50,80],(5,-9))

print('кла­сте­ров:',len(clusters),'; точек:',*[len(c) for c in clusters]) # для кон­тро­ля

centers=[center(c) for c in clusters]

print(*[int(abs(sum(x[i] for x in centers)/len(centers)*10000)) for i in range(2)])

# Файл B

stars = [tuple(map(float,s.replace(',','.').split())) for s in open('272.txt')]

clusters=clusterization(stars,[-30,0,30,60,90,120,150],(-10,-5))

print('кла­сте­ров:',len(clusters),'; точек:',*[len(c) for c in clusters]) # для кон­тро­ля

centers=[center(c) for c in clusters]

print(*[int(abs(sum(x[i] for x in centers)/len(centers)*10000)) for i in range(2)])


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