动态规划--最优三角

这篇博客探讨了如何使用动态规划算法解决一个凸多边形的最优三角划分问题,旨在最小化由三角形边和弦组成的权值函数w的总和。文章介绍了minWeightTriangulation()、minWeig()和Traceback()三个关键步骤,通过递归遍历找到最佳顶点位置和最小权值。并给出了一个具体的凸多边形示例作为输入,以及输出包含最优值的备忘录和最优三角序列。
摘要由CSDN通过智能技术生成

最优三角

一个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);
		//-------------------------
		
		
	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值