Obstmarkt für Intellektuelle

Noob26

Mitglied
Hallo Ihr Lieben,

ich benötige eure Hilfe: Die Aufgabe hört sich eigentlich ganz simpel an nur ich noob hab absolut keinen Plan wie ich anfangen soll.

Aufgabenstellung:
1 Apfel + 2 Bananen + 3 Gurken kosten 1400 cent
2 Äpfel + 3 Bananen + 5 Gurken kosten 2300 cent
5 Äpfel + 1 Banane + 1 Gurke kosten 1000 cent
Hinweis: kein Produkt kostet mehr als 500cent!

Schreiben Sie ein Programm, welches Ihnen die Preise eines Apfels, einer Banane und einer Gurke errechnet.

ich schätze mal ich benötige int, ne for schleife... aber wie schreib ich das am besten?

ich habe noch keinen fertigen code gebastelt, da ich gerade am anfang bin.

Danke für Eure Unterstützung!
 

flopalko

Bekanntes Mitglied
Ist das genau die Aufgabenstellung? Irgendwie ist diese für mich nicht schlüssig. Entweder löse ich dieses eine Gleichungssystem mit 3 Unbekannten (solltest du in Mathematik schon mal davon gehört haben) oder ich schreibe ein Programm, das hier allgemein 3 Gleichungen als Input erwartet und dieses System dann löst. So ist für mich nicht schlüssig was gefordert ist.
 

Noob26

Mitglied
Ja das mit den Gleichungssystemen hab ich mir auch schon überlegt flopalko. Was wäre der einfachere Ansatz? Was meinst du?
 

flopalko

Bekanntes Mitglied
Kommt eben auf die Aufgabe an: Ist das diese in genauem Wortlaut? In diesem Fall würde ich einfach mit Zettel und Papier das Gleichungssystem lösen und in der Methode beinhart Konstanten zurückgeben, einfach nur um dem Aufgabensteller die Idiotie dieser Aufgabe aufzuzeigen.
Wenn das eben allgemeiner gehalten ist, dass du z.B. für ein übergebenes Gleichungssystem (kann als Input beispielsweise in einem 2D-Array (Matrix) daherkommen) die Lösung zurückgeben sollst, dann wirst du eben dies implementieren müssen.

EDIT: wenn du natürlich was dabei lernen willst, wäre das Letztere sowieso besser. Allerdings ist eben unklar, ob es einen Input gibt oder nicht. Wenn nicht, kannst du natürlich trotzdem eine allgemeine Methode schreiben und dann eine Methode, die diese dann mit entsprechenden Parametern aufruft.
 

M.L.

Top Contributor
1 Apfel + 2 Bananen + 3 Gurken kosten 1400 cent
2 Äpfel + 3 Bananen + 5 Gurken kosten 2300 cent
5 Äpfel + 1 Banane + 1 Gurke kosten 1000 cent
Hinweis: kein Produkt kostet mehr als 500cent!
Rein mathematisch könnte das passen:
1A + 2B +3G = 1400
2A + 3B +5G = 2300
5A + 1B +1G = 1000
A,B,G <= 500
Muss man das mit regulären Java-Bordmitteln bearbeiten oder darf man Fremdbibliotheken benutzen ? Siehe zB. die Vorschläge JAMA oder Commons Math von https://stackoverflow.com/questions/1431885/how-to-solve-equations-with-java
Und als Kontrolle kann man WolframAlpha rechnen lassen: https://www.wolframalpha.com/input/?i=1x+2y+3z=1400,+2x+3y+5z=2300,5x+1y+1z=1000
 

JCODA

Top Contributor
Die Reaktion des OP und der Hinweis Hinweis: kein Produkt kostet mehr als 500cent!
Lassen mich vermuten, dass 3 geschachtelte for-schleifen gefordert sind mit einer If-Abfrage, um die Gleichheit zu testen. Hierbei nehme ich ganz unverschämt an, dass die Lösung ganzzahlig ist. Natürlich wäre das "richtige" Lösen des LGS interessanter, aber ich schätze, dass diese Aufgabe eine für Einsteiger sein soll.
 

flopalko

Bekanntes Mitglied
Kommt in Mathe in der Grundschule in der ersten oder zweiten Klasse dran. Echt alles Idioten
Ich meine nicht, dass das Lösen von LGS idiotisch ist, sondern, dass die Aufgabe so keinen Sinn ergibt. Entweder soll man allgemein LGS lösen können oder die Aufgabe reduziert sich auf das Lösen der Gleichung und das returnen von Konstanten im Programm. So wie die Aufgabe oben gestellt ist ergibt es einfach keinen Sinn dafür ein Programm zu schreiben.
 
Zuletzt bearbeitet:

Blender3D

Top Contributor
@flopalko ich stimme Dir zu. Eine konstante Aufgabe zu lösen mach als Programm nicht wirklich viel Sinn.
Außerdem ist der Hinweis hier völlig überflüssig.
1 Apfel + 2 Bananen + 3 Gurken kosten 1400 cent
2 Äpfel + 3 Bananen + 5 Gurken kosten 2300 cent
5 Äpfel + 1 Banane + 1 Gurke kosten 1000 cent
Hinweis: kein Produkt kostet mehr als 500cent!


