凸多边形的最优三角剖分问题

凸多边形的最优三角剖分问题

问题描述

    多边形是平面上一条分段线性的闭曲线。也就是说,多边形是由一系列首尾相接的直线段组成的。组成多边形的各直线段称为该多边形的边。多边形相接两条边的连接点称为多边形的顶点。若多边形的边之间除了连接顶点外没有别的公共点,则称该多边形为简单多边形。一个简单多边形将平面分为3个部分:被包围在多边形内的所有点构成了多边形的内部;多边形本身构成多边形的边界;而平面上其余的点构成了多边形的外部。当一个简单多边形及其内部构成一个闭凸集时,称该简单多边形为凸多边形。也就是说凸多边形边界上或内部的任意两点所连成的直线段上所有的点均在该凸多边形的内部或边界上。

    通常,用多边形顶点的逆时针序列来表示一个凸多边形,即P=<v,v,… ,vn-1>表示具有n条边v0v1,v1v2,… ,vn-1vn的一个凸多边形,其中,约定v0=vn 。

    若vi与vj是多边形上不相邻的两个顶点,则线段vivj称为多边形的一条弦。弦 将多边形分割成凸的两个子多边形<v,vi+1 ,… ,vj>和<v,vj+1 ,… ,vi>。多边形的三角剖分是一个将多边形分割成互不重迭的三角形的弦的集合T。图1是一个凸多边形的两个不同的三角剖分。

(a) (b)

图1 一个凸多边形的2个不同的三角剖分

    在凸多边形P的一个三角剖分T中,各弦互不相交且弦数已达到最大,即P的任一不在T中的弦必与T中某一弦相交。在一个有n个顶点的凸多边形的三角刮分中,恰好有n-3条弦和n-2个三角形。

    凸多边形最优三角剖分的问题是:给定一个凸多边形P=<v,v,… ,vn-1>以及定义在由多边形的边和弦组成的三角形上的权函数ω。要求确定该凸多边形的一个三角剖分,使得该三角剖分对应的权即剖分中诸三角形上的权之和为最小。

    可以定义三角形上各种各样的权函数W。例如:定义 ω(△vivjvk)=|vivj|+|vivk|+|vkvj|,其中,|vivj|是点vi到vj的欧氏距离。相应于此权函数的最优三角剖分即为最小弦长三角剖分。

注意:解决此问题的算法必须适用于任意的权函数。

参考解答

用动态规划算法也能有效地求解凸多边形的最优三角剖分问题。尽管这是一个计算几何学问题,但在本质上,它与矩阵连乘积的最优计算次序问题极为相似。

1.三角剖分的结构及其相关问题

    凸多边形的三角剖分与表达式的完全加括号方式之间具有十分紧密的联系。正如所看到过的,矩阵连乘积的最优计算次序问题等价于矩阵链的完全加括号方式。这些问题之间的相关性可从它们所对应的完全二叉树的同构性看出。这里的所谓完全二叉树是指叶结点以外的所有结点的度数都为2的二叉树(注意与满二叉树近似满二叉树的区别)。

    一个表达式的完全加括号方式对应于一棵完全二叉树,人们称这棵二叉树为表达式的语法树。例如,与完全加括号的矩阵连乘积((A1(A2A3))(A4(A5A6)))相对应的语法树如图3(a)所示。

图3    表达式语法树与三角剖分的对应

    语法树中每一个叶子表示表达式中一个原子。在语法树中,若一结点有一个表示表达式E1的左子树,以及一个表示表达式Er的右子树,则以该结点为根的子树表示表达式(E1Er)。因此,有n个原子的完全加括号表达式对应于唯一的一棵有n个叶结点的语法树,反之亦然。

    凸多边形<v,v,… ,vn-1>的三角剖分也可以用语法树来表示。例如,图3(a)中凸多边形的三角剖分可用图3(b)所示的语法树来表示。该语法树的根结点为边v0v6,三角剖分中的弦组成其余的内部结点。多边形中除v0v6边外的每一条边是语法树的一个叶结点。树根v0v6是三角形v0v3v6的一条边,该三角形将原多边形分为3个部分:三角形v0v3v6,凸多边形<v,v,… ,v3>和凸多边形<v,v,… ,v6>。三角形v0v3v6的另外两条边,即弦v3v6和v0v3为根的两个儿子。以它们为根的子树分别表示凸多边形<v,v,… ,v3>和凸多边形<v,v,… ,v6>的三角剖分。

    在一般情况下,一个凸n边形的三角剖分对应于一棵有n-1个叶子的语法树。反之,也可根据一棵有n-1个叶子的语法树产生相应的一个凸n边形的三角剖分。也就是说,凸n边形的三角剖分与n-1个叶子的语法树之间存在一一对应关系。由于n个矩阵的完全加括号乘积与n个叶子的语法树之间存在一一对应关系,因此n个矩阵的完全加括号乘积也与凸(n+1)边形的三角剖分之间存在一一对应关系。图3的(a)和(b)表示出了这种对应关系,这时n=6。矩阵连乘积A1A2..A6中的每个矩阵Ai对应于凸(n+1)边形中的一条边vi-1vi。三角剖分中的一条弦vivj,i<j-1,对应于矩阵连乘积Ai+1..j 。

    事实上,矩阵连乘积的最优计算次序问题是凸多边形最优三角剖分问题的一个特殊情形。 对于给定的矩阵链A1A2..An,定义一个与之相应的凸(n+1)边形P=<v,v,… ,vn>,使得矩阵Ai与凸多边形的边vi-1vi一一对应。若矩阵Ai的维数为pi-1×pi,i=1,2,…,n,则定义三角形vivjvk上的权函数值为: ω(△vivjvk)=pipjpk。依此权函数的定义,凸多边形P的最优三角剖分所对应的语法树给出矩阵链A1A2..An的最优完全加括号方式。

