地图权重计算(算法题)

简介: 地图权重计算(算法题)

问题描述

题目:权重计算

描述:

考虑一个19x19的网格,每个网格都可以赋予一个权重。现在,给定一个坐标范围在 (−1500,1500),(−1500,1500)(−1500,1500),(−1500,1500) 之内的数据点,你的任务是为这个数据点在19x19的网格中确定权重。

数据点可能的位置与相应的权重计算如下:

  1. 数据点在某个网格的中心:此时,该数据点所在的那个网格权重为1,其余所有网格的权重为0。
  2. 数据点位于四个网格的交点:这四个相交的网格各自的权重为0.25,其余所有网格的权重为0。
  3. 数据点在网格的内部边界但非交点上:此时,数据点位于两个网格的共同边界上。例如,如果数据点在两个网格的水平共同边界上,则这两个网格的权重各为0.5,其余所有网格的权重为0。同理,如果数据点在两个网格的垂直边界上,这两个网格的权重也各为0.5。
  4. 数据点位于整体网格系统的边界上:在这种特殊情况下,所有网格的权重都为0,因为数据点在整个网格系统的外部边界上。
  5. 数据点在某个网格的内部角上但非交点需要安装距离来分配权重:例如,如果数据点在左下角上但不在四个网格的交点,你需要计算与该点相邻的左侧、下方、左下角和当前所在的网格的权重,使得总权重为1,需要计算当前点和这四个网格中心的距离,然后根据这个距离的比例来分配这个权值。

输入:

  • 一个元组,代表数据点的坐标 (x,y) ,其中 x,y∈[−1500,1500]x,y∈[−1500,1500]。

输出:

  • 一个 19×19 的二维数组,表示每个网格的权重。

思路分析

测试数据

1. 数据点在某个网格的中心:

测试点: (0,0)

解释: 这是整个19x19网格系统的中心点。在这种情况下,中心网格权重为1,其余网格权重为0。

预测结果: 19x19的二维数组中,中心格权重为1,其余为0。

测试通过


2. 数据点位于四个网格的交点:

测试点: (-1184.22, -1184.22)

解释: 数据点位于第一个行和第一个列的交点上。

**预测结果:**其中(1,1)、(1,2)、(2,1)和(2,2)的权重都是0.25。

测试通过


**3. **数据点在网格的内部边界但非交点上

  • 输入:(0, -1500 + CELL_SIZE)
  • 输出:一个19x19的二维数组,其中两个相邻网格的权重为0.5,其余网格的权重为0。
  • 解释:数据点 (-1184.22, -1294.22) 位于两个相邻网格的内部边界上,其中一个网格在左侧,另一个在右侧。因此,这两个相邻网格的权重都为0.5,其余网格的权重都是0。

测试通过,需要注意的是,编程里面的坐标相对于数学里面的是倒过来的


4. 数据点位于整体网格系统的边界上:

测试点: (-1500, 0)

解释: 数据点位于整个网格系统的左边界上。

预测结果: 所有网格权重为0。

通过测试


5.数据点在某个网格的内部角上但非交点需要安装距离来分配权重:

测试点: (-1125, 1125)

解释: 给定的数据点 (−1125,1125)位于第 2 列和第 16 行的网格内部角上。

预测结果: (当前网格)的权重应该最大,(左侧网格)的权重次之,网格(上方网格)的权重再次之,网格 (左上角网格)的权重最小,其余为0。

测试通过

测试代码

下面的代码,是用来通过测试数据,获得测试数据结果的。测试数据就是上面写的

