华为AI算法 华为AI算法笔试 0924
笔试时间:2025年9月24日
往年笔试合集:
第一题:无线网络优化中的基站聚类分析
【问题背景】在无线网络优化中,基站的位置分布直接影响信号覆盖质量。密集区域的基站可能造成资源浪费,而稀疏区域则会出现信号覆盖不足。
【任务要求】给定n个基站的二维坐标,使用K-Means算法将其划分为k个簇,再通过计算每个簇的轮廓系数(Silhouette Coefficient),识别信号覆盖最差的簇(轮廓系数最低),并在该簇中心新增基站以优化信号覆盖。
算法过程:
- 使用前k个基站作为初始聚类中心,执行K-Means算法。K-means的结束条件为:最大迭代次数100或者所有簇中心点移动距离都不大于10^-6
- 计算每个簇的轮廓系数(簇内所有点的轮廓系数平均值)
- 找出轮廓系数最低的簇
- 输出该簇的中心坐标(保留两位小数),作为新增基站的位置
输入描述
输出描述
新增基站的坐标:x y(输出结果四舍五入保留两位小数,采用RoundingMode.HALF_EVEN)
样例输入
6 2
0 0
1 1
2 2
10 10
11 11
5 5
样例输出
8.67 8.67
样例说明
簇划分结果:簇0:[(0,0),(1,1),(2,2)],中心(1,1);簇1:[(5,5),(10,10),(11,11)],中心(8.67,8.67)轮廓系数:簇0的轮廓系数:0.82;簇1轮廓系数:0.35答案:输出簇1的中心点:(8.67,8.67)
参考题解
解题思路:
- 实施K-Means聚类:使用前k个基站作为初始中心,迭代分配点到最近中心并更新中心位置
- 计算轮廓系数:对每个点计算簇内平均距离a(i)和最近其他簇的平均距离b(i),s(i)=(b(i)-a(i))/max(a(i),b(i))
- 找出轮廓系数最低的簇,输出其中心坐标
Python:
import sys import math from decimal import Decimal, ROUND_HALF_EVEN def solve(): def round_half_even(number, ndigits=2): d = Decimal(str(number)) quantizer = Decimal('1e-' + str(ndigits)) return d.quantize(quantizer, rounding=ROUND_HALF_EVEN) def euclidean_distance(p1, p2): return math.sqrt((p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2) def squared_euclidean_distance(p1, p2): return (p1[0] - p2[0]) ** 2 + (p1[1] - p2[1]) ** 2 n, k = map(int, sys.stdin.readline().strip().split()) points = [] for _ in range(n): points.append(list(map(int, sys.stdin.readline().strip().split()))) centers = [list(p) for p in points[:k]] max_iterations = 100 tolerance = 1e-6 cluster_assignments = [-1] * n for _ in range(max_iterations): clusters = [[] for _ in range(k)] for i, point in enumerate(points): min_dist_sq = float('inf') closest_center_idx = -1 for j, center in enumerate(centers): dist_sq = squared_euclidean_distance(point, center) if dist_sq < min_dist_sq: min_dist_sq = dist_sq closest_center_idx = j clusters[closest_center_idx].append(i) cluster_assignments[i] = closest_center_idx old_centers = [list(c) for c in centers] for j in range(k): cluster_point_indices = clusters[j] if cluster_point_indices: cluster_points = [points[p_idx] for p_idx in cluster_point_indices] sum_x = sum(p[0] for p in cluster_points) sum_y = sum(p[1] for p in cluster_points) num_points = len(cluster_points) centers[j] = [sum_x / num_points, sum_y / num_points] max_shift = 0 for j in range(k): shift = euclidean_distance(centers[j], old_centers[j]) max_shift = max(max_shift, shift) if max_shift <= tolerance: break cluster_total_silhouette = [0.0] * k cluster_point_counts = [0] * k for i in range(n): point_i = points[i] my_cluster_idx = cluster_assignments[i] my_cluster_indices = clusters[my_cluster_idx] if len(my_cluster_indices) <= 1: s_i = 1.0 else: sum_dist_a = sum(euclidean_distance(point_i, points[j_idx]) for j_idx in my_cluster_indices if j_idx != i) a_i = sum_dist_a / (len(my_cluster_indices) - 1) min_avg_dist_b = float('inf') for other_cluster_idx in range(k): if other_cluster_idx == my_cluster_idx:
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025 春招笔试合集 文章被收录于专栏
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南