package algorithmen; import java.util.List; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.nio.file.*; import java.util.Random; import graph.*; /** * Dieser Algorithmus bestimmt die kleinste dominierende Menge in einem Graphen * und bestimmt den Zeitbedarf. * Algorithmus: Greedy mit Strategie: * ein nicht abgedeckten Knoten, der von möglichst vielen schon ausgewählten Knoten die Entfernung 3 hat * * @version 1.0 from 10.12.2020 * @author Thomas Schaller */ public class GraphAlgo_DominatingSetGreedyH extends GraphAlgo_DominatingSetGreedy { // Anfang Attribute public String getBezeichnung() { return "Dominierende Menge (Greedy (h))"; } /** Bestimmt besten Knoten nach Strategie: * ein nicht abgedeckten Knoten, der von möglichst vielen schon ausgewählten Knoten die Entfernung 3 hat */ protected Knoten bestimmeBesten() { Random r = new Random(); List markierte = g.getAlleKnoten(k->k.isMarkiert() ); List nichtabgedeckte = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht() ); if(markierte.size()==0) return g.getKnoten(r.nextInt(g.getAnzahlKnoten())); List entfernung3 = new ArrayList(); List status = g.getStatus(); g.initialisiereAlleKnoten(); List zaehlstatus = g.getStatus(); for(Knoten start: markierte) { info("Bestimme Entfernung von Knoten "+g.getKnoteninfo(start,false)+" zu allen anderen Knoten"); g.initialisiereAlleKnoten(); GraphAlgo moore = new GraphAlgo_Moore(); moore.setGraph(g); moore.setStartKnoten(start); moore.fuehreAlgorithmusAus(); entfernung3 = g.getAlleKnoten(k->k.getIntWert()==3); entfernung3.retainAll(nichtabgedeckte); info("Habe "+entfernung3.size()+" noch nicht überdeckte Knoten mit Entfernung 3 gefunden "); g.setStatus(zaehlstatus); for(Knoten kandidat: entfernung3) { kandidat.setWert(kandidat.getIntWert()+1); } info("... und erhöher die Anzahl bei diesen Knoten"); zaehlstatus= g.getStatus(); } info("Sortiere die Knoten nach der Anzahl der ausgewählten Knoten mit Abstand 3"); nichtabgedeckte.sort(Comparator.comparing(Knoten::getIntWert).reversed()); Knoten bester = nichtabgedeckte.get(0); bester.setFarbe(5); info("Nehme den besten"); step(); g.setStatus(status); return bester; } }