最优三角
一个n个角的凸多边形,,用互不相交的弦将其分为一个个的三角形,每个三角形的权值都是由三角形的边和弦组成权值函数w,求解如何划分才能使所有的角上的权值和达到最小
算法:
1、 minWeightTriangulation();// 遍历得到最优值,记录到备忘录中(s[][]中记录最佳顶点位置,t[][]中记录最小权值)
2、 minWeig();//计算权值
3、 Traceback();//递归遍历得到最优三角的顶点
输入: 凸多边形各个顶点的位置:
B[0].position( 0, 4);
B[1].position(-4, 3);
B[2].position(-6, 0);
B[3].position(-3,-4);
B[4].position( 2,-3);
B[5].position( 5, 0);
B[6].position( 3, 3);
空备忘录s[][],t[][]
输出: 带有最优值的备忘录s[][],t[][];最优三角序列。
packag
e 最优三角;
class position {
int x;
int y;
public void position(int a,int b) {
this.x=a;
this.y=b;
}
};
public class minWeig {
public static double w(position a,position b,position c) {
double x,y,z,h;
x=Math.sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
y=Math.sqrt((a.x-c.x)*(a.x-c.x)+(a.y-c.y)*(a.y-c.y));
z=Math.sqrt((b.x-c.x)*(b.x-c.x)+(b.y-c.y)*(b.y-c.y));
h=x+y+z;
return h;
}
public static void Traceback(int i,int j,int[][]s) {
if(i==j) return;
Traceback(i,s[i][j],s);
Traceback(s[i][j]+1,j,s);
System.out.println("三角剖分顶点:V"+(i-1)+",V"+j+",V"+s[i][j]);
}
public static void minWeightTriangulation(int n,double[][]t,int [][]s,position []B) {
for(int i=1;i<=n;i++)t[i][i]=0;
for(int r=2;r<=n;r++)
for(int i=1;i<=n-r+1;i++)
{
int j=i+r-1;
t[i][j]=t[i+1][j]+w(B[i-1],B[i],B[j]);
s[i][j]=i;
for(int k=i+1;k<j;k++)
{
double u=t[i][k]+t[k+1][j]+w(B[i-1],B[k],B[j]);
if(u<t[i][j]) {
t[i][j]=u;
s[i][j]=k;
}
}
}
}
public static void main(String[] args) {
double [][]t=new double[7][7];
int [][]s=new int[7][7];
position B[]=new position[8];
for(int i=0;i<=7;i++)
B[i]=new position();
B[0].position( 0, 4);
B[1].position(-4, 3);
B[2].position(-6, 0);
B[3].position(-3,-4);
B[4].position( 2,-3);
B[5].position( 5, 0);
B[6].position( 3, 3);
minWeightTriangulation(6,t,s,B);
Traceback(1,6,s);
//-------------------------
}
}