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 den ausgewählten Knoten eine möglichst große Entfernung hat * * @version 1.0 from 10.12.2020 * @author Thomas Schaller */ public class GraphAlgo_DominatingSetGreedyI extends GraphAlgo_DominatingSetGreedy { // Anfang Attribute public String getBezeichnung() { return "Dominierende Menge (Greedy (i))"; } /** Bestimmt besten Knoten nach Strategie: * ein nicht abgedeckten Knoten, der von den ausgewählten Knoten eine möglichst große Entfernung 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 status = g.getStatus(); g.initialisiereAlleKnoten(); for(Knoten k : g.getAlleKnoten()) { k.setWert(Integer.MAX_VALUE); k.setMarkiert(false); } info("Setze alle Entfernungen auf unendlich"); List toDo = new ArrayList(); for(Knoten start: markierte) { for(Knoten k : g.getAlleKnoten()) { k.setBesucht(false); k.setMarkiert(false); } info("Bestimme Entfernung von Knoten "+g.getKnoteninfo(start,false)+" zu allen anderen Knoten"); start.setBesucht(true); start.setWert(0); toDo.add(start); while(toDo.size()>0) { Knoten k = toDo.remove(0); k.setMarkiert(true); for(Knoten n : g.getNachbarknoten(k)) { if(!n.isBesucht() && n.getIntWert()>k.getIntWert()+1){ n.setWert(k.getIntWert()+1); toDo.add(n); g.getKante(k,n).setMarkiert(true); n.setBesucht(true); } } } info("... und reduziere Entfernung, wenn nötig."); } info("Sortiere Knoten nach Entfernung"); nichtabgedeckte.sort(Comparator.comparing(Knoten::getIntWert).reversed()); Knoten bester = nichtabgedeckte.get(0); bester.setFarbe(5); info("... und nimm den am weitesten entfernten"); step(); g.setStatus(status); return bester; } }