【问题标题】:Delete minimum amount of overlapping circle?删除最小数量的重叠圆?
【发布时间】:2020-07-16 07:18:46
【问题描述】:

有什么办法可以删除最小的重叠圆,得到最大的不重叠圆?

问题说明:

我想删除重叠的圆圈,但保持结果最大。对于上面的问题,结果应该是这样的:

我尝试通过创建每个圆组合然后计算相交和不相交的数量来对其进行硬编码。但是,这需要的时间太长。这类问题有什么快速的解决方法吗?

【问题讨论】:

  • 我在这里找到了解决方案,cs.stackexchange.com/questions/35876/…,有人可以解释一下吗?
  • D.W.的答案在您提供的链接上确实是解决它的好方法。变量x_i 有一个二进制值:0 是未选中的圆,1 是选中的圆。您想最大化所选圆圈的数量,因此最大化总和x_1+...+x_n。约束确保不能同时选择两个重叠的圆。这类整数线性规划问题有现成的最小化器
  • 你可以看看this tutorial。纸浆似乎可以完成这项工作
  • 目前我还在学习回溯,然后我将学习 ILP。这是因为我不是cs背景,所以我不知道这种编程方式。谢谢罗曼,我以后会用源码学习。

标签: python circle-pack


【解决方案1】:

请尝试一下,它应该可以工作;)您需要安装pulp。脚本分为3部分:

  • 问题的参数化
  • 随机生成圆(我做了随机半径,但如果需要你可以使用固定半径)
  • 解决方案pulp
from pulp import LpMaximize, LpProblem, LpStatus, lpSum, LpVariable
import numpy as np
import matplotlib.pyplot as plt
from numpy.random import rand

#%% PARAMETRIZE the PROBLEM
N = 10 # number of circles
X = 15 # size on X
Y = 15 # size on Y

Rmin = 1 # min radius
Rmax = 2 # max radius

#%% GENERATE RANDOM CIRCLES

cx = rand(N)*(X-2*Rmax) + Rmax
cy = rand(N)*(Y-2*Rmax) + Rmax
r  = rand(N)*(Rmax-Rmin) + Rmin

plt.figure(1)
plt.clf()
for i in range(N): plt.gca().add_artist(plt.Circle((cx[i], cy[i]), r[i], alpha=0.7))
plt.axis('image')
plt.xlim(0,X)
plt.ylim(0,Y)


#%% GET SOLUTION
model = LpProblem(name="small-problem", sense=LpMaximize)
var = [LpVariable(name="x%u"%i, lowBound=0,upBound=1,cat='Integer') for i in range(N)]

# Add objective function to model
model += lpSum(var)

# Add constraints
for i in range(N):
    for j in range(i+1,N):
        dij = np.sqrt((cx[i]-cx[j])**2 + (cy[i]-cy[j])**2)
        if dij < (r[i]+r[j]):
            model += (var[i]+var[j]<=1,"intersec %u - %u"%(i,j))


# Solve it
status = model.solve()
print(f"status: {model.status}, {LpStatus[model.status]}")
print(f"objective: {model.objective.value()}")
for v in model.variables():
    print(f"{v.name}: {v.value()}")
    if v.value():
        i = int(v.name[1])
        plt.gca().add_artist(plt.Circle((cx[i], cy[i]), r[i],fc='none',ec='C1',lw=2))

【讨论】:

  • 是否有可能给出所有可能的解决方案,而不仅仅是一个解决方案?
  • 也许它存在但我没有看到它。您可以查看pulp 的文档。否则,一旦你找到了一个解决方案,你可以添加一个约束来消除它,再次运行算法,获得新的解决方案,添加一个约束来消除它......等等......直到不再有解决方案。这是一个迭代过程
  • 尽管如此复杂性增加了。最小化器通常擅长找到一个解决方案,但要获得所有解决方案是一项更困难的任务
  • 假设您的解决方案是(x_i,x_j,x_k)。删除此解决方案的约束是x_i+x_j+x_k&lt;3。所以 ILP 最小化器会找到另一个具有相同数量元素的解决方案(替代解决方案)或具有更少元素的解决方案(这是一个停止标准,因为它是一个更差的解决方案)
  • 好的,我明白你的意思。我将尝试首先使用回溯,然后将其与迭代使用 ILP 进行比较。谢谢罗曼。
猜你喜欢
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-21
相关资源
最近更新 更多