Wrashall算法,自反性,对称性的实现

*离散数学二元关系的闭包运算

  如:自反性,对称性传递性以及Wrashall算法,下面将用Java实现

   一.处理二元关系的类(ArraysSetOperation):

public class ArraysSetOperation {

	private int[][] array;
	private int[][] array2 = new int[7][7];
	
	public ArraysSetOperation(int[][] array) {
		this.array = array;
	}
	
	/**
	 * initialize the value of the array.
	 * @param x is the line number of array, y is the columns number of array.
	 */
	public void setArrays(int x1, int y1) {
		array[x1][y1] = 1;
		array2[x1][y1] = 1;
	}
	public void setArrays(int x1, int y1, int x2, int y2) {
		array[x1][y1] = 1;
		array[x2][y2] = 1;
		array2[x1][y1] = 1;
		array2[x2][y2] = 1;
	}
	public void setArrays(int x1, int y1, int x2, int y2, int x3, int y3) {
		array[x1][y1] = 1;
		array[x2][y2] = 1;
		array[x3][y3] = 1;
		array2[x1][y1] = 1;
		array2[x2][y2] = 1;
		array2[x3][y3] = 1;
	}
	public void setArrays(int[] x, int[] y) {
		for(int i=0; i<x.length; i++){
				array[x[i]][y[i]] = 1;
				array2[x[i]][y[i]] = 1;
		}
	}
	
	/**
	 * 实现Wrashall算法求二元关系传递闭包的关系
	 */
	public void Wrashall() {
		for(int j=0; j<array.length; j++)	{
			for(int i=0; i<array.length; i++)	{
				if(array2[i][j] == 1) {
					for(int k=0; k<array[j].length; k++){
						array2[i][k] = array2[i][k] + array2[j][k];
						if(array2[i][k]>1)
							array2[i][k] = 1;
					}
				}
			}
		}
	}
	
	/**
	 * make the array to have reflexivity
	 */
	public void reflexivity() {
		for(int i=0; i<array.length; i++) {
			array2[i][i] = 1;
		}
	}
	
	/**
	 * make the array to have symmetry
	 */
	public void symmetry() {
		for(int i=0; i<array.length; i++) {
			for(int j=0; j<array[i].length; j++) {
				if(array[i][j] == 1)
					array2[j][i] = 1;
			}
		}
	}
	
	/**
	 * make the array to have transitivity
	 */
	public void transitivity() 
	{
		for(int i=0; i<array.length; i++)
		{
			for(int j=0; j<array[i].length; j++) 
				if(array[i][j] == 1)
					for(int k=0; k<array[j].length; k++) 
						if(array[i][j] == array[j][k])
							array2[i][k] = 1;	
		}	
	}
	
	/**
	 * print the array which was changed
	 */
	public void getArray() {

		for(int i=0; i<array2.length; i++) {
			
			for(int j=0; j<array2[i].length; j++) 
				System.out.printf(array2[i][j] + "  ");
			System.out.println();
		}
		
		//初始化二元关系数组
		for(int i=0; i<array.length; i++)
			for(int j=0; j<array[i].length; j++)
				array2[i][j] = array[i][j];
	}
	
}
	

二.有主函数的类(WrashallTest):

/**
 * 这个程序是为了实现离散数学中二元关系的部分性质和算法
 * @author Xuer
 * @version 1.0无界面版本 
 * 时间:2018-05-19
 * 此方法仅示范于7×7数组,如需其他数组,请自行改动
 */
public class WrashallTest {
	
	public static void main(String[] args) {
		
		//创建7×7 的数组
		int[][] Arrays = new int[7][7];
		
		//创建一个处理求二元关系的对象
		ArraysSetOperation a = new ArraysSetOperation(Arrays);
		
		System.out.println("原来的二元关系为:");
		
		//将部分数组中的值设置为1
		/*
		 * 1.若设置的值个数小于等于3则使用setArrays(int x1..., int y1...)
		 * 2.若设置的值个数大于3则使用setArrays(int[] x, int[] y)
		 */
		int[] x = {0,0,1,2,3};	//对应x坐标
		int[] y = {0,1,3,4,1};	//对应y坐标
		a.setArrays(x, y);
		//输出所定义的集合
		a.getArray();
		
		System.out.println("实现自反性:");
		a.reflexivity();
		a.getArray();
		
		System.out.println("实现对称性:");
		a.symmetry();
		a.getArray();
		
		System.out.println("实现传递性:");
		a.transitivity();
		a.getArray();
		
		System.out.println("实现wrashall算法:");
		a.Wrashall();
		a.getArray();
	}
}