2.最优子结构性质

    凸多边形的最优三角剖分问题有最优子结构性质。事实上,若凸(n+1)边形P=<v,v,… ,vn>的一个最优三角剖分T包含三角形v0vkvn , 1≤k≤n-1,则T的权为3个部分权的和,即三角形v0vkvn的权,子多边形<v,v,… ,vk>的权和<v,vk+1 ,… ,vn>的权之和。可以断言由T所确定的这两个子多边形的三角剖分也是最优的,因为若有<v,v,… ,vk>或<v,vk+1 ,… ,vn>的更小权的三角剖分,将会导致T不是最优三角剖分的矛盾。

3.最优三角剖分对应的权的递归结构

    首先,定义t[i,j],1≤i<j≤n,为凸子多边形<vi-1 ,v,… ,vj>的最优三角剖分所对应的权值,即最优值。为方便起见,设退化的多边形<Vi-1 ,vi>具有权值0。据此定义,要计算的凸(n+1)边多边形P对应的权的最优值为t[1,n]。

    t[i,j]的值可以利用最优子结构性质递归地计算。由于退化的2顶点多边形的权值为0,所以t[i,i]=0,i=1,2,…,n 。当j一i≥1时,子多边形<vi-1 ,v,… ,vj>至少有3个顶点。由最优于结构性质,t[i,j]的值应为t[i,k]的值加上t[k+1,j]的值,再加上△vi-1vkvj的权值,并在i≤k≤j-1的范围内取最小。由此,t[i,j]可递归地定义为:

4.计算最优值

    将(2.3)式与矩阵连乘积的最优计算次序问题中计算m[i,j]的(2.l)式进行比较容易看出,除了权函数的定义外,两个递归式是完全一样的。因此只要对计算m[i,j]的算法MATRIX_CHAIN_ORDER做很小的修改就完全适用于计算t[i,j]。

    下面描述的计算凸(n+1)边形P=<v,v,… ,vn>的三角剖分最优权值的动态规划算法MINIMUM_WEIGHT_TRIANGULATION,输入是凸多边形P=<v,v1,… ,vn>的权函数ω,输出是最优值t[i,j]和使得t[i,k]+t[k+1,j]+ω(△vi-1vkvj)达到最优的位置(k=)s[i,j],1≤i≤j≤n 。

Procedure MINIMUM_WEIGHT_TRIANGULATION(P,w);
begin
  n:=length[p]-1;
  for i:=1 to n do t[i,i]:=0;
    for ll:=2 to n do
      for i:=1 to n-ll+1 do
        begin
          j:=i+ll-1;
          t[i,j]:=∞;
          for k:=i to j-1 do
            begin
              q:=t[i,k]+t[k+1,j]+ω(△vi-1vkvj);
              if q<t[i,j] then
                begin
                  t[i,j]:=q;
                  s[i,j]:=k;
                end;
            end;
        end;
  return(t,s);
end;

MATRIX_CHAIN_ORDER一样,算法MINIMUM_WEIGHT_TRIANGULATION占用θ(n2)空间,耗时θ(n3)。

5.构造最优三角剖分

如我们所看到的,对于任意的1≤i≤j≤n ,算法MINIMUM_WEIGHT_TRIANGULATION在计算每一个子多边形<vi-1 ,v,… ,vj>的最优三角剖分所对应的权值t[i,j]的同时,还在s[i,j]中记录了此最优三角剖分中与边(或弦)vi-1vj构成的三角形的第三个顶点的位置。因此,利用最优子结构性质并借助于s[i,j],1≤i≤j≤n ,凸(n+l)边形P=<v,v,… ,vn>的最优三角剖分可容易地在Ο(n)时间内构造出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值