Java實現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初學者,方方面面做的不好,還請閱讀者包含。

                 本博客將成爲我的雲筆記本,記錄我的學習足跡,

                 以上。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章