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

В ла­бо­ра­то­рии про­во­дит­ся экс­пе­ри­мент, со­сто­я­щий из мно­же­ства ис­пы­та­ний. Ре­зуль­тат каж­до­го ис­пы­та­ния пред­став­ля­ет­ся в виде пары чисел. Для ви­зу­а­ли­за­ции ре­зуль­та­тов эта пара рас­смат­ри­ва­ет­ся как ко­ор­ди­на­ты точки на плос­ко­сти, и на чер­те­же от­ме­ча­ют­ся точки, со­от­вет­ству­ю­щие всем ис­пы­та­ни­ям.

По ре­зуль­та­там экс­пе­ри­мен­та про­во­дит­ся кла­сте­ри­за­ция по­лу­чен­ных ре­зуль­та­тов: на плос­ко­сти вы­де­ля­ет­ся не­сколь­ко кла­сте­ров  — пря­мо­уголь­ни­ков раз­ме­ром  3 \times 3 так, что каж­дая точка по­па­да­ет ровно в один кла­стер.

Цен­т­ро­и­дом кла­сте­ра на­зы­ва­ет­ся та из вхо­дя­щих в него точек, для ко­то­рой ми­ни­маль­на сумма рас­сто­я­ний до всех осталь­ных точек кла­сте­ра.

Об­ра­бот­ка ре­зуль­та­тов экс­пе­ри­мен­та вклю­ча­ет сле­ду­ю­щие шаги:

1)  кла­стер, со­дер­жа­щий наи­мень­шее число точек, ис­клю­ча­ет­ся;

2)  опре­де­ля­ют­ся цен­т­ро­и­ды всех остав­ших­ся кла­сте­ров;

3)  для най­ден­ных цен­т­ро­и­дов вы­чис­ля­ет­ся сред­няя точка.

Сред­ней для груп­пы точек на­зы­ва­ет­ся точка (не обя­за­тель­но вхо­дя­щая в груп­пу), ко­ор­ди­на­ты ко­то­рой опре­де­ля­ют­ся как сред­ние ариф­ме­ти­че­ские зна­че­ния ко­ор­ди­нат всех точек груп­пы.

 

В файле за­пи­сан про­то­кол про­ве­де­ния экс­пе­ри­мен­та. Каж­дая стро­ка файла со­дер­жит два числа: ко­ор­ди­на­ты X и Y точки, со­от­вет­ству­ю­щей од­но­му ис­пы­та­нию. По дан­но­му про­то­ко­лу надо опре­де­лить сред­нюю точку цен­т­ро­и­дов всех кла­сте­ров за ис­клю­че­ни­ем со­дер­жа­ще­го наи­мень­шее число точек.

 

Вам даны два вход­ных файла (A и B), каж­дый из ко­то­рых имеет опи­сан­ную выше струк­ту­ру. По дан­ным каж­до­го из пред­став­лен­ных фай­лов опре­де­ли­те ко­ор­ди­на­ты сред­ней точки по опи­сан­ным выше пра­ви­лам.

В от­ве­те за­пи­ши­те че­ты­ре числа: сна­ча­ла (в пер­вой стро­ке) ко­ор­ди­на­ты X и Y сред­ней точки для файла A, затем (во вто­рой стро­ке) ко­ор­ди­на­ты X и Y сред­ней точки для файла B.

В ка­че­стве зна­че­ния ко­ор­ди­на­ты ука­зы­вай­те целую часть от умно­же­ния чис­ло­во­го зна­че­ния ко­ор­ди­на­ты на 10 000.

За­да­ние 27 (А)

За­да­ние 27 (Б)

Ответ:

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

Ре­ше­ние.

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

Для файла А:

Для файла Б:

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

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

 

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

f = open('27A.txt')

m = []

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

for s in f:

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

m.append([x,y])

if -1 <= x <=2 and 6<= y <=9:

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

if 0 <= x <= 3 and 3<= y <=6:

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

if -1.5 <= x <= 0.5 and -1<= y <=2:

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

def centroid(claster):

maxi = 10**10

maxix, maxiy = 0,0

for x1,y1 in claster:

d = 0

for x2,y2 in claster:

d += ((x2-x1)**2 + (y2-y1)**2)** 0.5

if d < maxi:

maxi,maxix,maxiy = d, x1, y1

return maxix, maxiy

mini = min(len(i) for i in claster)

claster = [j for j in claster if len(j)!= mini]

center = [centroid(n) for n in claster]

sumx, sumy = 0, 0

for x,y in center:

sumx += x

sumy += y

otv1, otv2 = int(sumx*10000/len(center)), int(sumy*10000/len(center))

print(otv1, otv2)

 

 

 

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

f = open('27B.txt')

m = []

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

for s in f:

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

m.append([x,y])

if -2.5 <= x <=0.5 and -1.5<= y <=1.5:

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

if -0.5 <= x <= 2.5 and 3<= y <=5.5:

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

if 4 <= x <= 7 and 5<= y <=8:

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

if 3.5 <= x <= 6.5 and 1.5<= y <=4.5:

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

if 3 <= x <= 6.5 and -2.5<= y <=1.5:

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

def centroid(claster):

maxi = 10**10

maxix, maxiy = 0,0

for x1,y1 in claster:

d = 0

for x2,y2 in claster:

d += ((x2-x1)**2 + (y2-y1)**2)** 0.5

if d < maxi:

maxi,maxix,maxiy = d, x1, y1

return maxix, maxiy

mini = min(len(i) for i in claster)

claster = [j for j in claster if len(j)!= mini]

center = [centroid(n) for n in claster]

sumx, sumy = 0, 0

for x,y in center:

sumx += x

sumy += y

otv1, otv2 = int(sumx*10000/len(center)), int(sumy*10000/len(center))

print(otv1, otv2)

 

В ре­зуль­та­те ра­бо­ты дан­но­го ал­го­рит­ма при вводе дан­ных из файла A ответ  — 9877 55816, из файла B  — 26104 34664.

 

 

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

def centroid(cluster):

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

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

from math import dist

f = open('27A.csv')

f.readline() # Чи­та­ем (и иг­но­ри­ру­ем) стро­ку с за­го­лов­ка­ми столб­цов (X Y).

stars = [tuple(map(float,s.replace(',','.').split(';'))) for s in f]

radius = 0.5

clusters = []

while stars:

cluster = [stars.pop()]

for c in cluster:

near = [s for s in stars if dist(c,s) < radius]

cluster += near

for n in near: stars.remove(n)

clusters.append(cluster)

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

clen=[len(c) for c in clusters]

del clusters[clen.index(min(clen))]

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

answer = [int(sum([c[i] for c in centers]) / len(centers) * 10000) for i in range(2)]

print( *answer )

Источник: Стат­Град: Тре­ни­ро­воч­ная ра­бо­та 24.10.2024 ИН2410101