Ein Gleichungssystem kann man in Matrixform so formulieren.
A * x = b
wobei A eine Matrix ist und x und b sind Spaltenvektoren.
Lösungsmöglichkeiten sind. { keine , eine, unendlich viele } Lösung(en).
Die Matrix A wäre in diesem Beispiel:
1, 2, 4
2, 3, 5
5, 1, 1
Der Vektor b
1400
2300
1000

Da die Spalten- oder Zeilenvektoren linear unabhängig sind --> es gibt ein Inverse Matrix zu A ( A' )
A'
-0.4, 0.2, 0.2
4.6, -2.8, 0.2
-2.6, 1.8, -0.2
also gibt es hier genau eine Lösung.
x= A' * b daraus folgt.
x = 100
y = 200
z = 300

Es stimmt zwar, dass die Kosten der Produkte < 500 sind. Für die Lösung der Problems ist das aber überflüssig.
3 linear unabhängige Gleichungen, 3 Unbekannte also genau eine Lösung.
;)
 
X

Xyz1

Gast
Dieser Punkt geht eindeutig an @Blender3D .... Und man könnte alle Komponenten noch durch 100 teilen, um etwas vernünftige Werte zu erhalten. Dann kosten die Obste nämlich 1, 2 und 3 Euro oder DM oder Pfund oder oder Dollar oder oder :D

Es muss nur noch von dem TE in ein Programm gemeißelt werden...
Aus Erfahrung kann ich aber sagen, dass auch wenn nicht Beispiel dransteht nicht einfach 1,2,3 zurückgegeben werden soll...
 

Noob26

Mitglied
Danke mal an alle für die Hilfe. Habe da etwas versucht könnt ihr mal einen Blick drüber werden und haha @mihe7 das stimmt ich kauf dort auch nicht ein hehe

Code:
public static void main(String[] args) {
        // TODO Auto-generated method stub

        
//        for (int 1A + 2B + 3G = 1400);
//                for (int 2A + 3B + 5G = 2300);
//                        for (int 5A + 1B + 1G);
//                               
//                                A + B + G <= 500
//           
    for (int apfel = 0; apfel <= 500; apfel++) {
        for(int banane = 0 ; banane <= 500; banane++) {
            for(int gurke = 0; gurke <= 500; gurke++) {
                
                if((1*apfel+2*banane+3*gurke == 1400) && (2*apfel+3*banane+5*gurke == 2300) && (5*apfel+1*banane+1*gurke == 1000)) {
                    System.out.println("Apfel: " + apfel + " Banane: " + banane + " Gurke: " + gurke);
                    
                    }
                }
            }
        }
    }
}
 
X

Xyz1

Gast
@Noob26 Wieso reduzierst Du Deine Schleifendurchläufe denn nicht auf ein Hundertstel, wie ich es geschrieben habe? :confused: Immer diese Kritikresistenten hier.
 
K

kneitzel

Gast
@Noob26 Wieso reduzierst Du Deine Schleifendurchläufe denn nicht auf ein Hundertstel, wie ich es geschrieben habe? :confused: Immer diese Kritikresistenten hier.
Was genau willst du denn optimieren?
Einfach nur die vollen 100er zu nehmen würde hier gut gehen, aber das ist Zufall.

Ändern wir die Aufgabe etwas:
1a + 2b + 3g = 1700
2a + 3b + 5g = 2300
5a + 1b + 2g = 1000
Und alles wieder <= 500

100er Schritte werden da jetzt keine Lösung finden.
(a=150, b=250, c=350 wäre hier die Lösung)
 

Blender3D

Top Contributor
Habe da etwas versucht könnt ihr mal einen Blick drüber
Ist für die Brutforce Methode richtig. Kritikpunkt wäre noch, dass nachdem die Lösung gefunden wurde die Schleifen unnötigerweise weiterlaufen.
Hier Deine Lösung etwas besser strukturiert und mit Abbruch sobald die Lösung gefunden wurde.

Java:
        ...
            
        int[] solution = getSolution();
        for (int i : solution)
            System.out.println(i);
    }

    public static int[] getSolution() {
        for (int a = 0; a <= 500; a++) {
            for (int b = 0; b <= 500; b++) {
                for (int g = 0; g <= 500; g++) {
                    if (isSolution(a, b, g)) {
                        return new int[] { a, b, g };
                    }
                }
            }
        }
        return null;
    }

    public static boolean isSolution(int a, int b, int g) {
        return (a + 2 * b + 3 * g == 1400) && (2 * a + 3 * b + 5 * g == 2300) && (5 * a + 1 * b + g == 1000);
    }
 
X

Xyz1

Gast
@kneitzel durch 100 oder 10 zu teilen ist schon sinnvoll....
Ich hatte etwas mit dynamischer Programmierung probiert, aber das ist hierbei ga nicht sinnvoll. :rolleyes: Oder ich habe etwas entdeckt was noch keiner entdeckt hat, aber das halte ich für sehr sehr unwahrscheinlich. :D
 
