凸多邊形最優三角剖分

2021-09-19 01:10:50 字數 1731 閱讀 3540

【問題描述】使用動態規劃演算法解凸多邊形最優三角剖分問題,具體來說就是,依據遞迴式,按照順序求得子問題,使得該三角剖分中諸三角形上權之和為最小。

【輸入形式】在螢幕上輸入凸多邊形頂點個數和頂點座標。

【輸出形式】最優三角剖分後的三角形頂點。

【樣例輸入】

8 26

0 20

0 10

10 0

22 12

27 21

15 26

【樣例輸出】

【樣例說明】

輸入:頂點個數為7,每一行為乙個頂點座標,以空格分隔。

輸出:每一行為順序產生的最優三角剖分後的三角形頂點。

【評分標準】根據輸入得到準確的輸出。

python實現:

import numpy as np

import math

def min_weight(n, m, s, weights): # 計算最優值並記錄最優決策

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]+weights[i-1][i]+weights[i][j]+weights[j][i-1] # 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]+weights[i-1][k]+weights[k][j]+weights[j][i-1] # get_weight(i-1, k, j)

if t < m[i][j]:

m[i][j] = t

s[i][j] = k

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(str(i-1)+str(s[i][j])+str(j))

def main():

n = int(input())

a =

for _ in range(n):

weights = np.zeros((n, n), dtype=int)

for i in range(n):

weights[i][i] = 0

for i in range(n):

for j in range(i+1, n):

x = a[i][0]-a[j][0]

y = a[i][1]-a[j][1]

weights[i][j] = weights[j][i] = math.sqrt((x**2)+(y**2))

# print(weights)

m = np.zeros((n, n), dtype=int) # 存放最優值

s = np.zeros((n, n), dtype=int) # 存放最優決策

min_weight(n, m, s, weights)

traceback(1, n-1, s)

if __name__ == '__main__':

main()

凸多邊形的最優三角剖分

如圖所示,用頂點的逆時針序列表示凸多邊形,即p 表示具有n條邊的凸多邊形。給定凸多邊形p,以及定義在由多邊形的邊和弦組成的三角形上的權函式w。如圖所示劃分,要求確定該凸多邊形的三角剖分,使得該三角形上的勸之和最小。解析 若凸 n 1 邊形p 的最優剖分t包含三角形v0vkvn,1 k n 1,則t的...

4 5 凸多邊形最優三角剖分

動態規劃法解凸多邊形最優三角剖分 1 凸多邊形的三角剖分 將凸多邊形分割成互不相交的三角形的弦的集合t。2 最優剖分 給定凸多邊形p,以及定義在由多邊形的邊和弦組成的三角形上的權函式w。要求確定該凸多邊形的三角剖分,使得該三角剖分中諸三角形上權之和為最小。定義乙個頂點到其他頂點的權 weights ...

凸多邊形最優三角剖分問題

參考書籍 演算法設計與分析 王曉東 動態規劃 1.問題描述 注 是所有的三角形的權值之和,不是只計算邊和弦的權值之和 2.分析 3.編碼實現 author 胡家威 createtime 2011 11 10 下午12 31 16 description 凸多邊形的最優三角剖分 packageex2 ...