Verfasst am: 13.10.2010, 10:11
Titel: Variable Zahl verschachtelter for-Schleifen
Guten Morgen!
Ich möchte für eine Brute-Force Optimierung mit variabler Zahl an Parametern, verschachtelte for-Schleifen verwenden. Das Heißt die Anzahl benötigter verschachtelter for-Schleifen hängt von meinen Einstellungen der Optimierungsparameter ab.
for
for
for
...
end
end
end
Hat jemand einen Vorschlag, wie man diesen Code geschickt strukturieren könnte?
Eine Möglichkeit wäre, die Indices nicht in einzelnen Variablen, sondern in einem Vektor zu speichern.
Code:
n = 5;
start = ones(1, h)% Startwert für jede FOR Schleife
limit = [3,4,5,6,7]; % Endwert für jede FOR Schleife
index = start;
ready = false;
while ~ready
% ... Hier die Berechnungen disp(index);
k = n;
while1
index(k) = index(k) + 1;
if index(k) < limit(k) break; % k-ter Index um 1 erhöht else
index(k) = start(k);
k = k - 1;
if k == 0% All iterations are ready
ready = true; % Stop outer WHILE loop break; % Break inner WHILE loop end end end
Verfasst am: 07.12.2011, 04:32
Titel: Modidikation variable Anzahl von Schleifen
Hallo zusammen,
ich hätte eine kleine Frage an euch. Der Code hat mir schon sehr weitergeholfen, ich bräuchte allerdings noch eine kleine Hilfe bei der Modifikation:
Ich möchte eine variable Anzahl von Schleifen bauen, allerdings wird der Rechenaufwand bei hohen Limits schnell gigantisch. Für meine Zwecke würde es allerdings schon reichen wenn jede Kombination aus den einzelnen Schleifen-Indexen nur einmal auftritt, also für 3 Schleifen zum Beispiel
und z.B. von 112/211/121 nur eines bei der Schleife durchlaufen wir (eine Kombination dieser 3 Zahlen). Die Limits der einzelnen Schleifen sind bei mir immer gleich (hier ja quasi 4).
Kann mir jemand bei diesem Knobel/Tüftel-Problem helfen!?
Ich verstehe die Fragestellung immer noch nicht. Kannst Du bitte nochmal das korrekte Ergebnis für 1:4 und 3 Elemente angeben?
Gruß, Jan
Chris Lightman
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 08.12.2011, 08:01
Titel:
Hi Jan,
Das war nur ein blödes unvollständiges Beispiel.
Mein Ziel ist es, eine variable Anzahl an for-Scheifen zu bauen (so wie dein tolles Beispiel), allerdings sollte jede Zahlenkombination der indices der Schleifen beim Durchlaufen dieser Schleifen nur einmal vorkommen, also 1,1,2 entweder als 112,121,211. In einer dieser Variationen, aber danach bestenfalls kein zweites Mal mehr in einer anderen, um den Rechenaufwand drastisch zu reduzieren.
In dem Beispiel oben, habe ich ein paar Zahlenkombinationen vergessen....
vielen dank für deine hilfe!
liebe Grüße
Christian
In dem Beispiel oben, habe ich ein paar Zahlenkombinationen vergessen...
Welche Zahlenkombinationen hast Du vergessen? Kannst Du bitte einen vollständigen Satz von Ergebnissen posten? Der Text, mit dem Du das Ergebnis beschreibst, mag zwar eindeutig sein. Aber wenn ich eine Lösung posten möchte, ist es für mich sehr umständlich zu prüfen, ob es die von Dir gewünschte ist oder nicht.
Dein Problem ist nämlich nicht einfach die Menge der Kombinationen oder Permutationen ohne Wiederholung, denn eine Ziffer darf ja einmal wiederholt werden. Wie sieht das dann für 4 Ziffern in der Ausgabe aus? Wäre dann [1,1,2,2] eine erlaubte Lösung oder nicht? Solange das Problem nicht eindeutig beschrieben ist, sind sinnvolle Lösungen nicht möglich.
Gruß, Jan
Chris Lightman
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 12.12.2011, 11:21
Titel:
Hi Jan,
selbstverständlich. Danke für deine Unterstützung und dein Interesse! Also für eine Anzahl von 4 Schleifen mit den Limits = [3,3,3,3] und somit
sind hier alle Permutationen aufgeführt (quasi 4 for-Schleifen). Diese durchläuft mein Programm mit Hilfe deines Codes für eine variable Anzahl von Schleifen bereits. Da ich nun meist 5-6 for-Schleifen habe mit Limits bis über 100 und dies sehr viele Iterationen bedeutet, ist mein Ziel: deinen Code so zu überarbeiten, dass nicht alle Permutationen durchlaufen werden, sondern für jede obige Zeile nur eine Permutation generiert wird. Also z.B.
entweder 1112,1211,1121 oder 2111. plus
entweder 2333, 3332, 3233, oder 3323 usw...
[Mein Algorithmus wertet für alle diese Ergebnisse das Selbe aus (und macht somit in diesem Beispiel 3 überflüssige Berechnungen)].
(Sollten einige seltene Zahlenkombinationen zwangsläufig doch öfters auftauchen müssen, so wäre dies auch kein Problem)
Vielen Dank für deine Hilfe!
Liebe Grüße
Christian
function Y = vchoosekr_m(X, K);
nX = numel(X);
Y = X([]); % Duplicate class of the input if nX == 0 || K == 0 return;
end
nY = nchoosek(nX + K - 1, K);
Y(nY, K) = 0; % Keep type of input
Index = ones(1, K); % Current index
Limit = nX(ones(1, K));
Limit(K) = 0;
a = 1;
while1
b = a + nX - Index(K); % Write index for last column for i = 1:(K - 1)% Write the left K-1 columns
Y(a:b, i) = X(Index(i));
end
Y(a:b, K) = X(Index(K):nX); % Write the K.th column
a = b + 1; % Move the write pointer
% Search the last column index, which is not exhausted:
newLoop = find(Index < Limit);
ifisempty(newLoop)% All columns are filled: return; % Ready! end
newLoop = newLoop(length(newLoop));
% Fill new Index with new value encreasing by 1:
Index(newLoop:K) = Index(newLoop) + 1;
end
Hier haben wir wieder den selben Ansatz die geschachtelten FOR-Schleifen in eine einzelne WHILE-Schleife und einen Counter-Vektor zu transformieren.
Der Algorithmus ist nicht besonders effizient in Matlab. Es wäre schon schneller, die Indices a,b,K,i als INT32 zu definieren. Dieser Code diente aber eigentlich nur, um den deutlich schnelleren C-Code zu entwickeln.
Gruß, Jan
Chris Lightman
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 15.12.2011, 08:17
Titel:
Hi Ja,
Wow. Das ist ein cooler Code. Allerdings dauert er auch bei int32 noch sehr sehr lange.
Ich habe noch eine andere Bitte/Frage?
Wieder mit variablen Anzahl an for-Schleifen:
Angenommen bei den "Kombinationen mit Wiederholungen" sollen keine Zahlen zweimal in einer Permutation vorkommen, hast du für diesen Fall auch einen Algorithmus?
für ein Beispiel mit 4 Schleifen und dem Limits = [5,5,5,5] soll somit nur aus den unteren Zeilen jeweils nur Lösung pro Zeile für die Berechnung herangezogen werden:
Wenn ich mich an die gute alte Schulzeit zurückerinnere, dann sollte es nun sowas wie "Kombination ohne zurücklegen" sein. (also quasi die Lotto-Zahlen-Wahrscheinlichkeits-Berechnung)
x nCr y
Nur bräuchte ich diese Zahlenkombination der variablen for-Schleifen fpr weitere Berechnungen.
Idealerweise nicht in einer Matrix, sondern als kleine Variable, die auch wieder freigeben kann, damit der Arbeitsspeicher nicht vollläuft (bei Limits von 100+)!
Vielen Dank für deine Hilfe! Das bist wirklich eine klasse Unterstützung!
Liebe Grüße
Christian
Chris Lightman
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 15.12.2011, 08:19
Titel: Fehler im Beitrag gerade eben
Die Lösungsmenge ist natürlich 5.
Chris Lightman
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 15.12.2011, 11:06
Titel:
Meine statische Lösung für fünf Schleifen sieht wie folgt aus, aber wie gesagt, bräuchte ich diese Lösung als "Variable Anzahl von Schleifen"......
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.