K

kneitzel

Gast
@kneitzel durch 100 oder 10 zu teilen ist schon sinnvoll....
Genau das sehe ich nicht. Zumindest nicht ohne weitere Checks. Selbst wenn du nur 10er Schritte nimmst, dann baue ich dir ein Beispiel mit einem Ergebnis, bei dem eine Zahl hinten eine 5 hat oder so.

Der experimentelle Ansatz benötigt hier schon die vollen Schritte. Die einzige Optimierung wäre evtl, dass man die Schleife abbricht, wenn man bereits zu hoch ist bei einer Berechnung, denn durch weiteres Erhöhen in der Schleife wird es ja nur noch größer ....
Die Optimierung für diese Aufgabe ist wie die Aufgabe selbst konstant.
Java:
public static int[] getSolution() {
       return new int[] { 100, 200, 300 };
}
:p
Das war ja nie in Zweifel gezogen und war ja schon längst im Thread gesagt.
Aber das ändert ja nichts an der Tatsache, dass die vorgeschlagene Optimierung entweder falsch ist oder nicht ausreichend gut beschrieben, denn ich habe dann diese bisher falsch verstanden....
 

Blender3D

Top Contributor
Das war ja nie in Zweifel gezogen und war ja schon längst im Thread gesagt.
Aber das ändert ja nichts an der Tatsache, dass die vorgeschlagene Optimierung entweder falsch ist oder nicht ausreichend gut beschrieben, denn ich habe dann diese bisher falsch verstanden....
Dem habe ich ja nicht widersprochen. Wenn Du genau hinsiehst, wirst Du feststellen, dass Du für Deine Bemerkung von mir ein Like erhalten hattest. Meine Anmerkung dazu war nur wenn schon Optimierung dann gleich eine konstante, da das Programm ja keine Eingabedaten erwartet. ;) (dir geht's wie Sheldon bei Big Bang Sarkasmus oder nicht ?)
 
K

kneitzel

Gast
Also Bitte Bang Theory kenne ich nicht (außer hin und wieder was man an Werbung mitbekommt). Wie geht es denn Sheldon bei Sarkasmus?
 
X

Xyz1

Gast
@kneitzel hier nicht optimieren zu wollen ist blöd... Es kann klar gesagt werden, wann verlustlos durch 10, 100 usw geteilt werden kann...

@Blender3D Sheldon hätte noch Fragen müssen, wem gegenüber der Sarkasmus gilt...

aber ich denke ihr möchtet mich gar nicht verstehen.
 
K

kneitzel

Gast
@kneitzel hier nicht optimieren zu wollen ist blöd... Es kann klar gesagt werden, wann verlustlos durch 10, 100 usw geteilt werden kann...

@Blender3D Sheldon hätte noch Fragen müssen, wem gegenüber der Sarkasmus gilt...

aber ich denke ihr möchtet mich gar nicht verstehen.
Wenn ich Dich nicht verstehen wollte, dann würde ich nicht fragen.

Und woran erkennst Du, durch was Du teilen kannst? Das will ich eben wissen / verstehen. Das ist eben.nicht ganz so trivial meine ich.
 
K

kneitzel

Gast
Wenn ich Dich nicht verstehen wollte, dann würde ich nicht fragen.

Und woran erkennst Du, durch was Du teilen kannst? Das will ich eben wissen / verstehen. Das ist eben.nicht ganz so trivial meine ich.
Also das mit dem trivial ziehe ich zurück, natürlich ist es trivial:
Lösen des Gleichungssystems und dann den größten gemeinsamen Teiler ermitteln.

Aber ich meinte halt, ohne die Aufgabe ansatzweise schon zu lösen.
 

Hutzli

Aktives Mitglied
hier nicht optimieren zu wollen ist blöd... Es kann klar gesagt werden, wann verlustlos durch 10, 100 usw geteilt werden kann...

Es handelt sich ja um Gleichungen, in dem Fall muss was auf der einen Seite getan wird auch auf der anderen erfolgen:
a = b
<=> a/100 = b/100
Somit wäre folgendes falsch:
A + 2B + 3G = 1400
<=> A + 2B + 3G = 14
Hingegen folgendes richtig:
A + 2B + 3G = 1400
<=> A/100 + 2B/100 + 3G/100 = 14

Was aus meiner Sicht in dem Fall jedoch keine Optimierung darstellt

Oder liege ich jetzt daneben? ;)
 

JCODA

Top Contributor
Es handelt sich ja um Gleichungen, in dem Fall muss was auf der einen Seite getan wird auch auf der anderen erfolgen:
a = b
<=> a/100 = b/100
Somit wäre folgendes falsch:
A + 2B + 3G = 1400
<=> A + 2B + 3G = 14
Hingegen folgendes richtig:
A + 2B + 3G = 1400
<=> A/100 + 2B/100 + 3G/100 = 14

Was aus meiner Sicht in dem Fall jedoch keine Optimierung darstellt