①自反性:

    定义设 R是 A上的一个二元关系,若对于 A中的每一个元素 a, (a,a)都属于 R,则称 R为自反关系。换言之,在自反关系中, A中每一个元素与其自身相关。

由定义可知array[i][i]都属于A上的二元关系R,所以将array2[i][i]都赋值为1

public void reflexivity() {
    for(int i=0; i<array.length; i++) {
        array2[i][i] = 1;
    } 
}

②对称性:

    定义对称关系(symmetrical relation)是一种特殊的关系,指与自身的逆关系完全相同的那种关系。集合A上的二元关系R,对任何a,b∈A,当aRb时有bRa,用符号表示:R是A上的对称关系⇔∀a∀b(a∈A∧b∈A∧aRb→bRa)。当A上的R是对称关系时,称R在A上是对称的,或称A上的关系R有对称性。例如,数集中的关系I={〈x,y〉|x与y相等},N={〈x,y〉|x与y不等}都是对称关系;而L={〈x,y〉|x小于y}不是对称关系,当A上的关系R是对称的时,它的补关系与逆关系都是对称的,且R=R-1

    即:若存在array[i][j]属于二元关系R,则有array[j][i]也属于R, 所以将array2[[j][i]也赋值于1.

public void symmetry() {
    for(int i=0; i<array.length; i++) {
        for(int j=0; j<array[i].length; j++) {
            if(array[i][j] == 1)
                array2[j][i] = 1;
        }
    }
}

③传递性:

    定义传递关系(transitive relation)是一种特殊的关系,指由甲、乙和乙、丙都有,可推知甲、丙也有的那种关系。集合A上的二元关系R,对任何a,b,c∈A,当aRb,bRc时,有aRc,用符号表示:R是A上的传递关系⇔∀a∀b∀c(a∈A∧b∈A∧c∈A∧aRb∧bRc→aRc)。当A上的R是传递关系时,称R在A上是传递的,或说A上的关系R有传递性。例如,实数集中的小于关系与不小于关系都是传递的;而人群中的同学关系是不传递的。若R在A上是传递的,则R°R⊆R;反之,如R°R⊆R,则R在A上是传递的。一个反自反的传递关系是不对称的,一个反自反的对称非空关系不是传递关系。

    当array[i][j] == array[j][k]时, 将array[i][k] = 1

public void transitivity() 
{
    for(int i=0; i<array.length; i++)
    {
        for(int j=0; j<array[i].length; j++) 
            if(array[i][j] == 1)
                for(int k=0; k<array[j].length; k++) 
                    if(array[i][j] == array[j][k]) array2[i][k] = 1;	
    }
}	
    }
}

④Wrashall算法

    步骤:(1):按列进行扫描

              (2):如:当array[i][j] = 1 时, 将array数组中第 i 行中所有元素与第 j 行所对应元素分别进行逻辑加,并将所得值覆盖第 i 行的元素。

public void Wrashall(){
    for(int j=0; j<array.length; j++){
        for(int i=0; i<array.length; i++){
            if(array2[i][j] == 1){
                for(int k=0; k<array[j].length; k++){
                    array2[i][k] = array2[i][k] + array2[j][k];
                        if(array2[i][k]>1)
                        array2[i][k] = 1;
                 }
            }
        }
    }
}

最后声明:本人大一Java初学者,方方面面做的不好,还请阅读者包含。

                 本博客将成为我的云笔记本,记录我的学习足迹,

                 以上。

猜你喜欢

转载自blog.csdn.net/qq_40311709/article/details/80377304
今日推荐