kombinationen < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Hallöchen...
ich wollte ein programm schreiben,dass mir alle möglichen kombinationen ausgibt. eigentlich will ich alle kombinationen von länge 15 aus 6 verschiedenen zahlen haben.habe dann aber erstmal mit 2 und 4 angefangen.
es muss auch nicht unbedingt jede kombination angezeigt werden, sondern eher mitgezählt und am ende eine zahl ausgeben.
das ist mein erster versuch dazu:
stellen=2;
zahlen=4;
kombi=zahlen.^stellen;
C=[];
count=1;
A=cumsum(ones(zahlen,1));
B=cumsum(ones(1,stellen));
for i=1:stellen
for j=1:zahlen
C=[i,j]
C=[j,i]
count=count+1;
end
end
C
der code gibt mir auch viele kombinationen aus,aber eben nicht alle.
was kann ich anders oder besser machen?
|
|
|
|
Hallo simplify,
hier ist ein Programm, dass alle Möglichkeiten für n Würfel ausgibt:
clear all;
close all;
clc
n = 3;
zahlen = 6;
moeglichkeiten = zahlen.^n;
A = ones(moeglichkeiten, n);
for i=2:moeglichkeiten
A(i, :) = A(i-1, :);
wechsel = 1;
for i2=n:-1:1
if wechsel == 1
A(i, i2) = A(i-1, i2) + 1;
wechsel = 0;
if A(i, i2) == zahlen + 1
A(i, i2) = 1;
wechsel = 1;
end % if A(i, i2) == zahlen + 1
end % if wechsel == 1
end % for i2=n:1
end % for i=2:moeglichkeiten
A
Jede Zeile der Matrix A ist ein mögliches Ergebnis für einen Wurf mit n Würfeln. Somit können alle möglichen Wurfergebnisse zeilenweise ausgewertet werden. (Um Wahrscheinlichkeiten zu berechnen nehme ich mal an.)
Leider funktioniert dies bei mir nur bis n = 7 (also für bis zu 7 Würfel). Vielleicht hilft dir dieses Beispiel ja trotzdem...
Schöne Grüße
franzzink
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 13:02 Do 20.09.2012 | Autor: | simplify |
wow...vielen dank.genau das was ich meinte.da war ich mit meinen code wohl auf dem holzweg.
eine frage habe ich dann aber doch noch.das programm war quasi nur das grundgerüst, um erstmal alle möglichkeiten zu bestimmen.
ich will am ende darauf hinaus, dass das programm alle kombinationen zählt,die aufaddiert einen gewissen wert haben bevor in der reihe eine 6 erscheint. z.B die kombination 1 2 4 3 wäre dann 10 und der gesuchte "stoppwert" ist gerade 10, dann gilt auch die kombination 3 5 2.
kann ich da einfach ein schleife rumlegen,die jede kombination abfragt?
|
|
|
|
|
Hallo,
> wow...vielen dank.genau das was ich meinte.da war ich mit
> meinen code wohl auf dem holzweg.
Ich weiß nicht, ob du auf dem Holzweg warst. Ich habe dir nur eine Möglichkeit gezeigt, wie es geht. Vielleicht gibt es in neueren Matlab-Versionen sogar einen speziellen Befehl dazu.
Die Matlab-Befehle "perms" und "nchoosek" könnten für dich ebenfalls nützlich sein, wenn du Permutationen etc. in einer Matrix erzeugen willst, um damit Wahrscheinlichkeiten zu berechnen. (Für deine ursprüngliche Fragestellung sind sie leider nicht geeignet.)
> eine frage habe ich dann aber doch noch.das programm war
> quasi nur das grundgerüst, um erstmal alle möglichkeiten
> zu bestimmen.
Klar. Habe ich mir schon gedacht.
> ich will am ende darauf hinaus, dass das programm alle
> kombinationen zählt,die aufaddiert einen gewissen wert
> haben bevor in der reihe eine 6 erscheint. z.B die
> kombination 1 2 4 3 wäre dann 10 und der gesuchte
> "stoppwert" ist gerade 10, dann gilt auch die kombination 3
> 5 2.
> kann ich da einfach ein schleife rumlegen,die jede
> kombination abfragt?
Das Schöne ist, dass du keine "Schleife rumlegen" musst: Das Programm erzeugt erstmal die Matrix A. Diese kannst du dann einfach weiterverwenden: Entweder in einem neuen .m-file (ohne die Matrix A aus dem Workspace zu löschen) oder du kannst deinen Code am Ende des Programms beginnen.
Grüße
franzzink
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:30 Do 20.09.2012 | Autor: | simplify |
ehrlich gesagt fällt mir keine möglichkeit ein die abfragen ohne eine schleife zu machen.
deshalb habe ich folgenden code (der dirket am alten anschließt):
AA=ones(moeglichkeiten,1);
for i=1:moeglichkeiten
AA=sum(A(i,:));
end
AA
AAA=ones(length(AA),1);
for j=1:length(AA)
if AA==10
trage diese kombination in AAA ein
ich stocke ziemlich. wie schaffe ich es denn, dass AA mir eine moeglichkeitenx1-Matrix ausgibt mit den werten von AA?
und wie sage ich denn,dass nur die zahlen bis eine 6 auftritt summiert werden sollen ?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:40 Do 20.09.2012 | Autor: | simplify |
ich habe den code umgeändert und habe jetzt fast alles was ich brauche.ich weiß nur nicht wie und wo ich die abfrage: summe soll z.b. 10 sein ohne eine 6 in der kombination. Hab jetzt [mm] 6^{2} [/mm] möglichkeiten genommen.
hier mein code:
AA=ones(moeglichkeiten,1);
for i=1:1:moeglichkeiten
AA(i,1)=sum(A(i,:));
end
AA
AAA=[];
for j=1:length(AA)
if AA(j,1)==10
AAA(j,1)=10;
else
AA(j,1)=0;
end
end
AAA;
AAA gibt mir nun alle werte aus die 10 sind und sonst 0.
|
|
|
|
|
Hallo,
> ehrlich gesagt fällt mir keine möglichkeit ein die
> abfragen ohne eine schleife zu machen.
das war ein Missverständnis. Natürlich musst du Schleifen verwenden, aber die musst du nicht "um den ersten Programmteil herum" programmieren, sondern es genügt diese danach anzuwenden.
Was ich bisher gesehen habe, funktioniert noch nicht. Du addierst einfach auf. Es muss noch eine Abfrage geben, ob eine 6 auftaucht, bevor der Wert 10 erreicht ist.
Muss der Wert 10 genau erreicht werden oder nur mindestens 10 ?
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:41 Do 20.09.2012 | Autor: | simplify |
dachte schon,dass ich eine konoten im kopf habe, weil mir nichts ohne schleifen eingefallen ist.
ja,der wert soll genau erreicht werden.
die abfrage,ob eine 6 darin vorkommt kriege ich irgendwie nicht hin.
mein gedanke bis jetzt ist :
B=[];
for k=1:n
if A(moeglichkeiten,k)==6
B(moeglichkeiten,n)=sum(A(moeglichkeiten,1:k-1));
end
end
B
ich will einfach eine matrix erstellen die mir quasi nur 10en und 0en ausgibt.
ich dachte mir auch,dass ich einfach eine if-abfrage starten muss die in jeder zeile alle werte durch geht bis eine 6 (k==6) kommt und dann alle vorherigen wert (k-1) aufaddiert.das will aber nicht so recht funktionieren.
was mache ich falsch?
|
|
|
|
|
Hallo,
hier ist ein Beispiel-Programm. Dies kannst du einfach hinter dem ersten Beispiel einfügen:
% Summe der Augenzahlen bevor die erste 6 gewürfelt wird
% in den Vektor "summenvektor" schreiben:
for i=1:moeglichkeiten
summe = 0;
sechsgewuerfelt = 0;
for i2=1:n
if (sechsgewuerfelt == 0) & (A(i, i2) < 6)
summe = summe + A(i, i2);
else
sechsgewuerfelt = 1;
end % if (sechsgewuerfelt == 0) & (A(i, i2) < 6)
summenvektor(i) = summe;
end % for i2=1:n
end % for i=1:moeglichkeiten
summenvektor
% Prüfen, wie oft genau 10 Punkte erreicht wurden (vor der ersten 6):
zehnpunkte = 0;
for i=1:moeglichkeiten
if summenvektor(i) == 10
zehnpunkte = zehnpunkte + 1;
end % if summenvektor(i) == 10
end % for i=1:moeglichkeiten
zehnpunkte
Zunächst wird in den Vektor "summenvektor" die Summe der gewürfelten Augenzahlen geschrieben, bevor die erste 6 gewürfelt wurde. Im zweiten Schritt wird gezählt, wie oft genau 10 Punkte erreicht wurden.
Dies ist nur ein ganz einfaches Beispiel, um zu zeigen, wie so etwas prinzipiell funktionieren kann.
Viel Erfolg.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 11:44 Fr 21.09.2012 | Autor: | simplify |
Vielen vielen Dank.
ich hab nur noch eine Frage. kann ich das bisherige programm auch dazu bringen 17 mal zu würfeln?
ab einer gewissen anzahl gibts ne fehlermeldung.
muss ich die ausgabevariable irgendwie vergrößern? bin im netz nicht so richtig schlau geworden.
|
|
|
|
|
> Vielen vielen Dank.
> ich hab nur noch eine Frage. kann ich das bisherige
> programm auch dazu bringen 17 mal zu würfeln?
> ab einer gewissen anzahl gibts ne fehlermeldung.
> muss ich die ausgabevariable irgendwie vergrößern? bin
> im netz nicht so richtig schlau geworden.
Hallo,
das Problem ist der Arbeitsspeicher: Es gibt in diesem Fall [mm] 6^{17} [/mm] Möglichkeiten und für jede Möglichkeit müssen nochmals 17 Würfel gespeichert werden. Eine Möglichkeit wäre die Variablen in der Matrix A anders zu deklarieren (es kommen ja nur die natürlichen Zahlen 1 bis 6 vor; bisher wird jede Zahl als "double" gespeichert und belegt entsprechend mehr Speicher; aus dem Stegreif kann ich dir aber nicht sagen, wie es funktioniert die Zahlen "speicher-schonender" in Matlab zu deklarieren.)
Eine weitere Möglichkeit wäre ganz auf die Matrix A zu verzichten und den Computer gleich nach Ermittlung eines Wurfergebnisses dieses auswerten zu lassen (also zu prüfen, ob die Augenzahl 10 erreicht wurde.) Dies habe ich nicht so gemacht, weil ich in deiner ursprünglichen Frage noch nicht wissen konnte, was du mit den Ergebnissen vorhast. Außerdem geht dann die Anschauung verloren: jetzt entspricht der i-te Eintrag in "summenvektor" der i-ten Zeile der Matrix A. Somit kannst du die Ergebnisse im "summenvektor" noch einzeln kontrollieren...
Wie auch immer: für 17 Würfel und das durchspielen aller Möglichkeiten wird der Computer auch so eine gewisse Rechenzeit benötigen - selbst wenn man effizienter programmiert als ich es getan habe. Dann sollte man ein Programm so gestalten, dass es sofort nach der ersten sechs abbricht, um Rechenzeit zu sparen, was wiederum das Programm komplizierter macht...
Grüße
franzzink
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:27 Sa 22.09.2012 | Autor: | matux |
$MATUXTEXT(ueberfaellige_frage)
|
|
|
|