Python 诸如“直角三角形不是等边三角形的良好近似值”之类的说法是无益的。你说的“良好近似”是什么意思?对不起,我认为这是一个相当主观的说法。在我看来,距离最优解约0.1-1%的距离和有一个误差。在修改模拟退火方案后,我必须承认,这个贪婪算法产生了很好的结果,很难改
Python 诸如“直角三角形不是等边三角形的良好近似值”之类的说法是无益的。你说的“良好近似”是什么意思?对不起,我认为这是一个相当主观的说法。在我看来,距离最优解约0.1-1%的距离和有一个误差。在修改模拟退火方案后,我必须承认,这个贪婪算法产生了很好的结果,很难改,python,algorithm,numpy,geometry,Python,Algorithm,Numpy,Geometry,诸如“直角三角形不是等边三角形的良好近似值”之类的说法是无益的。你说的“良好近似”是什么意思?对不起,我认为这是一个相当主观的说法。在我看来,距离最优解约0.1-1%的距离和有一个误差。在修改模拟退火方案后,我必须承认,这个贪婪算法产生了很好的结果,很难改进。美好的谢谢你的建议。我在考虑蒙特卡罗算法,但我肯定会尝试这种模拟退火方法。我会等上几个小时/几天,看看是否有更多的“专门化”解决方案出现,否则我想我会选择这个。至于采用d'=1/d的建议,我不太确定,因为1/d对我来说似乎不是一个真正的“指
诸如“直角三角形不是等边三角形的良好近似值”之类的说法是无益的。你说的“良好近似”是什么意思?对不起,我认为这是一个相当主观的说法。在我看来,距离最优解约0.1-1%的距离和有一个误差。在修改模拟退火方案后,我必须承认,这个贪婪算法产生了很好的结果,很难改进。美好的谢谢你的建议。我在考虑蒙特卡罗算法,但我肯定会尝试这种模拟退火方法。我会等上几个小时/几天,看看是否有更多的“专门化”解决方案出现,否则我想我会选择这个。至于采用
d'=1/d
的建议,我不太确定,因为1/d
对我来说似乎不是一个真正的“指标”,我不知道这对所提出的算法有什么影响。我不同意你的观点,即OP的问题是NP完全的,我也看不到与最小顶点覆盖的联系。(在最小顶点覆盖问题中,你试图选取最小的覆盖集,但在OP的问题中,你必须精确选取k个点。)你能扩展你答案的这一部分吗?我不知道是否存在完美的联系,这就是为什么我说,“我不完全确定。”我还谈到加权最小顶点覆盖。因为图形在任意两点之间必然有一条边(因为它只是距离度量空间的一段距离),我相信这可以避免您提到的问题。也就是说,任何k点集都将是一个覆盖,即使是一个点也可以是一个覆盖,所以剩下的就是重量最小化。我不知道这种简化是否使它在多边形时间内可解,它很容易像最大独立集的二部形式。如果一个图在每两个顶点之间有一条边,那么一个顶点覆盖必须包含所有顶点,或者除了一个之外的所有顶点。(如果一个集合S缺少两个顶点,那么这两个顶点之间有一条未覆盖的边,因此S不是顶点覆盖。)因此我不理解你的说法“因为图形在任意两点之间必然有一条边……任意k点集都将是覆盖”。
all_nodes = np.asarray(...) # Set of nodes
all_dists = np.asarray(...) # Pairwise distances
N = len(all_nodes)
k = 10 # Or however many you want.
def calculate_distance(node_subset, distances):
# A function you write to determine sum of distances
# among a particular subset of nodes.
# Initial random subset of k elements
shuffle = np.random.shuffle(all_nodes)
current_subset = shuffle[0:k]
current_outsiders = shuffle[k:]
# Simulated annealing parameters.
temp = 100.0
cooling_rate = 0.95
num_iters = 10000
# Simulated annealing loop.
for ii in range(num_iters):
proposed_subset = current_subset.copy()
proposed_outsiders = current_outsiders.copy()
index_to_swap = np.random.randint(k)
outsider_to_swap = np.random.randint(N - k)
tmp = current_subset[index_to_swap]
proposed_subset[index_to_swap] = current_outsiders[outsider_to_swap]
proposed_outsiders[outsider_to_swap] = tmp
potential_change = np.exp((-1.0/temp)*
calculate_distance(proposed_subset,all_dists)/
calculate_distance(current_subset, all_dists))
if potential_change > 1 or potential_change >= np.random.rand():
current_subset = proposed_subset
current_outsiders = proposed_outsiders
temp = cooling_rate * temp
selection = max(
itertools.combinations(points, k),
key=lambda candidate: sum(
dist(p, q) for p, q in itertools.combinations(candidate, 2)
)
)
(k! / 2! / (k-2)!) * (n! / k! / (n-k)! == n! /(2(k-2)!(n-k)!)