动态规划-凸多边形最优子结构分离

线性封闭曲线构成的多边形的三角最优分解与计算矩阵最优连乘类似。

1.定义与分析

首先,用多边形逆时针顶点的集合来表示凸多边形。
其次,图形描述-结构描述。
分析,最优子结构性质。
分析,最优三角分解递归结构。
最后,最优值计算。

1.1 凸多边形的表示及最优分解的数学性质:
P={v0,v1,v2,v3,…,vn} 逆时针构成多边形 - (v0=vn)。
弦(vi,vj)分割多边形成{vi,…,vj} {vj,…,vi} 构成集合T。
在弦不相交的条件下,三角分解包括n-3条弦,n-2个三角形。
权函数举例:

w(vi,vj,vk)=|vivj|+|vivk|+|vkvi|

1.2 三角分解结构
动态规划-凸多边形最优子结构分离_第1张图片动态规划-凸多边形最优子结构分离_第2张图片
结合二叉树结构-完全二叉树
1.3最优子结构性质:
若凸(n+1)边形P={V0,V1……Vn}的最优三角剖分T包含三角形V0VkVn,1<=k<=n,则T的权为三个部分权之和:三角形V0VkVn的权,多边形{V0,V1……Vk}的权和多边形{Vk,Vk+1……Vn}的权之和。
由T确定的这两个子多边形的三角剖分也是最优的。因为若有{V0,V1……Vk}和{V0,V1……Vk}更小权的三角剖分,将导致T不是最优三角剖分的矛盾。因此,凸多边形的三角剖分问题具有最优子结构性质。
1.4 递推关系:
设t[i][j],1<=i
在这里插入图片描述
动态规划-凸多边形最优子结构分离_第3张图片
以正六边形为例:程序运行结果与手动运算结果一致。
matlab
动态规划-凸多边形最优子结构分离_第4张图片

c语言
动态规划-凸多边形最优子结构分离_第5张图片
matlab代码:

clear
clc
N=7;
weigh={ { 0,1,1.732,2,1.732,1 },{ 1,0,1,1.732,2,1.732 },{ 1.732,1,0,1,1.732,2 },{ 2,1.732,1,0,1,1.732 },{ 1.732,5,1.732,1,0,1 },{ 1,1.732,2,1.732,1,0 } };%凸多边形的权  
global weight;
for i=1:6
    weight(i,:)=cell2mat(weigh{1,i});
end
n=N-1;
s=zeros(N,N);
t=zeros(N,N);
for i=1:n
    t(i,i)=0;
end
    for r=2:n
        for i=1:n-r
            j=i+r-1;
            t(i,j)=t(i+1,j)+Weight(i,i+1,j+1);
            s(i,j)=i;
            for k=i+1:j-1
                u=t(i,k)+t(k+1,j)+Weight(i,k+1,j+1);
                if u

c代码:

#include    
using namespace std;

const int N = 7;//凸多边形边数+1  
float weight[][N] = { { 0,1,1.732,2,1.732,1 },{ 1,0,1,1.732,2,1.732 },{ 1.732,1,0,1,1.732,2 },{ 2,1.732,1,0,1,1.732 },{ 1.732,5,1.732,1,0,1 },{ 1,1.732,2,1.732,1,0 } };//凸多边形的权  

float MinWeightTriangulation(int n, float **t, int **s);
void Traceback(int i, int j, int **s);//递归构造最优解  
float Weight(int a, int b, int c);//权函数  

int main()
{
	int **s = new int *[N];
	float **t = new float *[N];
	for (int i = 0; i

源码:https://download.csdn.net/download/qq_38485239/10949244

你可能感兴趣的:(算法)