*離散數學二元關係的閉包運算
如:自反性,對稱性,傳遞性以及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初學者,方方面面做的不好,還請閱讀者包含。
本博客將成爲我的雲筆記本,記錄我的學習足跡,
以上。