動態規劃法解凸多邊形最優三角剖分
(1)凸多邊形的三角剖分:將凸多邊形分割成互不相交的三角形的弦的集合t。
(2)最優剖分:給定凸多邊形p,以及定義在由多邊形的邊和弦組成的三角形上的權函式w。要求確定該凸多邊形的三角剖分,使得該三角剖分中諸三角形上權之和為最小。
#定義乙個頂點到其他頂點的權
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]
]
weights是乙個鄰接矩陣,
求權值之和
#定義求三角形權之和的函式
def get_weight(i,j,k):
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]
]if k
return weights[i]
[j]+weights[j]
[k]+weights[k]
[i]
計算最優決策
def desicion(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
[j]:
m[i]
[j]=t
s[i]
[j]=k
return m,s
自底向上求取最優值
def max(i,j,s):
if i==j:
return
max(i, int(s[i]
[j]), s)
max(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]
))
凸多邊形最優三角剖分
問題描述 使用動態規劃演算法解凸多邊形最優三角剖分問題,具體來說就是,依據遞迴式,按照順序求得子問題,使得該三角剖分中諸三角形上權之和為最小。輸入形式 在螢幕上輸入凸多邊形頂點個數和頂點座標。輸出形式 最優三角剖分後的三角形頂點。樣例輸入 8 26 0 20 0 10 10 0 22 12 27 2...
凸多邊形的最優三角剖分
如圖所示,用頂點的逆時針序列表示凸多邊形,即p 表示具有n條邊的凸多邊形。給定凸多邊形p,以及定義在由多邊形的邊和弦組成的三角形上的權函式w。如圖所示劃分,要求確定該凸多邊形的三角剖分,使得該三角形上的勸之和最小。解析 若凸 n 1 邊形p 的最優剖分t包含三角形v0vkvn,1 k n 1,則t的...
凸多邊形最優三角剖分問題
參考書籍 演算法設計與分析 王曉東 動態規劃 1.問題描述 注 是所有的三角形的權值之和,不是只計算邊和弦的權值之和 2.分析 3.編碼實現 author 胡家威 createtime 2011 11 10 下午12 31 16 description 凸多邊形的最優三角剖分 packageex2 ...