matplotlib 用合理的解决方案连接点

w3nuxt5m  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(127)

我正在做一个python项目,这个项目的目标是连接红点和蓝点,红点和蓝点由问题the given problem给出。
结果应该是这样的Result我正在寻找一个问题的想法,解决方案应该适用于任何类似的情况
我确实尝试了以下这些方法,我选择了第一个点,并得到了最近的蓝色点,但这种情况可能发生The left is when I pick the correct first point, right is if I pick wrong point
我可以检查连接线是否相交并重新排序,但同样可能发生以下情况The connecting line can potentially parallel

t1rydlwq

t1rydlwq1#

据我所知,你正在处理一个分配问题。您可以将scipy's linear_sum_assignment与距离矩阵一起用作成本矩阵。换句话说,您希望红色和蓝色点的组合产生较小的总距离(连接点之间的距离之和)。

import numpy as np 
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import linear_sum_assignment

n_points = 5

np.random.seed(10)
blue_points = np.random.random((2, n_points))
red_points = np.random.random((2, n_points))

# Calculate distance matrix 
distance_matrix = np.linalg.norm(blue_points[:,:,np.newaxis] - red_points[:, np.newaxis,:], axis=0)

# Solve the assignment problem
blue_i, red_i = linear_sum_assignment(distance_matrix)

pairs = list(zip(blue_i, red_i))
# Plot 
fig, ax = plt.subplots()
ax.plot(*blue_points,'bo')
ax.plot(*red_points,'ro')
for i, j in pairs: 
    blue_points.shape
    x = [blue_points[0, i], red_points[0, j]]
    y = [blue_points[1, i], red_points[1, j]]
    ax.plot(x,y, 'k')

相关问题