import numpy as np
# 定义单元格大小
CELL_SIZE = 3000 / 19  # 单元格的尺寸
epsilon = 1e-3  # 容差
def get_grid_position_and_distances(x, y):
    """
    计算给定点的网格位置以及到四个边界的距离。
    """
    # 计算x和y坐标所对应的格子位置
    grid_x = int((x + 1500) // CELL_SIZE)
    grid_y = int((y + 1500) // CELL_SIZE)
    # 计算到四个边界的距离
    dist_left = x - (-1500 + grid_x * CELL_SIZE)
    dist_right = (-1500 + (grid_x + 1) * CELL_SIZE) - x
    dist_top = y - (-1500 + grid_y * CELL_SIZE)
    dist_bottom = (-1500 + (grid_y + 1) * CELL_SIZE) - y
    return grid_x, grid_y, dist_left, dist_right, dist_top, dist_bottom
def calculate_weight(x, y):
    """
    根据点的位置计算权重矩阵。
    """
    # 获取点的网格位置和距离信息
    grid_x, grid_y, dist_left, dist_right, dist_top, dist_bottom = get_grid_position_and_distances(x, y)
    weight_matrix = np.zeros((19, 19))  # 初始化权重矩阵为全零
    # 判断是否为外部边界点
    if x == 1500 or x == -1500 or y == 1500 or y == -1500:
        return weight_matrix  # 返回全零矩阵
    # 判断是否为中心点
    if np.isclose(x, -1500 + (grid_x + 0.5) * CELL_SIZE) and np.isclose(y, -1500 + (grid_y + 0.5) * CELL_SIZE):
        weight_matrix[grid_y, grid_x] = 1
        return weight_matrix
    # 判断是否为交叉点
    if (np.isclose(x, -1500 + grid_x * CELL_SIZE) or np.isclose(x, -1500 + (grid_x + 1) * CELL_SIZE)) and \
            (np.isclose(y, -1500 + grid_y * CELL_SIZE) or np.isclose(y, -1500 + (grid_y + 1) * CELL_SIZE)):
        weight_matrix[grid_y, grid_x] = 0.25
        weight_matrix[grid_y + 1, grid_x] = 0.25
        weight_matrix[grid_y, grid_x + 1] = 0.25
        weight_matrix[grid_y + 1, grid_x + 1] = 0.25
        return weight_matrix
    # 判断是否为内部边界点
    if np.isclose(dist_left, 0, atol=epsilon):
        weight_matrix[grid_y, grid_x] = 0.5
        weight_matrix[grid_y, grid_x - 1] = 0.5
        return weight_matrix
    if np.isclose(dist_right, 0, atol=epsilon):
        weight_matrix[grid_y, grid_x] = 0.5
        weight_matrix[grid_y, grid_x + 1] = 0.5
        return weight_matrix
    if np.isclose(dist_top, 0, atol=epsilon):
        weight_matrix[grid_y, grid_x] = 0.5
        weight_matrix[grid_y - 1, grid_x] = 0.5
        return weight_matrix
    if np.isclose(dist_bottom, 0, atol=epsilon):
        weight_matrix[grid_y, grid_x] = 0.5
        weight_matrix[grid_y + 1, grid_x] = 0.5
        return weight_matrix
    # 重新计算内部角落点的权重
    # 计算到四个近邻格子中心的距离
    distances = [
        np.sqrt(dist_left ** 2 + dist_top ** 2),
        np.sqrt(dist_right ** 2 + dist_top ** 2),
        np.sqrt(dist_left ** 2 + dist_bottom ** 2),
        np.sqrt(dist_right ** 2 + dist_bottom ** 2)
    ]
    # 计算距离的倒数
    inverse_distances = [1 / (d + epsilon) for d in distances]  # 添加epsilon以防止除以零
    total_inverse_distance = sum(inverse_distances)
    # 根据距离的倒数分配权重
    weights = [idist / total_inverse_distance for idist in inverse_distances]
    weight_matrix[grid_y, grid_x] = weights[0]
    weight_matrix[grid_y, grid_x - 1] = weights[1]
    weight_matrix[grid_y - 1, grid_x] = weights[2]
    weight_matrix[grid_y - 1, grid_x - 1] = weights[3]
    return weight_matrix
# 定义测试点
test_points = [
    (0, 0), (-1184.22, -1184.22),(0, -1500 + CELL_SIZE), (-1500, 0), (-1125, 1125)
]
for point in test_points:
    print(f"Test point: {point}")
    print(calculate_weight(*point))
    print("=" * 40)

测试结果


权重计算问题代码设计思路

  1. get_grid_position_and_distances函数:
  • 该函数接收一个点的x和y坐标作为输入。
  • 它首先计算给定点在网格系统中的位置(grid_x和grid_y)。
  • 然后,它计算点到其包含网格的四个边界的距离(dist_left, dist_right, dist_top, dist_bottom)。
  • 函数返回这些值。
  1. calculate_weight函数:
  • 该函数接收一个点的x和y坐标作为输入。
  • 它首先调用get_grid_position_and_distances函数来获取网格位置和边界距离。
  • 接下来,它根据不同的情况为每个网格分配权重:
  • 如果点位于网格系统的外部边界上,所有网格的权重都为0。
  • 如果点位于某个网格的中心,那个网格的权重为1,其他网格的权重为0。
  • 如果点位于四个网格的交点,这四个网格的权重都为0.25。
  • 如果点位于两个网格的内部边界上,这两个网格的权重都为0.5。
  • 如果点位于某个网格的内部角上但不在交点上,它计算点到四个邻近格子的中心的距离,并根据这些距离分配权重。

完整的代码

需要注意的是,这个代码不能够在jupyter里面运行,因为print函数对于特别费时间,数据量大容易拖垮浏览器,所以用的pycharm展示的,算法运行效率很高,如果去掉print那么一秒不到就可以出结果

import numpy as np
# 定义单元格大小
CELL_SIZE = 3000 / 19  # 单元格的尺寸
epsilon = 1e-3  # 容差
def get_grid_position_and_distances(x, y):
    """
    计算给定点的网格位置以及到四个边界的距离。
    """
    # 计算x和y坐标所对应的格子位置
    grid_x = int((x + 1500) // CELL_SIZE)
    grid_y = int((y + 1500) // CELL_SIZE)
    # 计算到四个边界的距离
    dist_left = x - (-1500 + grid_x * CELL_SIZE)
    dist_right = (-1500 + (grid_x + 1) * CELL_SIZE) - x
    dist_top = y - (-1500 + grid_y * CELL_SIZE)
    dist_bottom = (-1500 + (grid_y + 1) * CELL_SIZE) - y
    return grid_x, grid_y, dist_left, dist_right, dist_top, dist_bottom
def calculate_weight(x, y):
    """
    根据点的位置计算权重矩阵。
    """
    # 获取点的网格位置和距离信息
    grid_x, grid_y, dist_left, dist_right, dist_top, dist_bottom = get_grid_position_and_distances(x, y)
    weight_matrix = np.zeros((19, 19))  # 初始化权重矩阵为全零
    # 判断是否为外部边界点
    if x == 1500 or x == -1500 or y == 1500 or y == -1500:
        return weight_matrix  # 返回全零矩阵
    # 判断是否为中心点
    if np.isclose(x, -1500 + (grid_x + 0.5) * CELL_SIZE) and np.isclose(y, -1500 + (grid_y + 0.5) * CELL_SIZE):
        weight_matrix[grid_y, grid_x] = 1
        return weight_matrix
    # 判断是否为交叉点
    if (np.isclose(x, -1500 + grid_x * CELL_SIZE) or np.isclose(x, -1500 + (grid_x + 1) * CELL_SIZE)) and \
            (np.isclose(y, -1500 + grid_y * CELL_SIZE) or np.isclose(y, -1500 + (grid_y + 1) * CELL_SIZE)):
        weight_matrix[grid_y, grid_x] = 0.25
        weight_matrix[grid_y + 1, grid_x] = 0.25
        weight_matrix[grid_y, grid_x + 1] = 0.25
        weight_matrix[grid_y + 1, grid_x + 1] = 0.25
        return weight_matrix
    # 判断是否为内部边界点
    if np.isclose(dist_left, 0, atol=epsilon):
        weight_matrix[grid_y, grid_x] = 0.5
        weight_matrix[grid_y, grid_x - 1] = 0.5
        return weight_matrix
    if np.isclose(dist_right, 0, atol=epsilon):
        weight_matrix[grid_y, grid_x] = 0.5
        weight_matrix[grid_y, grid_x + 1] = 0.5
        return weight_matrix
    if np.isclose(dist_top, 0, atol=epsilon):
        weight_matrix[grid_y, grid_x] = 0.5
        weight_matrix[grid_y - 1, grid_x] = 0.5
        return weight_matrix
    if np.isclose(dist_bottom, 0, atol=epsilon):
        weight_matrix[grid_y, grid_x] = 0.5
        weight_matrix[grid_y + 1, grid_x] = 0.5
        return weight_matrix
    # 重新计算内部角落点的权重
    # 计算到四个近邻格子中心的距离
    distances = [
        np.sqrt(dist_left ** 2 + dist_top ** 2),
        np.sqrt(dist_right ** 2 + dist_top ** 2),
        np.sqrt(dist_left ** 2 + dist_bottom ** 2),
        np.sqrt(dist_right ** 2 + dist_bottom ** 2)
    ]
    # 计算距离的倒数
    inverse_distances = [1 / (d + epsilon) for d in distances]  # 添加epsilon以防止除以零
    total_inverse_distance = sum(inverse_distances)
    # 根据距离的倒数分配权重
    weights = [idist / total_inverse_distance for idist in inverse_distances]
    weight_matrix[grid_y, grid_x] = weights[0]
    weight_matrix[grid_y, grid_x - 1] = weights[1]
    weight_matrix[grid_y - 1, grid_x] = weights[2]
    weight_matrix[grid_y - 1, grid_x - 1] = weights[3]
    return weight_matrix
# 加载数据
data = np.load('D:\系统默认\桌面\永信\B4013-算法题\part.npy')
# 遍历数据并计算权重
for point in data:
    source_x, source_y = point
    print(compute_weights_for_point(source_x, source_y))
print("运行完了")

运行结果

相关文章
|
2月前
|
算法 机器人
基于SOA海鸥优化算法的PID控制器最优控制参数计算matlab仿真
本课题研究基于海鸥优化算法(SOA)优化PID控制器参数的方法,通过MATLAB仿真对比传统PID控制效果。利用SOA算法优化PID的kp、ki、kd参数,以积分绝对误差(IAE)为适应度函数,提升系统响应速度与稳定性。仿真结果表明,SOA优化的PID控制器在阶跃响应和误差控制方面均优于传统方法,具有更快的收敛速度和更强的全局寻优能力,适用于复杂系统的参数整定。
|
6月前
|
算法 JavaScript 数据安全/隐私保护
基于GA遗传优化的最优阈值计算认知异构网络(CHN)能量检测算法matlab仿真
本内容介绍了一种基于GA遗传优化的阈值计算方法在认知异构网络(CHN)中的应用。通过Matlab2022a实现算法,完整代码含中文注释与操作视频。能量检测算法用于感知主用户信号,其性能依赖检测阈值。传统固定阈值方法易受噪声影响,而GA算法通过模拟生物进化,在复杂环境中自动优化阈值,提高频谱感知准确性,增强CHN的通信效率与资源利用率。预览效果无水印,核心程序部分展示,适合研究频谱感知与优化算法的学者参考。
|
6月前
|
存储 机器学习/深度学习 算法
论上网限制软件中 Python 动态衰减权重算法于行为管控领域的创新性应用
在网络安全与行为管理的学术语境中,上网限制软件面临着精准识别并管控用户不合规网络请求的复杂任务。传统的基于静态规则库或固定阈值的策略,在实践中暴露出较高的误判率与较差的动态适应性。本研究引入一种基于 “动态衰减权重算法” 的优化策略,融合时间序列分析与权重衰减机制,旨在显著提升上网限制软件的实时决策效能。
180 2
|
存储 分布式计算 算法
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
大数据-106 Spark Graph X 计算学习 案例:1图的基本计算、2连通图算法、3寻找相同的用户
240 0
|
8月前
|
算法 数据安全/隐私保护
基于Big-Bang-Big-Crunch(BBBC)算法的目标函数最小值计算matlab仿真
该程序基于Big-Bang-Big-Crunch (BBBC)算法,在MATLAB2022A中实现目标函数最小值的计算与仿真。通过模拟宇宙大爆炸和大收缩过程,算法在解空间中搜索最优解。程序初始化随机解集,经过扩张和收缩阶段逐步逼近全局最优解,并记录每次迭代的最佳适应度。最终输出最佳解及其对应的目标函数最小值,并绘制收敛曲线展示优化过程。 核心代码实现了主循环、粒子位置更新、适应度评估及最优解更新等功能。程序运行后无水印,提供清晰的结果展示。
204 14
|
JSON 算法 数据可视化
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
309 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
|
算法 数据可视化 数据安全/隐私保护
基于LK光流提取算法的图像序列晃动程度计算matlab仿真
该算法基于Lucas-Kanade光流方法,用于计算图像序列的晃动程度。通过计算相邻帧间的光流场并定义晃动程度指标(如RMS),可量化图像晃动。此版本适用于Matlab 2022a,提供详细中文注释与操作视频。完整代码无水印。
|
算法 Go Python
[算法]计算斐波拉契数列
[算法]计算斐波拉契数列
121 2
|
算法 C++
如何精确计算出一个算法的CPU运行时间?
如何精确计算出一个算法的CPU运行时间?
|
机器学习/深度学习 算法
**反向传播算法**在多层神经网络训练中至关重要,它包括**前向传播**、**计算损失**、**反向传播误差**和**权重更新**。
【6月更文挑战第28天】**反向传播算法**在多层神经网络训练中至关重要,它包括**前向传播**、**计算损失**、**反向传播误差**和**权重更新**。数据从输入层流经隐藏层到输出层,计算预测值。接着,比较预测与真实值计算损失。然后,从输出层开始,利用链式法则反向计算误差和梯度,更新权重以减小损失。此过程迭代进行,直到损失收敛或达到训练次数,优化模型性能。反向传播实现了自动微分,使模型能适应训练数据并泛化到新数据。
295 2

热门文章

最新文章