
В лаборатории проводится эксперимент, состоящий из множества испытаний. Результат каждого испытания представляется в виде пары чисел.
Для визуализации результатов эта пара рассматривается как координаты точки на плоскости, и на чертеже отмечаются точки, соответствующие всем испытаниям.
По результатам эксперимента проводится кластеризация полученных результатов: на плоскости выделяется несколько кластеров — кругов радиуса не более 3 единиц так, что каждая точка попадает ровно в один кластер.
Центром кластера считается та из входящих в него точек, для которой минимально среднее из расстояний до всех остальных точек кластера.
При этом расстояние вычисляется по стандартной формуле расстояния между точками на евклидовой плоскости.
Радиусом кластера считается максимальное из расстояний от центра до остальных точек кластера.
Обработка результатов эксперимента включает следующие шаги:
1) кластер, содержащий наибольшее число точек, исключается;
2) определяются центры и радиусы всех оставшихся кластеров;
3) вычисляется средний радиус оставшихся кластеров.
В файле записан протокол проведения эксперимента. Каждая строка файла содержит два числа: координаты X и Y точки, соответствующей одному испытанию. По данному протоколу надо определить средний радиус всех кластеров за исключением содержащего наибольшее число точек.
Вам даны два входных файла (A и B), каждый из которых имеет описанную выше структуру. По данным каждого из представленных файлов определите средний радиус по описанным выше правилам.
В ответе запишите два числа: сначала средний радиус для файла A, затем для файла B.
В качестве значения указывайте целую часть от умножения найденного числового значения на 10 000.
Ответ:
Решение.
Это задание ещё не решено, приводим решение прототипа.
В лаборатории проводится эксперимент, состоящий из множества испытаний. Результат каждого испытания представляется в виде пары чисел.
Для визуализации результатов эта пара рассматривается как координаты точки на плоскости, и на чертеже отмечаются точки, соответствующие всем испытаниям.
По результатам эксперимента проводится кластеризация полученных результатов: на плоскости выделяется несколько кластеров — кругов радиуса не более 3 единиц так, что каждая точка попадает ровно в один кластер.
Центром кластера считается та из входящих в него точек, для которой минимально максимальное из расстояний до всех остальных точек кластера.
При этом расстояние вычисляется по стандартной формуле расстояния между точками на евклидовой плоскости.
Радиусом кластера считается максимальное из расстояний от центра до остальных точек кластера.
Обработка результатов эксперимента включает следующие шаги:
1) кластер, содержащий наибольшее число точек, исключается;
2) определяются центры и радиусы всех оставшихся кластеров;
3) вычисляется средний радиус оставшихся кластеров.
В файле записан протокол проведения эксперимента. Каждая строка файла содержит два числа: координаты X и Y точки, соответствующей одному испытанию. По данному протоколу надо определить средний радиус всех кластеров за исключением содержащего наибольшее число точек.
Вам даны два входных файла (A и B), каждый из которых имеет описанную выше структуру. По данным каждого из представленных файлов определите средний радиус по описанным выше правилам.
В ответе запишите два числа: сначала средний радиус для файла A, затем для файла B.
В качестве значения указывайте целую часть от умножения найденного числового значения на 10 000.
Ответ:
Построим диаграммы для файла А и Б. Для этого воспользуемся табличным редактором.
Диаграмма для файла А:
Диаграмма для файла Б:
Приведём решение на языке Python для файла А.
import math
f = open('27A.txt')
claster = [[] for i in range(3)]
for s in f:
x,y = [float(c) for c in s.split()]
if y < 2:
claster[0].append ([x,y])
elif x < 3:
claster[1].append ([x,y])
else:
claster[2].append ([x,y])
del claster[claster.index(max(claster,key=len))]
radius = [0, 0]
for i in range(len(claster)):
tmp = 10**10
for x1, y1 in claster[i]:
maxi =0
for x2, y2 in claster[i]:
maxi = max(maxi, math.dist([x1,y1],[x2,y2]))
if maxi < tmp:
tmp = maxi
radius[i] = tmp
middle = sum([r for r in radius]) / 2
print(int(middle * 10000))
Приведём решение на языке Python для файла B.
import math
f = open('27B.txt')
claster = [[] for i in range(5)]
for s in f:
x,y = [float(c) for c in s.split()]
if x < -1.5:
claster[0].append ([x,y])
elif x > 4 and y >6:
claster[1].append ([x,y])
elif y > 5:
claster[2].append ([x,y])
elif x > 2:
claster[3].append ([x,y])
else:
claster[4].append ([x,y])
del claster[claster.index(max(claster,key=len))]
radius = [0, 0, 0, 0]
for i in range(len(claster)):
tmp = 10**10
for x1, y1 in claster[i]:
maxi =0
for x2, y2 in claster[i]:
maxi = max(maxi, math.dist([x1,y1],[x2,y2]))
if maxi < tmp:
tmp = maxi
radius[i] = tmp
middle = sum([r for r in radius]) / 4
print(int(middle * 10000))
Ответ: 8807; 10741.