Greedy-Algorithmus

Tina87

Mitglied
Hallo,
habe Probleme meine Hausaufgabe zu lösen.
Erstmal zur Aufgabe:
Professor Midas fährt auf einer Autobahn von Newmark nach Reno. Mit vollem Tank fährt sein Auto genau n Kilometer weit. Zu Beginn der Reise ist sein Auto vollgetankt. Midas möchte so wenige Tankstopps wie möglich machen.
Der Greedy-Algorithmus in eine Java-Methode implementiert werden:
int [] tankstopps (int n, int [] tankstellen, int z), wobei n die Reichweite des Autos ist und im Array tankstellen die Entfernungen der Tankstellen vom Startpunkt angegeben sind (tankstellen == {34,71,90}), z ist die Gesamtstrecke.
Die Methode soll ein Array mit den Nummern der Tankstellen zurückgeben(z.B. {0,2}= 1.und 3. Tabkstelle).

Da es ja Ziel ist, so wenige Stopps wie möglich zu machen, dachte ich, dass ich von hinten anfang zu überprüfen, ob ein Stop an dieser Tankstelle möglich ist.
Problem ist, dass wenn er an einer Tankstelle getankt hat, die Reichweite n neu zu benutzen.
Ach irgendwie schwierig zu erklären;-)
Hier mein bisheriger Lösungsansatz:
Java:
public class Greedy_Algorithmus
{
    public static void main (String [] args) {
        int n = 50;
        int [] tankstellen = {34,71,90};
        int z= 100;
        tankstopps (50, new int[]{34, 71, 90}, 100 );
    }
    static int [] tankstopps (int n, int [] tankstellen, int z) {
        int [] stopps;
        if (n >= z){
            return 0;
        }
        else {
            for (int i= tankstellen.length-1; i>=0; i--) {
                if (tankstellen[i] > n){
                    
                    ....

                }
            }
        }
    }
    return stopps;
}

Wäre nett, wenn mir jemand hilft!
 

KrokoDiehl

Top Contributor
Habt ihr irgendwie Vorgaben das iterativ oder rekursiv zu lösen?

Jedenfalls ist das Vorgehen doch so:
- Solange du noch nicht am Ziel (z > 0) bist und die Reststrecke nicht in deiner Reichweite liegt (z > n)
- fahre zur letzten Tankstelle, die in deiner Reichweite liegt und tanke dort voll
- setze deine Reichweite zurück
- aktualisiere die Reststrecke und die Abstände zu den Tankstellen

Für mich klingt das spontan zumindest nach Rekursion, da man die Strecken immer wieder aktualisieren muss, was mir in der Rekursion leichter erscheint.
 
G

Gast2

Gast
Iterativ geht es auch relativ einfach - allerdings würde ich hier eigentlich auch das ganze eher rekursiv lösen

Java:
        else {
            boolean angekommen = false;
            int gefahren = 0;
            while(!angekommen){
            int bestTankstelle = 0;
            for (int i = 0; i < tankstellen.length; i++) {
                if (tankstellen[i] < n + gefahren){
                   if(tankstellen[i] > bestTankstelle){
                      bestTankstelle = tankstellen[i];
                   }
                }
            }
            System.out.println("Stoppe bei "+bestTankstelle);
            gefahren = bestTankstelle;
            if(gefahren + n >= z ){
                System.out.println("Kein weiterer Stop nötig");
                angekommen = true;
               }
            }
        }

Mal so als Sketch für die Iterative Lösung - musst halt noch zusehn das du dir die Tankstellen Ids wegspeicherst um nachher zurückzugeben wo du gestopt hast...
 
Zuletzt bearbeitet von einem Moderator:

Tina87

Mitglied
Also erstmal danke für eure schnelle Hilfe.
Also ich denke, dass wir es iterativ lösen sollen, weil wir mit Rekursion noch nicht sehr viel gemacht haben.
Die Lösung, die hier iterativ vorgeschlagen wurde, verwirrt mich irgendwie etwas und sie gibt leider auch keinen String mit den Positionen der Tankstopps zurück, sondern bei welchen Km getankt werden soll.
Also mir erscheint es sinnvoll eine for-Schleife zu benutzen, die von hinten anfängt, weil Greedy doch den größmöglichen Gewinn erreichen will. Also wird er doch zuerst die hinterste Tanke testen.
Problem bei mir ist, dass ich mit den ganzen i´s durcheinander komme.
Deshalb hier nochmal meine sicherlich falsche Version:
Java:
public class Test
{
   public static void main (String [] args) {
        int n = 50;
        int [] tankstellen = {34,71,90};
        int z= 100;
        tankstopps (50, new int[]{34, 71, 90}, 100 );
    }
     static int [] tankstopps (int n, int [] tankstellen, int z) {
        int [] stopps={0};
        if (n >= z){
            System.out.println("keine Stopps nötig");
        }
        else {
            for (int i=tankstellen.length-1; i<0;i--) {
                if (tankstellen[i] < n) {
                    stopps[i] = i; 
                    n=tankstellen[i]+n;
                }
            }
           
        }
    } 
    return stopps;
}
 

