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