我正在尝试使用分层搜索(在树中)找到包围点的最小圆圈。我搜索了很多,我似乎只在网上找到最小的封闭圆(奇异)算法。这是针对大学课程的,所以我要求的可能的解决方案和想法不仅仅是实际的代码。
我的问题是我有一个公式涉及两个常数和一个圆的半径来计算其成本,我需要最小化总成本。这意味着对于一组点(x,y),我可以找到一个包围所有点的圆,或多个圆,每个圆包围一部分点,具体取决于每个圆的成本。
例如,如果公式是1 + 2 *半径** 2,我的答案肯定会有多个小圆圈。所有点必须在最后一个圆圈。
我的目标是首先使用图形搜索算法,如*,分支和边界或广度,然后使用状态及其可能的操作构建树。
我目前正在尝试编写可能的操作,例如添加圆圈,移除圆圈并更改圆的半径。为了限制计算时间,我决定只在两点之间或两组点之间的位置上尝试这些操作(我的圆圈的中心可以是)。但是这个算法似乎远非最优。如果您有任何想法,那将对我有所帮助。
非常感谢你的帮助。
如果问题不清楚,请告诉我。
答案 0 :(得分:1)
我将专注于寻找最佳解决方案。如果您打开近似解决方案,那么您还有很多选择,而且我确定会有其他答案。
我会通过将其作为整数程序来解决这个问题。抽象地说,该程序看起来像
variable x_C: 1 if circle C is chosen; 0 if circle C is not chosen
minimize sum_C cost(C) * x_C
subject to
for all points p, sum_{C containing p} x_C >= 1
for all circles C, x_C in {0, 1}.
现在,当然有无限多个圆圈,但假设一个圆圈包含的区域比另一个圆圈要多得多,那么可以合理地选择O(n ^ 3)个圆圈,其中n是点数。这些是退化的圆圈,恰好覆盖了一个点;两个点形成直径的圆圈;和通过三个点的圆圈。您将编写代码以将抽象整数程序扩展为整数程序求解程序(例如GLPK)接受的格式的具体程序,然后运行求解程序。
整数程序的大小为O(n ^ 4),对于较大的实例来说这是非常昂贵的。为了降低成本,您需要进行列生成。这是您需要弄清楚求解程序的编程接口的地方。您正在寻找一个选项,在解决整数程序的线性松弛时,使用每个点的当前价格调用您的代码,并期望一个可选的圆,其成本低于该价格的总和。它包含的点。
生成列的朴素算法仍为O(n ^ 4),但如果切换到扫描算法,则成本为O(n ^ 3 log n)。给定一对点,想象通过这些点的所有圆圈。所有圆心都位于垂直平分线上。对于每个其他点,存在圆圈包围该点的中心间隔。计算所有这些事件点,对它们进行排序,然后按顺序处理事件,随时更新所包含点的当前总价。 (由于圆圈是关闭的,因此在离开前处理到达。)
如果您想进一步推动这一点,请查看分支和价格。高级分支变量将决定是否用相同的圆圈覆盖两个点。