Final_Striker

Top Contributor
Ne, du musst nicht hinten anfangen. Der Greedy-Algo will in dem Fall mit dem vorhandenen Benzin soweit wie möglich fahren.

Meine Lösung wäre:

Java:
       public static void main (String [] args) {
            int n = 50;
            int [] tankstellen = {34,50,55,71,80,90};
            int z= 100;
            int[] stopps = tankstopps (50, new int[]{5, 12, 34, 51, 71, 83, 90, 120}, 100 );
            
            System.out.println(Arrays.toString(stopps));
        }
         static int [] tankstopps (int n, int [] tankstellen, int z) {
            int [] stopps= new int[tankstellen.length];
            
            int t = 0;
            int rechweite = n;
            
            while(rechweite < z){ // solange Reichweite kleiner als Strecke ist
        	
              // fahre so lange bis Reichweite kleiner als die Position der aktuellen Tankstelle ist
               if(rechweite < tankstellen[t]){ 
        	   
                   stopps[t-1] = 1; // tanke an der letzten Tankstelle
                   rechweite = tankstellen[t-1] + n; // neue Reichweite ist Tankstelle-km + Tankgröße
        	       
               }
        
        	t++;
            }
            
            return stopps;
        }
 
Zuletzt bearbeitet:

Tina87

