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

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

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

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

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

При этом рас­сто­я­ние вы­чис­ля­ет­ся по стан­дарт­ной фор­му­ле рас­сто­я­ния между точ­ка­ми на ев­кли­до­вой плос­ко­сти.

Ра­ди­у­сом кла­сте­ра счи­та­ет­ся мак­си­маль­ное из рас­сто­я­ний от цен­тра до осталь­ных точек кла­сте­ра.

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

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

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

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

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

Файл A

Файл B

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

В от­ве­те за­пи­ши­те два числа: сна­ча­ла сред­ний ра­ди­ус для файла A, затем для файла B.

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

 

Ответ:

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

Ре­ше­ние.

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

 

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

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

 

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

import math

 

def dist(p1, p2):

x1, y1 = p1

x2, y2 = p2

return ((x1 - x2)**2 + (y1 - y2)**2) ** 0.5

 

def center_of_cluster(kl):

# Воз­вра­ща­ет центр кла­сте­ра: точку с ми­ни­маль­ной сум­мой рас­сто­я­ний до осталь­ных

if not kl:

return None

if len(kl) == 1:

return kl[0]

best_center = None

best_sum_dist = float('inf')

for p in kl:

s = sum(dist(p, q) for q in kl)

if s < best_sum_dist:

best_sum_dist = s

best_center = p

return best_center

 

def radius_of_cluster(center, kl):

if center is None or not kl:

return 0.0

return max(dist(center, q) for q in kl)

 

def mean_radius_after_exclusion(points):

# 1) кла­сте­ри­за­ция по эв­ри­сти­ке

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

for x, y in points:

if y < 2:

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

elif x < 3:

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

else:

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

# 2) ис­клю­ча­ем кла­стер с наи­боль­шим ко­ли­че­ством точек

if clusters:

largest = max(clusters, key=len)

clusters.remove(largest)

 

# Если после ис­клю­че­ния кла­сте­ров не оста­лось

remaining_clusters = [kl for kl in clusters if kl]

if not remaining_clusters:

return 0.0

 

centers = [center_of_cluster(kl) for kl in remaining_clusters]

radii = [radius_of_cluster(c, kl) for c, kl in zip(centers, remaining_clusters)]

 

avg_radius = sum(radii) / len(radii) if radii else 0.0

return avg_radius

 

def load_points_from_file(filename):

pts = []

try:

with open(filename, 'r') as f:

for line in f:

line = line.strip()

if not line:

continue

# Раз­де­ля­ем по про­бе­лам и берём пер­вые две чисел

parts = line.split()

if len(parts) >= 2:

x = float(parts[0])

y = float(parts[1])

pts.append((x, y))

except FileNotFoundError:

pass

return pts

 

def compute_mean_radius_for_file(filename):

pts = load_points_from_file(filename)

return mean_radius_after_exclusion(pts)

 

 

file_A = "27A.txt"

 

mean_A = compute_mean_radius_for_file(file_A)

out_A = int(math.floor(mean_A * 10000.0 + 1e-12))

 

print(out_A)

 

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

import math

 

def dist(p1, p2):

x1, y1 = p1

x2, y2 = p2

return ((x1 - x2)**2 + (y1 - y2)**2) ** 0.5

 

def center_of_cluster(kl):

# Воз­вра­ща­ет центр кла­сте­ра: точку с ми­ни­маль­ной сум­мой рас­сто­я­ний до осталь­ных

if not kl:

return None

if len(kl) == 1:

return kl[0]

best_center = None

best_sum_dist = float('inf')

for p in kl:

s = sum(dist(p, q) for q in kl)

if s < best_sum_dist:

best_sum_dist = s

best_center = p

return best_center

 

def radius_of_cluster(center, kl):

if center is None or not kl:

return 0.0

return max(dist(center, q) for q in kl)

 

def mean_radius_after_exclusion(points):

# 1) кла­сте­ри­за­ция по эв­ри­сти­ке

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

for x, y in points:

if x < -1.5:

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

elif x > 4 and y >6:

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

elif y > 5:

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

elif x > 2:

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

else:

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

# 2) ис­клю­ча­ем кла­стер с наи­боль­шим ко­ли­че­ством точек

if clusters:

largest = max(clusters, key=len)

clusters.remove(largest)

 

# Если после ис­клю­че­ния кла­сте­ров не оста­лось

remaining_clusters = [kl for kl in clusters if kl]

if not remaining_clusters:

return 0.0

 

centers = [center_of_cluster(kl) for kl in remaining_clusters]

radii = [radius_of_cluster(c, kl) for c, kl in zip(centers, remaining_clusters)]

 

avg_radius = sum(radii) / len(radii) if radii else 0.0

return avg_radius

 

def load_points_from_file(filename):

pts = []

try:

with open(filename, 'r') as f:

for line in f:

line = line.strip()

if not line:

continue

# Раз­де­ля­ем по про­бе­лам и берём пер­вые две чисел

parts = line.split()

if len(parts) >= 2:

x = float(parts[0])

y = float(parts[1])

pts.append((x, y))

except FileNotFoundError:

pass

return pts

 

def compute_mean_radius_for_file(filename):

pts = load_points_from_file(filename)

return mean_radius_after_exclusion(pts)

 

 

file_B = "27B.txt"

 

mean_B = compute_mean_radius_for_file(file_B)

out_B = int(math.floor(mean_B * 10000.0 + 1e-12))

 

print(out_B)

 

 

Ответ: 9142; 11309.


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

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