diff --git a/common/src/main/java/org/astraea/common/cost/HasClusterCost.java b/common/src/main/java/org/astraea/common/cost/HasClusterCost.java index b916637f04..9067e14e41 100644 --- a/common/src/main/java/org/astraea/common/cost/HasClusterCost.java +++ b/common/src/main/java/org/astraea/common/cost/HasClusterCost.java @@ -52,9 +52,10 @@ public ClusterCost clusterCost(ClusterInfo clusterInfo, ClusterBean clusterBean) Collectors.toUnmodifiableMap( Map.Entry::getKey, e -> e.getKey().clusterCost(clusterInfo, clusterBean).value())); + var totalWeight = costAndWeight.values().stream().mapToDouble(x -> x).sum(); var compositeScore = costAndWeight.keySet().stream() - .mapToDouble(cost -> costAndWeight.get(cost) * scores.get(cost)) + .mapToDouble(cost -> scores.get(cost) * costAndWeight.get(cost) / totalWeight) .sum(); return new ClusterCost() { diff --git a/common/src/test/java/org/astraea/common/cost/ClusterCostTest.java b/common/src/test/java/org/astraea/common/cost/ClusterCostTest.java index b7c661907d..eb6df1f517 100644 --- a/common/src/test/java/org/astraea/common/cost/ClusterCostTest.java +++ b/common/src/test/java/org/astraea/common/cost/ClusterCostTest.java @@ -45,7 +45,7 @@ void testMerge() { HasClusterCost cost2 = (c, b) -> () -> 0.8; var merged = HasClusterCost.of(Map.of(cost0, 1D, cost1, 2D, cost2, 2D)); var result = merged.clusterCost(null, null).value(); - Assertions.assertEquals(2.8, Math.round(result * 100.0) / 100.0); + Assertions.assertEquals(0.56, Math.round(result * 100.0) / 100.0); } @Test