• 离散二元关系实验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的平方,求过后的矩阵与之前的矩阵如果同一位置值相等,则具有传递性,否则不具有传递性。

  • 相关阅读:
    SQL 运算符
    Shiro 入门
    SSM 整合配置
    MyBatis 入门
    Git 常用命令
    JSP
    Servlet
    Oracle 基础
    JDBC
    Java Thread
  • 原文地址:https://www.cnblogs.com/chmusk/p/11078934.html
Copyright © 2020-2023  润新知