凸多边形最优三角剖分-python实现

用m[i][j]表示Vi-1ViVj最优三角剖分权函数之和,i=j时表示一条直线段,将其看成退化多边形,权函数为0:
m[1][2]=m[2][2]+V0V1V2=0.0+5=5.0;
最优决策:s[1][2]=1.0
m[2][3]=m[3][3]+V1V2V3=0.0+8=8.0;
最优决策:s[2][3]=2.0
m[3][4]=m[4][4]+V2V3V4=0.0+9=9.0;
最优决策:s[3][4]=3.0
m[4][5]=m[5][5]+V3V4V5=0.0+9=9.0;
最优决策:s[4][5]=4.0
m[1][3]=m[2][3]+V0V1V3=8.0+10=18.0;
最优决策:s[1][3]=1.0
m[1][3]=m[1][2]+m[3][3]+V0V2V3=5.0+0.0+10=12.0;
最优决策:s[1][3]=2.0
m[2][4]=m[3][4]+V1V2V4=9.0+4=13.0;
最优决策:s[2][4]=2.0
m[2][4]=m[2][3]+m[4][4]+V1V3V4=8.0+0.0+4=21.0;
m[3][5]=m[4][5]+V2V3V5=9.0+8=17.0;
最优决策:s[3][5]=3.0
m[3][5]=m[3][4]+m[5][5]+V2V4V5=9.0+0.0+8=15.0;
最优决策:s[3][5]=4.0
m[1][4]=m[2][4]+V0V1V4=13.0+5=18.0;
最优决策:s[1][4]=1.0
m[1][4]=m[1][2]+m[3][4]+V0V2V4=5.0+9.0+5=18.0;
m[1][4]=m[1][3]+m[4][4]+V0V3V4=12.0+0.0+5=22.0;
m[2][5]=m[3][5]+V1V2V5=15.0+8=23.0;
最优决策:s[2][5]=2.0
m[2][5]=m[2][3]+m[4][5]+V1V3V5=8.0+9.0+8=27.0;
m[2][5]=m[2][4]+m[5][5]+V1V4V5=13.0+0.0+8=19.0;
最优决策:s[2][5]=4.0
m[1][5]=m[2][5]+V0V1V5=19.0+9=28.0;
最优决策:s[1][5]=1.0
m[1][5]=m[1][2]+m[3][5]+V0V2V5=5.0+15.0+9=30.0;
m[1][5]=m[1][3]+m[4][5]+V0V3V5=12.0+9.0+9=30.0;
m[1][5]=m[1][4]+m[5][5]+V0V4V5=18.0+0.0+9=24.0;
最优决策:s[1][5]=4.0

其他的讲解在书上和其他博客都有详细介绍,所以直把中间的过程表示出来,下面贴代码
 
  
 
  
import numpy as np
n= 6 #顶点数
m=np.zeros((n,n)) #存放最优值
s=np.zeros((n,n)) #存放最优决策
#定义一个顶点到其他顶点的权
weights=[[ 0, 2, 2, 3, 1, 4], [ 2, 0, 1, 5, 2, 3], [ 2, 1, 0, 2, 1, 4], [ 3, 5, 2, 0, 6, 2], [ 1, 2, 1, 6, 0, 1], [ 4, 3, 4, 2, 1, 0]]
#定义求三角形权之和的函数
def get_weight(i,j,k):
     if k<n:
        return weights[i][j]+weights[j][k]+weights[k][i]
#计算最优值并记录最优决策
def Minest_weight_val(n,m,s):
     for i in range( 1,n):
         m[i][i]= 0  
         s[i][i]= 0  
     for r in range( 2,n):
         for i in range( 1,n-r+ 1):
             j=i+r- 1  
            m[i][j]=m[i+ 1][j]+get_weight(i- 1,i,j)
            s[i][j]=i
        for k in range(i+ 1,j):
            t=m[i][k]+m[k+ 1][j]+get_weight(i- 1,k,j)
            if t<m[i][j]:
                m[i][j]=t
                s[i][j]=k
Minest_weight_val(n,m,s)
print(m)
print(s)
def Traceback(i,j,s):
    if i==j:
        return
    Traceback(i, int(s[i][j]), s)
    Traceback( int(s[i][j] + 1), j, s)
    print( 'v'+ str(i- 1)+ ',v'+ str(j)+ ',v'+ str(s[i][j]))
print( '此多边形的最优三角剖分值为:'+ str(m[ 1][n- 1]))
print( '最优三角剖分结构为:')
Traceback( 1, 5,s)

猜你喜欢

转载自blog.csdn.net/qq_36387683/article/details/80049106