【问题标题】:Algorithm to minimize sum of diagonals for triangulation of convex polygon?最小化凸多边形三角剖分的对角线总和的算法?
【发布时间】:2016-03-03 11:47:26
【问题描述】:

将三角剖分的成本定义为已添加的对角线长度的总和。给定一个凸多边形,它最便宜的三角剖分的成本是多少?如果我们将多边形视为一组 n 坐标:v_1=x_1,y_1,...,v_n=x_n,y_n 并且解必须有 n-3 条对角线(不重叠,因为它是三角剖分)

我一直在尝试重现这个动态编程问题,但我似乎找不到一个好的问题。我并没有真正认识到次优结构来找到复发。任何人都可以帮我解决这个问题吗?

【问题讨论】:

  • 你能解释一下这与 C++ 有什么关系吗?
  • 对不起,我试图找到一个使用 c++ 的解决方案,但我是新手,只是如果有人想尝试一下,我会更熟悉 c++
  • 这是一个关于算法的问题。无论是用 C++、Java、Python、Perl、PHP、Basic 还是任何其他图灵完备的编程语言编写的,这个问题的答案都是一样的。在你弄清楚算法是什么之后,尝试用 C++ 编写解决方案,并且遇到某种问题,那么这将成为 C++ 问题。但不是在那之前。
  • @SamVarshavchik 抱歉刚刚删除了它,感谢您的信息

标签: algorithm dynamic geometry triangulation convex-polygon


【解决方案1】:

最简单的方法是遍历每个点,得到前一个点和下一个点之间的距离,然后用没有当前点的多边形进行递归;例如对于五边形 abcde 将是:

  • 距离 eb + 使用四边形递归 bcde
  • 距离 ac + 使用四边形递归 cdea
  • 距离 bd + 使用四边形递归 deab
  • 距离 ce + 使用四边形递归 eabc
  • 距离 da + 四边形递归 abcd

为了不重复计算相同的解决方案,您应该丢弃已经检查的点没有对角线到达的任何解决方案;例如在步骤 3 中使用四边形 deab 递归时,具有对角线 eb 的解决方案是重复的,因为使用三角形 abe 的解决方案已被签入第一步。 使用这种方法完全不进行重复计算可能会很复杂。

另一种方法是选择一个点(在下图中以红色表示),然后将每个解决方案枚举为总和为n - 2,其中 n 是点数。每条对角线都经过选定点的解决方案将是解决方案 11111。然后,您运行每个组合,总和为 n - 2:11111、1112、1121、113、1211、122、131、 14, 2111, 212, 221, 23, 311, 32, 41 和 5。大于 1 的数字表示您组合了 2 个或更多段,并从第一个点到最后一个点添加对角线。当数字大于 2 时,此对角线与剩余的多边形 (以粉红色表示) 接壤,您可以使用该多边形进行递归。

动画显示了算法对 7 点多边形的迭代和递归,直到它使用 6 点多边形递归为止。

这两种方法都为记忆和制表提供了可能性,但并不简单。一旦开始递归,从 b 点开始的五边形不一定是 bcdef ;很可能是bdfhj。所以检索存储的中间结果可能会有点复杂。

【讨论】:

  • 谢谢!我也在考虑第一种方法,但正如你所说,我很难检索结果。如果我实现了,我会更新我的解决方案
猜你喜欢
  • 2018-08-22
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 2015-03-19
  • 2018-04-13
  • 2011-07-15
  • 2017-04-09
  • 2021-08-30
相关资源
最近更新 更多