Oder liege ich jetzt daneben? ;)
Es geht um den Brute-Force-Ansatz, welcher alle Möglichkeiten durchprobiert. Dann hätte man nur 5^3 = 125 Möglichkeiten zu überprüfen im Vergleich zu 500^3 = 125000000.
Da aber @Tobias-nrw bisher keine Begründung geliefert hat, warum man diese Annahme treffen kann, ohne die Lösung zu kennen, glaub ich nicht das da noch was kommt. :D
Desweiteren muss man bei dieser "Optimierung" aufpassen, da man an dieser Stelle die Interger-Arithmetik verlässt und mit 'ungenauer' Gleitkomma-Arithmetik arbeitet.

@kneitzel : Eine kleine Vereinfachung, die man vielleicht "sehen" kann, könnte so aussehen:

Untersuche, welche Variable gerade oder ungerade sein kann:
Die letzte Gleichung 5A+B+C = 1000 mod 2 => A+B+C = 0 mod 2, d.h. entweder alle drei sind gerade oder genau eine ist gerade und die anderen beiden ungerade.
Betrachte den zweiten Fall, dann gibt es die Möglichkeiten: (A,B ungerade, C gerade) oder (A,C ungerade, B gerade) oder (B,C ungerade, A gerade)
1. Möglichkeit: Wegen der ersten Gleichung ist diese Möglichkeit ausgeschlossen, da 1*1 + 2*1 + 3*0 = 1 != 0 mod 2
2. Möglichkeit: Wegen der zweiten Gleichung ist diese Möglichkeit ausgeschlossen, da 2*1+3*0+5*1 = 1 != 0 mod 2
3. Möglichkeit: Wegen der ersten Gleichung ist diese Möglichkeit ausgeschlossen, da 1*0+2*1+3*1 = 1 != 0 mod 2

Also folgt: Der zweite Fall kann nicht vorkommen, somit müssen nur gerade A,B und C getestet werden.

Letztlich habe ich gerade das Gleichungssystem im Körper F_2 gelöst, deshalb ist das nicht wirklich ein "schnellerer" Weg. Man wohl auch gleich das komplette System mit Gauß/LR-Zerlegung lösen können :D. (Dennoch: Mit diesem Wissen muss man nur noch 250^3 = 15625000 Belegungen von A,B,C testen, das ist nur ein Achtel aller Möglichkeiten. )
 
K

kneitzel

Gast
Es handelt sich ja um Gleichungen, in dem Fall muss was auf der einen Seite getan wird auch auf der anderen erfolgen:
a = b
<=> a/100 = b/100
Somit wäre folgendes falsch:
A + 2B + 3G = 1400
<=> A + 2B + 3G = 14
Hingegen folgendes richtig:
A + 2B + 3G = 1400
<=> A/100 + 2B/100 + 3G/100 = 14

Was aus meiner Sicht in dem Fall jedoch keine Optimierung darstellt

Oder liege ich jetzt daneben? ;)
Du liegst genau richtig. Du kannst gerne a/100 durch a' und b/100 durch b' und g/100 durch g' ersetzen, so dass du
a' + 2b' + 3g' = 14 erhälst.

Dies ist aber keine Optimierung, denn was nicht explizit gesagt wurde ist:
Bei a, b und g handelt es sich um positive, ganze Zahlen, d.h. Schrittweite 1 ist richtig.
a', b' und g' sind jetzt natürlich keine positiven, ganze Zahlen mehr. Und aus der oben angegebenen Formel wird deutlich: Hier muss die Schrittweite dann 0,01 sein.
 
X

Xyz1

Gast
Da aber @Tobias-nrw bisher keine Begründung geliefert hat, warum man diese Annahme treffen kann, ohne die Lösung zu kennen, glaub ich nicht das da noch was kommt
Als Begründung sollte das Verfahren langen....
Java:
public class Obste {
    int[] rechne(int[][] cents) {
        int n1 = cents.length;
        int n2 = cents[0].length;
        int[] i = new int[n1];
        for (int j = 0;;) {
            boolean[] a = new boolean[n1];
            for (int k = 0; k < n1; k++) {
                int l = 0;
                for (int m = 0; m < n1; m++) {
                    l = l + cents[k][m] * i[m];
                }
                a[k] = l == cents[k][n1];
            }
            boolean c = true;
            for (boolean b : a) {
                c = c && b;
            }
            if (c) {
                return i;
            }
            i[j]++;
            j++;
            if (j == n1) {
                j--;
                while (i[j] == 500) {
                    i[j] = 0;
                    j--;
                }
            }
        }
    }
    public static void main(String[] args) {
        Obste o = new Obste();

        int[] rechne = o.rechne(new int[][]{{1, 2, 3, 1400}, {2, 3, 5, 2300}, {5, 1, 1, 1000}});
        for (int i = 0; i < rechne.length; i++) {
            System.out.println((i + 1) + ". kostet " + rechne[i]);
        }

        rechne = o.rechne(new int[][]{{1, 2, 3, 140}, {2, 3, 5, 230}, {5, 1, 1, 100}});
        for (int i = 0; i < rechne.length; i++) {
            System.out.println((i + 1) + ". kostet " + rechne[i]);
        }

        rechne = o.rechne(new int[][]{{1, 2, 3, 14}, {2, 3, 5, 23}, {5, 1, 1, 10}});
        for (int i = 0; i < rechne.length; i++) {
            System.out.println((i + 1) + ". kostet " + rechne[i]);
        }
    }
}


Am ergebnis sieht man dann das es stimmt. (n2 braucht man in dem Fall net)
 
K

kneitzel

Gast
Es geht um den Brute-Force-Ansatz, welcher alle Möglichkeiten durchprobiert. Dann hätte man nur 5^3 = 125 Möglichkeiten zu überprüfen im Vergleich zu 500^3 = 125000000.
Da aber @Tobias-nrw bisher keine Begründung geliefert hat, warum man diese Annahme treffen kann, ohne die Lösung zu kennen, glaub ich nicht das da noch was kommt. :D
Desweiteren muss man bei dieser "Optimierung" aufpassen, da man an dieser Stelle die Interger-Arithmetik verlässt und mit 'ungenauer' Gleitkomma-Arithmetik arbeitet.

@kneitzel : Eine kleine Vereinfachung, die man vielleicht "sehen" kann, könnte so aussehen:

Untersuche, welche Variable gerade oder ungerade sein kann:
Die letzte Gleichung 5A+B+C = 1000 mod 2 => A+B+C = 0 mod 2, d.h. entweder alle drei sind gerade oder genau eine ist gerade und die anderen beiden ungerade.
Betrachte den zweiten Fall, dann gibt es die Möglichkeiten: (A,B ungerade, C gerade) oder (A,C ungerade, B gerade) oder (B,C ungerade, A gerade)
1. Möglichkeit: Wegen der ersten Gleichung ist diese Möglichkeit ausgeschlossen, da 1*1 + 2*1 + 3*0 = 1 != 0 mod 2
2. Möglichkeit: Wegen der zweiten Gleichung ist diese Möglichkeit ausgeschlossen, da 2*1+3*0+5*1 = 1 != 0 mod 2
3. Möglichkeit: Wegen der ersten Gleichung ist diese Möglichkeit ausgeschlossen, da 1*0+2*1+3*1 = 1 != 0 mod 2

Also folgt: Der zweite Fall kann nicht vorkommen, somit müssen nur gerade A,B und C getestet werden.

Letztlich habe ich gerade das Gleichungssystem im Körper F_2 gelöst, deshalb ist das nicht wirklich ein "schnellerer" Weg. Man wohl auch gleich das komplette System mit Gauß/LR-Zerlegung lösen können :D. (Dennoch: Mit diesem Wissen muss man nur noch 250^3 = 15625000 Belegungen von A,B,C testen, das ist nur ein Achtel aller Möglichkeiten. )
Nunja, da die Schrittweite natürlich auch angepasst werden muss, ist das natürlich erst einmal nicht wirklich interessant und die Schrittanzahl würde konstant bleiben.

Ich habe über diese Thematik viel nachgedacht und Dein Ansatz mit dem gerade ist mir auch durch den Kopf gegangen.

Man kann ja a, b und g durch a'*x, b'*x und g'*x ersetzen mit der Annahme, dass a',b', g' und x ganze, positive Zahlen sind. Dann würde man erhalten:
a'x + 2 b'x + 3 g'x = 1400
(a' + 2b' + 3g') *x = 1400
a' + 2b' +3g' = 1400 / x

Das Geiche dann auch noch für die anderen Gleichungen, so dass man dann am Ende 3 Gleichungen mit 4 Unbekannten hat.
Die kann man aber dann umformen und schauen, ob man hier auf Anhieb x finden kann. Das mit dem Gerade / Ungerade ist nicht schlecht. Das geht aber auch nur, weil die Zahlen ein vielfaches von 100 sind und damit die 100 als Teiler sich förmlich aufzwängt.

Aber: Um ein x zu verifizieren benötigt man unter dem Strich auch wieder die Lösung. Und durch das Gleichungssystem mit den 4 Unbekannten wird auch direkt deutlich: Diese Brute Force Optimierung mag mathematisch interessant sein, aber für die Praxis hat diese keine Relevanz.

Die einzige Optimierung, die ich machen würde (Wenn die Gleichungen abgewandelt sein dürften):
- ich würde die Gleichung so umstellen (a, b, g ggf. vertauschen), so dass die innere Schleife die Betragsmäßig größte Zahl hat. (Wäre hier g, denn da ist die 5 der höchste Faktor)
- Ich würde die innere Schleife bei positiven Faktor (ist hier ja gegeben) von 0...500 laufen lassen. Ansonsten von 500...0.
- Ich würde die Formeln separat prüfen. Alle Formeln mit dem notwendigen Vorzeichen bilden ein Abbruchkriterium:
Bei uns ist dies bei allen Formeln gegeben, denn alle Faktoren sind positiv. Wenn also bei Prüfung in der Schleife das Ergebnis schon zu hoch ist, dann muss ich nicht weiter hoch zählen! Also z.B. a = 1, b=1 g = 466:
1 + 2*1 + 3*466 = 1401 -> größer als 1400. Es macht hier keinen Sinn mehr, 467, 468, ... zu prüfen ...
 
K

kneitzel

Gast
Als Begründung sollte das Verfahren langen....

Also ich will Dir nicht zu nahe treten, aber ich verstehe diesen Code nicht auf Anhieb. Evtl. wird der Code verständlicher, wenn Du alle Variablen durch UUIDs ersetzt ... dann sind sie länger als 1 Zeichen und damit doch bestimmt besser verständlich ....

Deine Optimierung hatte ich so verstanden, dass Du die Schrittgröße angepasst haben wolltest (statt 1 eben 100). Dies wäre in dem Beispiel ok gewesen, aber woran hast Du es erkannt?

An den Ergebnissen (jeweils durch 100 teilbar) kann man es nicht erkennen, wie ich durch ein alternatives Beispiel gezeigt habe.

Das ist die eigentliche Frage. Dein neues Verfahren macht irgendwas, was sehe ich nicht auf Anhieb. Aber ich habe nicht vor, einen sehr Kryptisch geschriebenen Code verstehen zu wollen nur um dann zu rätseln, was das bezüglich Deiner Aussage zur notwendigen Schrittweite besagen soll.
 
K

kneitzel

Gast
Na dann lass es, niemand zwingt Dich meinen Code zu verstehen :)
Natürlich nicht, aber dennoch interessiert mich, was für eine Optimierung Du gesehen hast. Wie willst Du die Schrittweite optimieren? Wie erkennst Du, auf was Du optimieren willst/kannst? Denn Deine Aussage war ja: "Wieso reduzierst Du Deine Schleifendurchläufe denn nicht auf ein Hundertstel, wie ich es geschrieben habe?"
Klar, aus den Ergebnissen kann man das ablesen - das habe ich ja auch schon ausführlich erläutert. Nur eben geht es ja darum, dass man die Ergebnisse per brute force ermitteln will.