Mitglied
Muss leider nochmal weiter nerven.
Du wolltest ja jetzt das Array in einen String umwandeln, warum?
Außerdem bin ich noch nicht mit der Ausgabe zufrieden ;-)
Ich will doch die Ausgabe als Array, so dass die Position der Tankstellen angegeben wird.
Wenn man bei der 1. und 3. Tankstelle getankt hat, soll "stopps = {0,2}" sein.
Problematisch ist nur, dass ich bei einem Array ja die Länge vorher schon festlegen muss und hier ja nicht im voraus wissen kann, wieviele stopps es gibt.
So wie ich das jetzt implementiert habe, kommen bei der Ausgabe irgendwelche hieroglyphen raus;(
Java:
public class Test {

    public static void main (String [] args) {
        int n = 50;
        int [] tankstellen = {34,71,90};
        int z= 100;
        System.out.println(tankstopps(50, new int[]{5, 12, 34, 51, 71, 83, 90, 120},100));
    }
        static int [] tankstopps (int n, int [] tankstellen, int z) {
        int [] stopps= new int[tankstellen.length];
        int t = 0;
        int i = 0;
            
        while(n < z){ // solange Reichweite kleiner als Strecke ist
            
            // fahre so lange bis Reichweite kleiner als die Position der aktuellen Tankstelle ist
            if(n < tankstellen[t]){ 
                stopps[t-1] = t-1; // tanke an der letzten Tankstelle
                n = tankstellen[t-1] + n; // neue Reichweite ist Tankstelle-km + Tankgröße 
            }
            t++;
        }
        return stopps;
    }
}
 

Final_Striker

Top Contributor
Ich hab es nur ausgegeben, damit man mal schnell sieht was raus kommt.

Java:
    public static void main(String[] args) {
	int n = 50;
	int[] tankstellen = { 5, 20, 34, 42, 55, 71, 83, 95, 120 };
	int z = 100;
	int[] stopps = tankstopps(50, tankstellen, 100);

	// System.out.println(Arrays.toString(stopps));

	System.out.print("Es wurde an den Tankstellen: ");
	for (int i = 0; i < stopps.length; i++) {
	    if (stopps[i] == 1) {
		   System.out.print(i + ", ");
	    }
	}
	System.out.print("getankt.");
    }

    static int[] tankstopps(int n, int[] tankstellen, int z) {

	int[] stopps = new int[tankstellen.length];
	int t = 0;
	int rechweite = n;

	while (rechweite < z) {

	    if (rechweite < tankstellen[t]) {
		
		rechweite = tankstellen[t - 1] + n;
		stopps[t - 1] = 1;
	    }
	    t++;
	}
	return stopps;
    }

Edit:

An den Stellen im Array wo eine 1 steht wurde getankt. ;-)
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
S [EDIT] Tiefensuche / Depth-First-Search / Greedy Algorithmus Java Basics - Anfänger-Themen 6
I Greedy Methode Methoden nutzen Java Basics - Anfänger-Themen 3
M Greedy-Strategie Java Basics - Anfänger-Themen 3
M Minimal Spanning Tree mit Greedy Java Basics - Anfänger-Themen 2
K Algorithmus entwickeln Java Basics - Anfänger-Themen 1
laxla123 Eigenschaften eines Algorithmus (determiniert vs.. deterministisch) Java Basics - Anfänger-Themen 2
C Gewinnspiel erstellen mit Algorithmus Java Basics - Anfänger-Themen 3
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
H Minimax Algorithmus in Tic Tac Toe Java Basics - Anfänger-Themen 3
M Minimax-Algorithmus für Vier gewinnt Java Basics - Anfänger-Themen 11
ohneInformatik; Trockentest Algorithmus, mathematischen Zusammenhang angeben Java Basics - Anfänger-Themen 3
M Minimax-Algorithmus Java Basics - Anfänger-Themen 17
mervanpolat Binary Search Algorithmus ausführen Java Basics - Anfänger-Themen 1
J Rekursiver Algorithmus Java Basics - Anfänger-Themen 9
M monte carlo Algorithmus für 4 gewinnt Java Basics - Anfänger-Themen 12
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
S Algorithmus entwicklen, der zu einem gegebenen Datum die Jahreszeit ermittelt Java Basics - Anfänger-Themen 13
rosima26 Merge-Algorithmus Java Basics - Anfänger-Themen 53
C Ein Algorithmus soll schneller werden Java Basics - Anfänger-Themen 24
D Dijkstra Algorithmus Hilfe!! Java Basics - Anfänger-Themen 9
U Den Kuchen aufteilen - aber wie? (Rebalancing-Algorithmus) Java Basics - Anfänger-Themen 14
s_1895 Pseudocode Naiver Algorithmus Java Basics - Anfänger-Themen 17
H String verschlüsseln - eigener Algorithmus Java Basics - Anfänger-Themen 104
T Algorithmus für Index mit min-Wert Java Basics - Anfänger-Themen 2
Düsseldorf2002 Testen meines Algorithmus Java Basics - Anfänger-Themen 1
D Primzahlen Rechner nach Eratostenes von Kyrene Algorithmus Java Basics - Anfänger-Themen 2
KogoroMori21 Frage zum Euklidischen Algorithmus Java Basics - Anfänger-Themen 11
S Algorithmus java searchAll IKey Java Basics - Anfänger-Themen 4
S Algorithmus Datensätze einfügen wenn... Java Basics - Anfänger-Themen 26
KogoroMori21 MergeSort Algorithmus Java Basics - Anfänger-Themen 2
KogoroMori21 Textdatei einlesen im Array (Selection Sort Algorithmus) Java Basics - Anfänger-Themen 3
fendix Compiler-Fehler Algorithmus zur Bestimmung von Primzahlen Java Basics - Anfänger-Themen 7
S Algorithmus (reelle Zahl <65536 von dezimal zu dual) max. 10 Nachkommastellen Java Basics - Anfänger-Themen 4
G Algorithmus Graphen Java Basics - Anfänger-Themen 10
D Input/Output fehlerhafter Algorithmus zum Ersetzen von Array-Werten nach logischem Schema Java Basics - Anfänger-Themen 1
N Selection Algorithmus: Methode wird nicht erkannt (BlueJ) Java Basics - Anfänger-Themen 3
U Meinung zum Dijkstra Algorithmus Java Basics - Anfänger-Themen 6
U Dijkstra Algorithmus Laufzeit Java Basics - Anfänger-Themen 3
L Math.exp also eigenen Algorithmus Java Basics - Anfänger-Themen 2
Kirby.exe Algorithmus entwickeln Java Basics - Anfänger-Themen 37
M Algorithmus Max-Heap? Java Basics - Anfänger-Themen 3
I Labyrinth auf der Basis eines rekursiven Algorithmus Java Basics - Anfänger-Themen 27
CptK Best Practice Algorithmus nach jedem Schritt zum Visualisieren pausieren Java Basics - Anfänger-Themen 3
A Algorithmus effizienter machen Java Basics - Anfänger-Themen 1
V Algorithmus zur fortlaufenden Berechnung des duechscjnt Java Basics - Anfänger-Themen 1
M Dijkstra Algorithmus in Graphen auf mehrere verschiedene Knoten anwenden lassen Java Basics - Anfänger-Themen 11
O Labyrinth Algorithmus Java Basics - Anfänger-Themen 3
G Quicksort Algorithmus Java Basics - Anfänger-Themen 12
S Binäre-Suche Algorithmus Java Basics - Anfänger-Themen 1
D Algorithmus in Pseudocode mit log2(n) Operationen erstellen Java Basics - Anfänger-Themen 3
C Laufzeit eines Sortier-Algorithmus ermitteln Java Basics - Anfänger-Themen 4
H aufgabe java luhn algorithmus Java Basics - Anfänger-Themen 10
A Datenstruktur für Savings Algorithmus und Planung von kleinen Programmierprojekten Java Basics - Anfänger-Themen 1
J Algorithmus für eine Reihe implementieren Java Basics - Anfänger-Themen 2
S Dijkstra Algorithmus funktioniert nicht Java Basics - Anfänger-Themen 4
N Denksportaufgabe durch Algorithmus lösen Java Basics - Anfänger-Themen 2
S Problem mit einem rekursivem FloodFill Algorithmus Java Basics - Anfänger-Themen 62
B Algorithmus Square und Multiply Java Basics - Anfänger-Themen 3
J Algorithmus - Strings auf eigene Reihenfolge miteinander vergleichen Java Basics - Anfänger-Themen 4
D Frage Boyer-Moore Algorithmus Java Basics - Anfänger-Themen 7
M Komplexität Algorithmus Java Basics - Anfänger-Themen 8
H Zeichen im algorithmus Java Basics - Anfänger-Themen 4
B Code Verständnisfragen - FLoyd Warshall Algorithmus Java Basics - Anfänger-Themen 1
B Algorithmus zum entmischen einer Zahlenfolge Java Basics - Anfänger-Themen 15
X Minimax-Algorithmus über alle Kanten möglich? - Kanten darstellen Java Basics - Anfänger-Themen 1
T Algorithmus zur Überprüfung eines binären Suchbaums Java Basics - Anfänger-Themen 2
K Best Practice Algorithmus für Berechnung von Zahlenreihenfolge Java Basics - Anfänger-Themen 12
M Simpler Algorithmus läuft extrem langsam. Java Basics - Anfänger-Themen 3
K Erste Schritte Brute Force Algorithmus Java Basics - Anfänger-Themen 2
L Frage zu BubbleSort Algorithmus Java Basics - Anfänger-Themen 2
B gibt es ein Stundenplan-Algorithmus? Java Basics - Anfänger-Themen 11
O Algorithmus-Problem Java Basics - Anfänger-Themen 5
P Euklidischer Algorithmus Java Basics - Anfänger-Themen 9
L Greates Commong Dividend - euklidischer Algorithmus, modulos not positive Java Basics - Anfänger-Themen 5
J Euklidischer Algorithmus Java Basics - Anfänger-Themen 1
S Quicksort Algorithmus Java Basics - Anfänger-Themen 2
S GraphNode --- Dijkstra Algorithmus : NullPointerException Java Basics - Anfänger-Themen 1
B Rekursive Algorithmus schreiben Java Basics - Anfänger-Themen 8
V Algorithmus in einer Methode ausführen Java Basics - Anfänger-Themen 3
M Implementierung des Knuth-Morris-Pratt-Algorithmus Java Basics - Anfänger-Themen 0
M Dijkstras Algorithmus Java Basics - Anfänger-Themen 5
S Zusammenhang Datenstruktur/Algorithmus Java Basics - Anfänger-Themen 1
M Simulation - Algorithmus Java Basics - Anfänger-Themen 3
F Erste Schritte Hilfe beim Algorithmus finden Java Basics - Anfänger-Themen 8
D Algorithmus für Punkte auf einem Kreis Java Basics - Anfänger-Themen 0
D Algorithmus zu gegebener Laufzeit implementieren Java Basics - Anfänger-Themen 1
B Doppelte Werte aus Array entfernen ohne Import - Algorithmus Java Basics - Anfänger-Themen 5
C Ideen für einen Algorithmus Java Basics - Anfänger-Themen 1
F Best Practice Algorithmus optimieren - Binaeruhr Java Basics - Anfänger-Themen 2
S Euklid Algorithmus zur Berechnung des GGTs Java Basics - Anfänger-Themen 2
L Welcher Algorithmus ist das ? Java Basics - Anfänger-Themen 9
J Rekursiver Horner-Schema-Algorithmus - Verstehe ich ihn richtig? Java Basics - Anfänger-Themen 2
O Java Zufalls-Verteil-Algorithmus Java Basics - Anfänger-Themen 3
P ganz simpler algorithmus Java Basics - Anfänger-Themen 3
C Sortieren ohne Algorithmus Java Basics - Anfänger-Themen 8
J Algorithmus: Grad von floating zu Grad/Minute/Sekunde Java Basics - Anfänger-Themen 3
A Text Verschriebung/Algorithmus(?) Java Basics - Anfänger-Themen 8
R Rekursionsformel für Laufzeit von Algorithmus Java Basics - Anfänger-Themen 3
E Algorithmus für kart. Produkt: als int [] Feld repräsentiert Java Basics - Anfänger-Themen 10
U Peterson Algorithmus Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben