diff --git a/src/main/java/reputation/node/models/Node.java b/src/main/java/reputation/node/models/Node.java index 535a047..fff086f 100644 --- a/src/main/java/reputation/node/models/Node.java +++ b/src/main/java/reputation/node/models/Node.java @@ -342,7 +342,8 @@ private String getNodeIdWithHighestReputation() { reputation = reputationCalc.calculate( evaluationTransactions, - this.useLatestCredibility + this.useLatestCredibility, + this.useCredibility ); } @@ -410,7 +411,8 @@ private DeviceSensorId getDeviceWithHighestReputation( reputation = reputationCalc.calculate( evaluationTransactions, - this.useLatestCredibility + this.useLatestCredibility, + this.useCredibility ); } diff --git a/src/main/java/reputation/node/reputation/IReputation.java b/src/main/java/reputation/node/reputation/IReputation.java index 84e09c2..90d529f 100644 --- a/src/main/java/reputation/node/reputation/IReputation.java +++ b/src/main/java/reputation/node/reputation/IReputation.java @@ -15,11 +15,14 @@ public interface IReputation { * @param evaluationTransactions List - Lista com as transações * de avaliação da coisa. * @param useLatestCredibility boolean - Indica se é para usar ou não a - * credibilidade mais recente para o cálculo da reputação + * credibilidade mais recente para o cálculo da reputação. + * @param useCredibility boolean - Indica se é para usar ou não a + * credibilidade no cálculo da reputação. * @return Double */ Double calculate( List evaluationTransactions, - boolean useLatestCredibility + boolean useLatestCredibility, + boolean useCredibility ); } diff --git a/src/main/java/reputation/node/reputation/Reputation.java b/src/main/java/reputation/node/reputation/Reputation.java index ca89ac1..e6fe133 100644 --- a/src/main/java/reputation/node/reputation/Reputation.java +++ b/src/main/java/reputation/node/reputation/Reputation.java @@ -17,12 +17,17 @@ public class Reputation implements IReputation { * * @param evaluationTransactions List - Lista com as transações * de avaliação da coisa. + * @param useLatestCredibility boolean - Indica se é para usar ou não a + * credibilidade mais recente para o cálculo da reputação. + * @param useCredibility boolean - Indica se é para usar ou não a + * credibilidade no cálculo da reputação. * @return Double */ @Override public Double calculate( List evaluationTransactions, - boolean useLatestCredibility + boolean useLatestCredibility, + boolean useCredibility ) { return evaluationTransactions .stream() diff --git a/src/main/java/reputation/node/reputation/ReputationUsingKMeans.java b/src/main/java/reputation/node/reputation/ReputationUsingKMeans.java index 5597133..e21a267 100644 --- a/src/main/java/reputation/node/reputation/ReputationUsingKMeans.java +++ b/src/main/java/reputation/node/reputation/ReputationUsingKMeans.java @@ -47,12 +47,17 @@ public ReputationUsingKMeans( * * @param evaluationTransactions List - Lista com as transações * de avaliação da coisa. + * @param useLatestCredibility boolean - Indica se é para usar ou não a + * credibilidade mais recente para o cálculo da reputação. + * @param useCredibility boolean - Indica se é para usar ou não a + * credibilidade no cálculo da reputação. * @return Double */ @Override public Double calculate( List evaluationTransactions, - boolean useLatestCredibility + boolean useLatestCredibility, + boolean useCredibility ) { double reputation = 0.0; @@ -82,36 +87,61 @@ public Double calculate( OptionalDouble temp; if (useLatestCredibility) { // Cálculo da reputação usando a credibilidade mais recente. - /* Obtendo somente as transações dos nós possuem as credibilidades calculadas pelo algoritmo KMeans. */ - List evaluationTransactionsOfNodesWithHighestCredibilities = evaluationTransactions - .stream() - .filter(nodeEvaluation -> - nodesWithHighestCredibilities - .stream() - .anyMatch(sourceCredibility -> - nodeEvaluation.getSource().equals(sourceCredibility.getSource()) - ) - ) - .collect(Collectors.toList()); + /** + * Calculando a reputação a partir da nota de serviço e das credibilidades mais recentes dos nós avaliadores. + */ - /* Calculando a reputação a partir da nota de serviço e das credibilidades mais recentes dos nós avaliadores. */ - temp = - evaluationTransactionsOfNodesWithHighestCredibilities + /* Caso utilize a credibilidade para o cálculo da reputação. */ + if (useCredibility) { + /* Obtendo somente as transações dos nós possuem as credibilidades calculadas pelo algoritmo KMeans. */ + List evaluationTransactionsOfNodesWithHighestCredibilities = evaluationTransactions .stream() - .flatMapToDouble(nodeEvaluation -> + .filter(nodeEvaluation -> nodesWithHighestCredibilities .stream() - .filter(sourceCredibility -> + .anyMatch(sourceCredibility -> nodeEvaluation .getSource() .equals(sourceCredibility.getSource()) ) - .mapToDouble(sourceCredibility -> - sourceCredibility.getCredibility() * - ((Evaluation) nodeEvaluation).getServiceEvaluation() - ) ) - .average(); + .collect(Collectors.toList()); + + temp = + evaluationTransactionsOfNodesWithHighestCredibilities + .stream() + .flatMapToDouble(nodeEvaluation -> + nodesWithHighestCredibilities + .stream() + .filter(sourceCredibility -> + nodeEvaluation + .getSource() + .equals(sourceCredibility.getSource()) + ) + .mapToDouble(sourceCredibility -> + sourceCredibility.getCredibility() * + ((Evaluation) nodeEvaluation).getServiceEvaluation() + ) + ) + .average(); + } else { // Caso não precise da credibilidade. + temp = + evaluationTransactions + .stream() + .filter(nodeEvaluation -> + nodesWithHighestCredibilities + .stream() + .anyMatch(sourceCredibility -> + nodeEvaluation + .getSource() + .equals(sourceCredibility.getSource()) + ) + ) + .mapToDouble(nodeEvaluation -> + ((Evaluation) nodeEvaluation).getValue() + ) + .average(); + } } else { // Cálculo da reputação usando a credibilidade no momento da avaliação. /* Calculando a reputação a partir da média das avaliações dos nós calculadas pelo algoritmo KMeans. */ temp =