Skip to content
Snippets Groups Projects
Commit 6f420b13 authored by LukasEttel's avatar LukasEttel
Browse files

further implementation uf 2-dimentional array

parent 2d316c89
No related branches found
No related tags found
No related merge requests found
......@@ -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
}
......
......@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment