mirror of
https://codeberg.org/qg-info-unterricht/zpg-graphentester.git
synced 2026-03-24 20:48:26 +01:00
70 lines
2.4 KiB
Java
70 lines
2.4 KiB
Java
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 einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat
|
|
*
|
|
* @version 1.0 from 10.12.2020
|
|
* @author Thomas Schaller
|
|
*/
|
|
|
|
public class GraphAlgo_DominatingSetGreedyF extends GraphAlgo_DominatingSetGreedy {
|
|
|
|
// Anfang Attribute
|
|
|
|
public String getBezeichnung() {
|
|
return "Dominierende Menge (Greedy (f))";
|
|
}
|
|
|
|
/** Bestimmt besten Knoten nach Strategie:
|
|
* ein nicht abgedeckten Knoten, der von einem beliebigen schon ausgewählten Knoten die Entfernung 3 hat
|
|
*/
|
|
|
|
protected Knoten bestimmeBesten() {
|
|
Random r= new Random();
|
|
|
|
List<Knoten> markierte = g.getAlleKnoten(k->k.isMarkiert() );
|
|
List<Knoten> nichtabgedeckte = g.getAlleKnoten(k->!k.isMarkiert() && !k.isBesucht() );
|
|
if(markierte.size()==0) return g.getKnoten(r.nextInt(g.getAnzahlKnoten()));
|
|
|
|
List<Knoten> entfernung2 = new ArrayList<Knoten>();
|
|
List<String> status = 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();
|
|
|
|
entfernung2 = g.getAlleKnoten(k->k.getIntWert()==2);
|
|
entfernung2.retainAll(nichtabgedeckte);
|
|
info("Habe "+entfernung2.size()+" noch nicht überdeckte Knoten mit Entfernung 2 gefunden.");
|
|
if(entfernung2.size()>0) break;
|
|
}
|
|
Knoten bester;
|
|
if(entfernung2.size()>0) {
|
|
info("Wähle zufällig einen von diesen");
|
|
bester = entfernung2.get(r.nextInt(entfernung2.size()));
|
|
} else {
|
|
info("Wählen einen zufälligen Knoten aus");
|
|
bester = nichtabgedeckte.get(r.nextInt(nichtabgedeckte.size()));
|
|
}
|
|
bester.setFarbe(5);
|
|
step();
|
|
g.setStatus(status);
|
|
return bester;
|
|
}
|
|
|
|
}
|