Как проверить, является ли матрица антисимметричной - PullRequest
0 голосов
/ 08 ноября 2018

Вот мой код, чтобы проверить, является ли матрица антисимметричной. (Отношение R на множестве A называется антисимметричным тогда и только тогда, когда для любого a и b в A всякий раз, когда (a, b) в R и (b, a) в R, должно выполняться a = b.)

// AntiSymmetric
public static boolean checkAntisymmetric(Graph graph, int vertices){
    boolean antisymmetric = false;
    for(int i = 1; i <= vertices; i++) {
        for(int j = 1; j <= vertices; j++){
            if((graph.getEdge(i, j) == graph.getEdge(j, i)) && (i == j)){
                antisymmetric = true;
                break;
            }
        }
    }
    if(antisymmetric){
        return true;
    }
    else {
        return false;
    }
}

И моя функция getEdge:

public int getEdge(int to, int from){
    try{
        return adjencencyMatrix[to][from];
    } catch(ArrayIndexOutOfBoundsException index){
        System.out.println("Vertices does not exist");
    }
    return -1;
}

Например, если я даю ребра, представленные парами: (2,3) (3,5) (3,2) (5,1) (4,4) Должно быть возвращено false из-за (4,4). Дополнительно я использовал это как ссылку: Representing Relations

Мне удалось создать функцию, в которой проверяется, действительно ли матрица симметрична. Единственное отличие состоит в том, что моя антисимметричная функция имеет условие (i == j) внутри оператора if. Может ли кто-нибудь понять, почему это всегда возвращает истину? Благодарю. Пример матрицы, которую я использовал для проверки функции, показан здесь:

0 0 0 0 0
0 0 1 0 0
0 1 0 0 1
0 0 0 0 0
1 0 0 0 0

Для пар: (2,3) (3,5) (3,2) (5,1)

1 Ответ

0 голосов
/ 08 ноября 2018

Асимметрия подразумевает, что для каждого i, j, где i! = J, M (i, j) == 0 или M (j, i) == 0.

Ваше текущее состояние:

if((graph.getEdge(i, j) == graph.getEdge(j, i)) && (i == j))

Из-за i == j в вашем состоянии вы проверяете диагональ по центру матрицы. Это означает, что getEdge(i, j) == getEdge(i, i) == getEdge(j, j) == getEdge(j, i), поскольку i == j. Таким образом, ваша проверка будет всегда проходить, поскольку вы сравниваете матричную запись с самим собой.

Попробуйте реализовать условие, указанное в предоставленном вами определении, которое в основном гласит, что одно из двух должно быть 0:

if((graph.getEdge(i, j) == 0 || graph.getEdge(j, i) == 0) && (i != j))

Однако ваша логика выхода из цикла также несовершенна, поскольку вы вернете true, если первая пара удовлетворяет этому условию, а не всей матрице. Попробуйте проверить на наличие сбоев и выйти рано, иначе, если вы пройдете через матрицу без сбоев, вы знаете, что условие было успешным для каждой пары, и матрица асимметрична:

// AntiSymmetric
public static boolean checkAntisymmetric(Graph graph, int vertices){
    for(int i = 1; i <= vertices; i++) {
        for(int j = 1; j <= vertices; j++){
            if((i != j) && graph.getEdge(i, j) != 0 && graph.getEdge(j, i) != 0) {
                return false;
            }
        }
    }
    return true;
}

По сути, мы проверяем, не удовлетворяют ли какие-либо пары условию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...