Machen wir es allgemeiner. Es gilt:
e11 * a + e21 * b * e31 * g = e41
e13 * a + e22 * b * e32 * g = e42
e13 * a + e23 * b * e33 * g = e43

Also die eXX Werte werden eingegeben bei Programmstart und es sollen mögliche Preise für Äpfel (a), Birnen (b) und Grapefruit (g) ermittelt werden über einen Brute Force Algorithmus.
e1X sind dabei die Anzahl der Äpfel
e2X sind dabei die Anzahl der Birnen
e3X sind dabei die Anzahl der Grapefruit
e4X ist dabei der Gesamtpreis in Cent.

Es wird noch gp eingegeben - der maximale Preis von den Obstsorten in Cent. Und natürlich kostet jedes Obststück einen Betrag in Cent ohne Nachkommastellen (Also nicht wie z.B. bei Benzin wo noch 1/10 Cent im Preis angegeben sind.

Wo und wie kommt hier Deine Optimierung der Schrittweite? Wenn Du hier einen einfachen Ansatz sehen solltest, dann würde mich das interessieren. (Ohne die Gleichungen aufzulösen d.h. ohne im Endeffekt die Ergebnisse zu nutzen. Ansonsten wäre klar: Man kann die Schrittweite auf den größten gemeinsamen Teiler von a, b und c setzen ... e4x muss man nicht mehr prüfen.

Eine Optimierung, die ich sehe: Man kann ggf. den GGT von e11 - e33 ermitteln. Dann hätte man das als Schrittweite....
 
X

Xyz1

Gast
Ich war noch nicht so weit die Schrittweite im brute force zu optimieren, aber wenn man so will könnte man mit zum Besenstiel 10_000, 1_000 usw. usf anfangen, bis man keine 0-Werte erhält. Der geringere Mehraufwand (es gibt ein paar mehr Schleifendurchläufe) wäre dabei zu vernachlässigen, imo. Brute force um brute force herum so zu sagen.
 
X

Xyz1

Gast
Naja man darf aber nicht vergessen, das es hier um das Lösen eines simplen LGS' geht... Dafür gibt es Verfahren >en masse<... Und alle Verfahren mit 0-Aufwand sind in jedem Fall den Verfahren des kubischen Aufwands vorzuziehen. Sprich Äpfel != Birnen, Äpfel != Grapefruits und Birnen != Gräpefruits... Im übertragenen Sinne ist es schwer ein totes Pferd zu reiten. :rolleyes:
 

Blender3D

Top Contributor
Im übertragenen Sinne ist es schwer ein totes Pferd zu reiten
Du hast recht! Man könnte hier auch die Metapher "Um des Kaisers Bart streiten." verwenden.
Eine Optimierung für ein in diesem Kontext grundsätzlich zu aufwändiges Verfahren zu suchen macht keinen Sinn.
Wenn man optimieren will dann gleich analytisch.
Für die Brutforce Variante kann man höchstens den von mir erwähnten sofortigen Abbruch bei Erfolg erwähnen. Siehe Post #20
Es ist nämlich ein grundsätzlicher Fehler ein Verfahren ohne Nutzen nach Erfolg weiterlaufen zu lassen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Kerstininer Vererbung Hilfe beim lernen von Objektorientierung für eine Klausur Java Basics - Anfänger-Themen 10
Sniper1000 Java 391 für Windows Java Basics - Anfänger-Themen 37
P Wieso kann ich als Index für einen Array einen Char angeben? Java Basics - Anfänger-Themen 3
benny1993 Java Programm erstellen für ein Fußball-Turnier Java Basics - Anfänger-Themen 3
V Durchschnittliche Volatility in Prozent für 4 Stunden berechnen Java Basics - Anfänger-Themen 14
P Welches SDK für das erstellen einer ausführbaren Datei? Java Basics - Anfänger-Themen 4
C negamax-Algorithmus für Tic-Tac-Toe spielt manchmal falsch Java Basics - Anfänger-Themen 10
D Apache HTTPClient für alle Fälle Java Basics - Anfänger-Themen 41
J Layout Manager, welcher ist der Richtige für mein Program? Java Basics - Anfänger-Themen 1
J Fehlermeldung unverständlich für Jakarta Java Basics - Anfänger-Themen 17
M Minimax-Algorithmus für Vier gewinnt Java Basics - Anfänger-Themen 11
M GUI für Vier-Gewinnt. Java Basics - Anfänger-Themen 4
I JPA Query für mehrere Klassen Java Basics - Anfänger-Themen 3
D Quellcode für cmd funktioniert nicht Java Basics - Anfänger-Themen 9
R Operatoren Rechenoperation in Java verwenden für Calculator Java Basics - Anfänger-Themen 2
R Operatoren Rechenoperation verwenden für Taschenrechner. Java Basics - Anfänger-Themen 32
Ostkreuz Counter für Booleanwerte Java Basics - Anfänger-Themen 8
B Regex Ausdrücke für Monate Java Basics - Anfänger-Themen 7
I BlueJ Queue Frage für Klausur Java Basics - Anfänger-Themen 2
K loop pausieren für eine bestimmte Anzahl? Java Basics - Anfänger-Themen 1
Jxhnny.lpz Randomisier für Buttons Java Basics - Anfänger-Themen 13
W Intuitive interface für Komponenten Java Basics - Anfänger-Themen 4
M "Class<T> clazz" im Constructor - auch für int möglich? Java Basics - Anfänger-Themen 7
B Schrankensystem mit Farberkennung für Flashgame funktioniert nicht wie geplant Java Basics - Anfänger-Themen 4
I Code für Bezahlsystem (auch bei Offline Aktivität) Java Basics - Anfänger-Themen 7
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
M monte carlo Algorithmus für 4 gewinnt Java Basics - Anfänger-Themen 12
frager2345 Java Singleton Muster -> Methode für Konstruktor mit Parametern Java Basics - Anfänger-Themen 3
izoards Sortier Algorithmus für Bounding Box Elememte Links nach Rechts und von Oben nach Unten Java Basics - Anfänger-Themen 33
M generate Methode für Streams Java Basics - Anfänger-Themen 6
I Datenmodell für "Tags" Java Basics - Anfänger-Themen 6
Lion.King for-Kontrollstruktur für Pyramide Java Basics - Anfänger-Themen 8
B Mit Countdown Midnestdauer für Teilaufgabenerledigung erzwingen Java Basics - Anfänger-Themen 8
J File length als Prüfwert für Download Java Basics - Anfänger-Themen 5
K Spieleidee gesucht für Informatikprojekt - JAVA (BlueJ)? Java Basics - Anfänger-Themen 15
P Zähler Variable für mehrere Objekte Java Basics - Anfänger-Themen 6
javamanoman Java für Online Banking Java Basics - Anfänger-Themen 12
NadimArazi Wie kann ich eine collision detection für die Paddles in meinem Pong Programm hinzufügen? Java Basics - Anfänger-Themen 4
JordenJost Java ist auch eine Insel für Anfänger Java Basics - Anfänger-Themen 2
P9cman Tipps für Rekursive Aufgaben mit Strings oder allgemein Java Basics - Anfänger-Themen 2
F Suche nach betreuender Person für eine Jahresarbeit der 12. Klasse. Java Basics - Anfänger-Themen 6
I SQL / JPA Query für StartDate und EndDate Java Basics - Anfänger-Themen 1
T getMethode für ein Array Java Basics - Anfänger-Themen 2
Fats Waller Farben mixen für den Hintergrund ? Java Basics - Anfänger-Themen 1
H Suche jemanden für kleine Uni-Abgabe/ mit Vergütung Java Basics - Anfänger-Themen 1
K Für was braucht man die left und right shift operatoren? Was bringen die, also welchen Zweck haben die? Java Basics - Anfänger-Themen 15
N Api nur für Textdatein (.txt) Java Basics - Anfänger-Themen 2
bluetrix Programmieren eines Bots für Zahlen-Brettspiel Java Basics - Anfänger-Themen 9
M Wie kann eine Methode für ein vorhandenes "Array von char" einen Index-Wert zurückliefern? Java Basics - Anfänger-Themen 3
R Ist Java das Richtige für mich? Java Basics - Anfänger-Themen 4
E Mittelquadratmethode für Hexadezimalzahlen Java Basics - Anfänger-Themen 1
P Einfacher regulärer Ausdruck (RegEx) für E-Mail-Adressen Java Basics - Anfänger-Themen 2
Kiki01 Wie würde eine geeignete Schleife aussehen, die die relative Häufigkeit für jeden Charakter in einem Text bestimmt? Java Basics - Anfänger-Themen 3
N Fehler im Code (Aufgabe für Anfänger) Java Basics - Anfänger-Themen 11
O Wie erstelle ich eine Instanz in einer Klasse für die ich die Instanz will? Java Basics - Anfänger-Themen 4
S BubbleSort für ArrayLists Java Basics - Anfänger-Themen 3
T Übungsbuch für Anfänger Java Basics - Anfänger-Themen 3
L Konzept für Quiz Java Basics - Anfänger-Themen 33
D Methoden Plathhalter für Integer in einer Methode Java Basics - Anfänger-Themen 19
B Datentyp für Einzelnes Objekt oder Liste Java Basics - Anfänger-Themen 9
D Welche GUI Library für eine Client Server Chat App Java Basics - Anfänger-Themen 14
T Algorithmus für Index mit min-Wert Java Basics - Anfänger-Themen 2
Aqtox Hallo ich muss für die Schule ein Wuerfell Duell erstellen jedoch habe ich ein fehler Java Basics - Anfänger-Themen 4
L loop für Namen Java Basics - Anfänger-Themen 11
kxrdelis Konstruktor für ein Rechtwinkliges Dreieck Java Basics - Anfänger-Themen 10
S Fehler bei Code mit SubStrings für mich nicht auffindbar. Java Basics - Anfänger-Themen 4
nevel Programm für die Summer der Zahlen 1- 1ß Java Basics - Anfänger-Themen 12
I Entity erstellen, die für API gedacht ist Java Basics - Anfänger-Themen 33
C Archiv für eigene Klassen Java Basics - Anfänger-Themen 9
A Junit Test für MysqlDataSource JDBC Java Basics - Anfänger-Themen 3
Animal-Mother BMI Rechner erstellen für W/M Java Basics - Anfänger-Themen 7
E Kleines Java-Projekt für Anfänger Java Basics - Anfänger-Themen 10
A Java die richtige Programmiersprache für mein Projekt? Java Basics - Anfänger-Themen 1
I DecimalFormat in Zahlenformat für Währung, habe 7,99, bekomme aber 7 Java Basics - Anfänger-Themen 4
L Methode für Zweidimensionale Arrays Java Basics - Anfänger-Themen 4
Kanaska Datentyp für Zahlenbereiche Java Basics - Anfänger-Themen 7
T Startbildschirm für ein Spiel erstellen Java Basics - Anfänger-Themen 0
U BestPractise für Deployment unter Windows gesucht Java Basics - Anfänger-Themen 12
lilrack UML Diagramm für Parkplatzverwaltung Java Basics - Anfänger-Themen 8
W Mehrfach das gleiche Attribut für ein Objekt erzeugen (mit verschiedenen Werten) Java Basics - Anfänger-Themen 2
B Generische Typen für dynamisches Formular Java Basics - Anfänger-Themen 3
C Was ist nötig für ein Java-Programm auf Server für Website Java Basics - Anfänger-Themen 18
T Vererbung Verschiedene Attribute für vererbte Klassen Java Basics - Anfänger-Themen 4
T Start-Activity für Java Maven Web-Anwendung festlegen Java Basics - Anfänger-Themen 2
T Alternative für switch case Java Basics - Anfänger-Themen 1
P Ressourcen für JSON & API Informationen? Java Basics - Anfänger-Themen 1
M Java Einstellung von Apache POI für MS Word Erstellung mit Eclipse Java Basics - Anfänger-Themen 6
L Compiler-Fehler SupressWarning für clone() Java Basics - Anfänger-Themen 6
P Wie für EIN Java Programm von 64bit Java (=Standard) auf 32bit Java Installation (Windows) umschalten? Java Basics - Anfänger-Themen 6
B Methode für jede beliebe Entity erstellen Java Basics - Anfänger-Themen 7
D Ampel für Mitarbeiter zum An-/Abwesend zeigen Java Basics - Anfänger-Themen 28
T Wahrscheinlichkeiten für Slot Machine Java Basics - Anfänger-Themen 13
C Konvertierung des int typs in den double typ für die Ausgabe mit Nachkommastellen Java Basics - Anfänger-Themen 4
M Code nur für Cracks? Crack the Passwort Übung Java Basics - Anfänger-Themen 7
L Konstruktor für eine Map-Datei/Map-Datei einlesen Java Basics - Anfänger-Themen 5
T Roulette für Anfänger Java Basics - Anfänger-Themen 7
A Überprüfung für unentschieden in TicTacToe Java Basics - Anfänger-Themen 10
L Best Practice Code Refactoring für Methoden mit fast gleicher Aufbau Java Basics - Anfänger-Themen 6
J alternierendes Probing-Verfahren für Hash-Tabellen implementieren Java Basics - Anfänger-Themen 0
V Ersätze für Java-Scanner Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben