离散二元关系实验java实现

一、实验目的

通过算法设计并编程实现对给定集合上的关系是否为自反的、对称的和传递关系的判断,加深学生对关系性质的理解,掌握用矩阵来判断等价关系的方法。

二、实验内容

给定R的关系矩阵,据此判断所给关系R是否为等价关系。

三、实验原理和方法

设R为非空集合A上的关系。如果R是自反的、对称的和传递的,则称R为A上的等价关系。

从给定的关系矩阵来断判关系R是否为自反。若M(R的关系矩阵)的主对角线元素均为1,则R是自反关系;若M(R的关系矩阵)的主对角线元素均为0,则R是反自反关系;若M(R的关系矩阵)的主对角线元素既有1又有0,则R既不是自反关系也不是反自反关系。本算法可以作为判等价关系算法的子程序给出。

从给定的关系矩阵来判断关系R是否为对称。若M(R的关系矩阵)为对称矩阵,则R是对称关系;若M为反对称矩阵,则R是反对称关系。因为R为对称的是等价关系的必要条件,所以,本算法可以作为判等价关系算法的子程序给出。

一个关系R的可传递性定义告诉我们,若关系R是可传递的,则必有:mik=1∧mkj=1 mij=1。可传递性也是等价关系的必要条件,本算法也可以作为判等价关系算法的子程序给出。

四、实验要求

设A={1,2,3},任选一种语言判断下述关系的性质:

关系R1={<1,1>, <1,2>,<1,3>,<2,1>,<3,1>} 

关系R2={<1,1>, <1,2>,<2,1>,<2,2>,<3,3>} 

五、实验过程

源代码

package cn.sal.lisan;
import java.util.*;

class Zifan
{
	Zifan(int[][] r,int n)
	{
		int sum=0;
		A:for(int i=0;i<n;i++)
		{
			
				for(int j=0;j<n;j++)
				{
					if(r[i][j]==1&&i==j)
					{
						//flag=true;
						sum++;
						
					}
					
				}
				
			}
		
	
	int sum1=0;
	A:for(int i=0;i<n;i++)
	{
	
				 if(r[i][i]==0)
				{
					
				sum1++;
				
		}
	}
	if(sum==3)
	{
		System.out.println("具有自反性");
	}
	else if(sum1==3)
	{
		System.out.println("无自反性");
	}
	else {
		System.out.println("既不自反也不反自反");
	
	}
	}
}

class Duichen
{
	Duichen(int[][] r,int n)
	{
	
			int sum=0,sum1=0;
			A:for(int i=0;i<n;i++)
			{
				
					for(int j=0;j<=i;j++)
					{
						if(r[i][j]==1&&r[j][i]==0&&i!=j)
						{
							sum++;
						}
						else if(r[i][j]==r[j][i]&&i!=j)
						{
							sum1++;
						}
					}
					
				}
			//System.out.println(sum1);
			if(sum==n)
			{
	System.out.println("具有反对称性");	
			}
			else if(sum1==3)
			{
				System.out.println("具有对称性");	
			}
			else {
				System.out.println("既不对称也不反对称");
			}
		}
	}

class Chuandi
{
	//int[] s=new int[r.]
	Chuandi(int[][] r,int n)
	{
		int[][] s=new int[r.length][r.length];
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
				s[i][j]=0;
				for(int k=0;k<n;k++)
				{
					s[i][j]+=r[i][k]*r[k][j];
				}
			}
		}
		boolean p = false;
		for(int i=0;i<n;i++)
		{
			for(int j=0;j<n;j++)
			{
					if(s[i][j]!=r[i][j])
					{
					 p=true;
						
						break;
					}
				
			}
		}
		if(p)
		{
			System.out.println("不具有传递性");
		}
		else
		{
			System.out.println("具有传递性");

		}
		
	}
}

public class Lisan2 {
		public static void main(String args[])
		{
			Scanner scanner=new Scanner(System.in);
			System.out.println("请输入矩阵行数");
			int n=scanner.nextInt();
			int[][] r1=new int[n][n];
			int[][] r2=new int[n][n];
			System.out.println("请输入矩阵r1");
			for(int i=0;i<n;i++)
			{
				{
					for(int j=0;j<n;j++)
					{
						r1[i][j]=scanner.nextInt();
					}
				}
			}
			Zifan zifan=new Zifan(r1,n);
			Duichen duichen=new Duichen(r1,n);
			Chuandi chuandi=new Chuandi(r1,n);
			
			System.out.println();
			System.out.println("请输入矩阵r2");
			for(int i=0;i<n;i++)
			{
				{
					for(int j=0;j<n;j++)
					{
						r2[i][j]=scanner.nextInt();
					}
				}
			}
		
			Zifan zifan2=new Zifan(r2,n);
			Duichen duichen1=new Duichen(r2,n);
			Chuandi chuandi1=new Chuandi(r2,n);

			
		}	
			
		}

 

实验结果

 

六、实验总结

关于总结,本次的实验目的是判断给定矩阵的二元关系,根据离散数学中关于二元关系的定义,就能直接用代码实现了,本次作业使用的是java代码。

首先判断自反关系时,直接判断矩阵的对角线是否全为0或全为1即可,全为0是反自反关系,全为1是自反关系,在代码中的体现是,当行数与列数相等时,判断他们对应的值是否全为1或全为0,或者有1有0,如果既有0也有1则说明这个矩阵既不自反也不反自反。

判断对称关系时,对于一位数r[i][j]判断另一位r[j][i]是否与这位数相等,其中i!=j,如果这两个数不相等,则不具有对称性,如果全部相等,则具有对称性。

判断传递关系时,需要用到线性代数解决方法,其中关键一点就是求出矩阵r的平方,求过后的矩阵与之前的矩阵如果同一位置值相等,则具有传递性,否则不具有传递性。

posted @ 2018-12-18 15:15  ch_musk  阅读(828)  评论(0编辑  收藏  举报