我在3D中分别有两条折线v
和u
分别带有n
和m
个顶点。我想将v[0]
与u[0]
,v[n-1]
连接到u[m-1]
以及内部顶点以某种方式获得具有最小表面积的三角形网格条。
我天真的解决方案是通过随后添加最小对角线来获得接近最优的初始网格,然后在每个四边形中切换对角线,如果它产生较小的区域,直到不再可能为止。
但我担心我可以以当地最低限度而非全球性结束。有什么更好的选择来实现最小网格?
答案 0 :(得分:2)
这可以通过动态程序解决。
让我们将问题可视化为一个表,其中列表示第一条折线的顶点,行代表第二条折线的顶点:
0 1 2 3 ... n-1 -> v
0
1
2
...
m-1
每个单元格代表折线之间的边。您从(0, 0)
开始,希望通过(n-1, m-1)
或(+1, 0)
步骤找到(0, +1)
的路径。您所做的每一步都有成本(结果三角形的面积),并且您希望找到导致最低成本的路径。
因此,您可以迭代(仅以动态编程的方式)计算到达任何单元格所需的成本(通过比较两个可能的传入方向的最终成本)。记住您选择的方向,最终您将拥有最低成本的完整路径。总体运行时间为O(n * m)
。
如果您知道顶点的分布或多或少,则可以将表的计算限制为对角线附近的几个条目。这可以使运行时间降至O(k * max(n, m))
,其中k
是对角线周围的可变半径。但如果假设一个漂亮的顶点分布不成立,你可能会错过最优解。
您也可以采用类似A *的策略,只有当您认为某个单元格属于最小路径时才会计算单元格(借助某些启发式方法)。