diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/BinaryHeap.java b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/BinaryHeap.java index a544813e6949fdcbf6d665f35b555baa8e115b7a..a9156e409187bf8fb31c8585aa5dc1f281c5f3e1 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/BinaryHeap.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/BinaryHeap.java @@ -4,7 +4,7 @@ import java.util.*; public class BinaryHeap { ArrayList<Double> list = new ArrayList(); - HashMap<Integer, Integer> map = new HashMap<>(); + HashMap<Integer, YoshikoEdge> map = new HashMap<>(); public BinaryHeap(){ list.add(Double.NEGATIVE_INFINITY); @@ -14,7 +14,7 @@ public class BinaryHeap { public void add(YoshikoEdge edge){ list.add(edge.maxIcfIcp); - map.put(list.size()-1, edge.edgeId); + map.put(list.size()-1, edge); checkParent(list.size()-1); } @@ -46,7 +46,7 @@ public class BinaryHeap { } } - public int popMax(){ + public YoshikoEdge popMax(){ double maxVal = Double.NEGATIVE_INFINITY; for (Double i : list){ if (i > maxVal){ @@ -56,7 +56,7 @@ public class BinaryHeap { int index = list.indexOf(maxVal); - int e = map.get(index); + YoshikoEdge e = map.get(index); map.replace(index, map.get(map.size()-1)); map.remove(map.size()-1); @@ -111,13 +111,13 @@ public class BinaryHeap { list.set(index, list.get(parentIndex)); list.set(parentIndex, tmpVal); - int tmpId = map.get(index); + YoshikoEdge tmpEdge = map.get(index); map.replace(index, map.get(parentIndex)); - map.replace(parentIndex, tmpId); + map.replace(parentIndex, tmpEdge); } private int getIndexFromValue(YoshikoEdge edge){ - for (Map.Entry<Integer, Integer> entry : map.entrySet()) { + for (Map.Entry<Integer, YoshikoEdge> entry : map.entrySet()) { if (entry.getKey() == 0){ //Der erste DummyEintrag im Heap soll ignoriert werden } diff --git a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/ClusteringAlgorithm.java b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/ClusteringAlgorithm.java index cca1df2f7be2fc5b0a74dd9750b2702fd82686b8..2b3dc00f7ba47e60d1eb139703ad9fde4bc948da 100644 --- a/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/ClusteringAlgorithm.java +++ b/src/main/java/de/hhu/ba/yoshikoWrapper/yoshikoAlgorithm/ClusteringAlgorithm.java @@ -133,20 +133,20 @@ public class ClusteringAlgorithm { private void workHeap(){ while (bHeap.size() > 0){ System.out.println(bHeap.size()); - int edgeId = bHeap.popMax(); - YoshikoEdge e = getEdge(edgeId); + YoshikoEdge e= bHeap.popMax(); + if (e.icf >= e.icp){ if(e.weight < 0){ clusteringCost -= e.weight; } - //makeEdgePermanent(e); + makeEdgePermanent(e); } else{ if(e.weight > 0){ clusteringCost +=e.weight; } - makeEdgeForbidden(e); + //makeEdgeForbidden(e); } } } @@ -157,8 +157,15 @@ public class ClusteringAlgorithm { return edgeArray[u][v]; } - /* - private void makeEdgePermanent(MyDefaultWeightedEdge e){ + + private YoshikoEdge getEdge(int u, int v){ + if (u > v){ + return edgeArray[u][v]; + } + return edgeArray[v][u]; + } + + private void makeEdgePermanent(YoshikoEdge e){ substactInfluenceOfVerticesOnIcfIcp(e); MyVertex mergedVertex = mergeVertexes(e); @@ -169,6 +176,13 @@ public class ClusteringAlgorithm { System.out.println("perm"); } + private void mergeVertexes(YoshikoEdge e){ + e.weight = Double.POSITIVE_INFINITY; + + + } + + /* private MyVertex mergeVertexes(MyDefaultWeightedEdge e){ MyVertex p1 = g.getEdgeSource(e); @@ -218,61 +232,56 @@ public class ClusteringAlgorithm { bHeap.add(edge); } - } + }*/ - private void substactInfluenceOfVerticesOnIcfIcp(MyDefaultWeightedEdge e){ - MyVertex p1 = g.getEdgeSource(e); - MyVertex p2 = g.getEdgeTarget(e); + private void substactInfluenceOfVerticesOnIcfIcp(YoshikoEdge e){ + int p1 = e.source; + int p2 = e.target; - Set<MyDefaultWeightedEdge> edgeSet = g.edgeSet(); - for (MyDefaultWeightedEdge edge : edgeSet){ - MyVertex v1 = g.getEdgeSource(edge); - MyVertex v2 = g.getEdgeTarget(edge); + for (YoshikoEdge edge : bHeap.map.values()){ + int v1 = edge.source; + int v2 = edge.target; - if (v1.equals(p1)||v1.equals(p2)||v2.equals(p1)||v2.equals(p2)){ + if (v1==p1||v1==p2||v2==p1||v2==p2){ continue; } //Subtraiere Einfluss des Dreiecks v1p1v2 auf icf - MyDefaultWeightedEdge ux = g.getEdge(v1, p1); - MyDefaultWeightedEdge vx = g.getEdge(v2, p1); + YoshikoEdge ux = getEdge(v1, p1); + YoshikoEdge vx = getEdge(v2, p1); - if (g.getEdgeWeight(ux) > 0 && g.getEdgeWeight(vx) > 0){ - edge.icf -= Math.min(g.getEdgeWeight(ux), g.getEdgeWeight(vx)); + if (ux.weight > 0 && vx.weight > 0){ + edge.icf -= Math.min(ux.weight, vx.weight); } - //Subtraiere Einfluss des Dreiecks v1p2v2 auf icf - ux = g.getEdge(v1, p2); - vx = g.getEdge(v2, p2); + //Subtraiere Einfluss des Dreiecks v1p1v2 auf icp - if (g.getEdgeWeight(ux) > 0 && g.getEdgeWeight(vx) > 0){ - edge.icf -= Math.min(g.getEdgeWeight(ux), g.getEdgeWeight(vx)); + if (ux.weight > 0 && vx.weight < 0){ + edge.icp -= Math.min(ux.weight, -vx.weight); + }else if (ux.weight < 0 && vx.weight > 0){ + edge.icp -= Math.min(-ux.weight, vx.weight); } - //Subtraiere Einfluss des Dreiecks v1p1v2 auf icp - ux = g.getEdge(v1, p1); - vx = g.getEdge(v2, p1); + //Subtraiere Einfluss des Dreiecks v1p2v2 auf icf + ux = getEdge(v1, p2); + vx = getEdge(v2, p2); - if (g.getEdgeWeight(ux) > 0 && g.getEdgeWeight(vx) < 0){ - edge.icp -= Math.min(g.getEdgeWeight(ux), -g.getEdgeWeight(vx)); - }else if (g.getEdgeWeight(ux) < 0 && g.getEdgeWeight(vx) > 0){ - edge.icp -= Math.min(-g.getEdgeWeight(ux), g.getEdgeWeight(vx)); + if (ux.weight > 0 && vx.weight > 0){ + edge.icf -= Math.min(ux.weight, vx.weight); } //Subtraiere Einfluss des Dreiecks v1p2v2 auf icp - ux = g.getEdge(v1, p2); - vx = g.getEdge(v2, p2); - if (g.getEdgeWeight(ux) > 0 && g.getEdgeWeight(vx) < 0){ - edge.icp -= Math.min(g.getEdgeWeight(ux), -g.getEdgeWeight(vx)); - }else if (g.getEdgeWeight(ux) < 0 && g.getEdgeWeight(vx) > 0){ - edge.icp -= Math.min(-g.getEdgeWeight(ux), g.getEdgeWeight(vx)); + if (ux.weight > 0 && vx.weight < 0){ + edge.icp -= Math.min(ux.weight, -vx.weight); + }else if (ux.weight < 0 && vx.weight > 0){ + edge.icp -= Math.min(-ux.weight, vx.weight); } - edge.maxIcfIcp = Math.max(edge.icf, edge.icf); + edge.maxIcfIcp = Math.max(edge.icf, edge.icp); } } - +/* private void addInfluenceOfVertexOnIcfIcp(MyVertex mergedVertex) { Set<MyDefaultWeightedEdge> edgeSet = g.edgeSet(); @@ -305,6 +314,7 @@ public class ClusteringAlgorithm { } }*/ + /* private void makeEdgeForbidden(MyDefaultWeightedEdge e){ editInfluenzeOfForbiddenEdge(e); @@ -312,7 +322,7 @@ public class ClusteringAlgorithm { g.setEdgeWeight(e, Double.NEGATIVE_INFINITY); bHeap.remove(e); System.out.println("rm"); - } + }*/ /* private void editInfluenzeOfForbiddenEdge(MyDefaultWeightedEdge forbiddenEdge){ MyVertex x1 = g.getEdgeSource(forbiddenEdge);