Как сравнить ребра в графе, чтобы реализовать триадическое замыкание, как в сетевых графиках, таких как Facebook - PullRequest
3 голосов
/ 21 апреля 2019

Я пытаюсь реализовать график, который содержит вершины (узлы), относящиеся к классу Profile (например, профиль Facebook, но более посредственный). Каждая из вершин (профилей) хранится в двоичном дереве поиска, которое затем загружается или сохраняется в массиве.
Так же, как в Facebook Profile некоторые (не все, поскольку не у всех есть друзья) экземпляры класс Profile будет иметь друзей, которые являются ребрами.
Каждое отношение ребер графа сохраняется в текстовом файле, который затем считывается и добавляется в граф отдельным методом во время построения графа.

Как только это будет сделано, я пытаюсь реализовать рекомендуемый метод:
Два профиля, которые не являются друзьями, но хотели бы быть друзьями на основе отношений, возможно, являющихся триадическим закрытием, но я до сих пор ужасно потерпел неудачу и сейчас застрял.

  • В настоящее время я смог создать график, используя Matrix, но я застрял с попыткой найти возможное решение, чтобы рекомендовать возможных друзей для каждой вершины, у которой есть друг j, у которого есть друг x, который не является друг вершины (текущий профиль).
  • Каждый из рекомендованных друзья должны быть сохранены в массив и добавлены в Дерево бинарного поиска.

    private List<Profile> getRecommendedFriends(){
            Iterator profileIterator = this.vertexProfileMap.entrySet().iterator();
            List<Profile> recommendedProfiles = new ArrayList<>();
            Boolean isContained;
    
            while(profileIterator.hasNext()){
               Map.Entry mapElement = (Map.Entry)profileIterator.next();
               Profile user = (Profile) mapElement.getValue();
               int sizeOfList =  user.numOfFriends();
    
               for(int i = 0;  i < sizeOfList; i++){
                  recommendedProfiles.add(user.getFriend(i));
                  for(int x = 0; x < user.numOfFriends(); x++){
                     for(int j = 0; j < user.numOfFriends(); j++){
                        isContained = user.getFriend(x).getName().equals(user.getFriend(j).getName());
                        if(!isContained){
                           recommendedProfiles.add(user.getFriend(j));
                        }
                     }
                  }
               }
    
            }
            return recommendedProfiles;
    }
    

    Я получаю ряд ошибок, которые не могу объяснить: (

1 Ответ

1 голос
/ 21 апреля 2019

Основываясь на данном алгоритме и предполагая, что класс Profile будет иметь дополнительный метод, называемый containsProfile(Profile p), который проверяет, содержится ли данный профиль в списке друзей пользователя, должен работать следующий метод грубой силы:

private Map<Profile,List<Profile>> getRecommendedFriends(){
    // under the asssumption that vertexProfileMap maps all Profiles/Users
    Iterator profileIterator = this.vertexProfileMap.entrySet().iterator();
    Map<Profile,List<Profile>> recommendedProfiles = new HashMap<>();
    while(profileIterator.hasNext()){
       Map.Entry mapElement = (Map.Entry)profileIterator.next();
       Profile currentUser = (Profile) mapElement.getValue();
       List<Profile> recommendedPerProfile = new ArrayList<>();
       // iterate over all of the friends of the current user
       for(int i = 0, endI = currentUser.numOfFriends(); i < endI; i++){
          Profile checkedFriend = currentUser.getFriend(i);
          // iterate over all of the friends of the currently checked friend
          for(int j = 0; endJ < checkedFriend.numOfFriends(); j < endJ; ++j) {
             Profile possibleRecommendation = checkedFriend.getFriend(j);
             // add a recommended profile if it belongs to a friend of a friend, but is not a friend of the current user
             if(!currentUser.containsProfile(possibleRecommendation)) {
                recommendedPerProfile.add(possibleRecommendation);
             }
          }
       }
       // remove possible duplicate recommendations
       recommendedProfiles = recommendedProfiles.stream()
       .distinct()
       .collect(Collectors.toList());
       // map the current user to a list of friend recommendations
       recommendedProfiles.put(currentUser, recommendedPerProfile);
    }
    return recommendedProfiles;

}

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