

Kombinationen II

Wenn aus einem Gef mit n verschiedenfarbigen Kugeln ohne Zu-
rcklegen und ohne Bercksichtigung der Reihenfolge (man 
nennt das "Ziehen mit einem Griff" oder "auf einen Griff")
k Kugeln gezogen werden, ergibt sich folgende Anzahl von Mg-
lichkeiten:

  n*(n-1)*(n-2)*(n-3)*...*(n-k+1)        n!
  -------------------------------- = ----------- <Bruchstrich
       k*(k-1)*(k-2)*...*2*1          k!*(n-k)!

Voraussetzung ist, da die Anzahl der gezogenen Kugeln kleiner 
ist als die Zahl der vorhandenen Kugeln (k<n).
Dafr schreibt man:

 (n)      n!
   = -----------
 (k)    k!*(n-k)!

Was links vom Gleichheitszeichen steht, wird normalerweise als
"n ber k" gelesen und mte eigentlich in einer groen runden
Klammer stehen. Ja, ja, der ASCII-Code....

Man bezeichnet diese Terme auch als Binomialkoeffizienten.

Beispiel:
Bei der Ausfllung von Lottoscheinen gibt es also (n=)49 ber 
(k=)6 verschiedene Mglichkeiten, den Lottoschein so auszu-
fllen, da mit Sicherheit "6 Richtige" dabei sind.
Ein entsprechendes POWERBASIC-Programm, mit dem man auch die  
Zahl der auszufllenden Lottoscheine ausrechnen knnte, kann 
nach der oben aufgefhrten Formel so aussehen (KOMBI2_1.BAS):
 
$STACK &H1800
CLS
INPUT "Geben Sie bitte eine Zahl fr n ein: ", n%
INPUT "Geben Sie bitte eine Zahl fr k ein: ", k%
A%=N%-K%
PRINT "Die Zahl der Mglichkeiten fr";n%;"ber";k%;"ist :";
PRINT FNFakultaet##(N%)/(FNFakultaet##(K%)*FNFakultaet##(A%))

DEF FNFakultaet##(X%)
 IF X% >1 AND X%<=170 THEN
   FNFakultaet## = X%*FNFakultaet##(X%-1)
 ELSEIF X%=0 OR X%=1 THEN
   FNFakultaet## = 1
 ELSE
   FNFakultaet## = -1
 END IF
END DEF
 
Die Verwandtschaft mit dem Programm zur Berechnung der Fakul-
tt ist klar zu erkennen und beabsichtigt. Hier wird die Effi-
zienz des rekursiven Programmierens deutlich. Eine Unterrou-
tine wird mehrmals benutzt - und auch noch mit verschiedenen 
Variablen!

Natrlich geht das in QBASIC auch (KOMBI2_2.BAS) :
 
DECLARE FUNCTION fakultaet# (x!)
CLEAR , , 10000
CLS
INPUT "Geben Sie bitte eine Zahl fr n ein: ", n!
INPUT "Geben Sie bitte eine Zahl fr k ein: ", k!
PRINT "Die Zahl der Mglichkeiten fr"; n!; "ber"; k!; ": ";
PRINT fakultaet#(n!) / (fakultaet#(k!) * fakultaet#(n! - k!))
END

FUNCTION fakultaet# (x!)
 IF x! = 0 THEN fakultaet# = 1 ELSE fakultaet# = ...
  ...    x! * fakultaet#(x! - 1)
  REM die letzten zwei Zeilen sind eigentlich eine Zeile. 
  REM Wegen des Formats dieses Magazins ist leider diese 
  REM Schreibweise ntig. Die Punkte mssen natrlich wegge-
  REM lassen werden, wenn das Programm bernommen wird.
END FUNCTION

Wir knnen die obige Formel auch umformen, wenn wir folgende 
Setzungen bercksichtigen:   
Diese Beziehung ergibt sich aus:

 (n)    
   = 1
 (0)    

 (n)    n*(n-1)*(n-2)*(n-3)*...*(n-k+1)      
   = --------------------------------- 
 (k)         k*(k-1)*(k-2)*...*2*1 

	n*(n-1)*(n-2)*(n-3)*...*((n-1)-(k-1)+1)
     = -----------------------------------------
	      k*(k-1)*(k-2)*...*2*1
     
       n   (n-1)
     = - *     
       k   (k-1)

In Worten: n ber k ist gleich dem Produkt aus dem Quotienten
n/k und n-1 ber k-1. 

Das sieht ja ganz gut aus. Dieser Algorithmus erspart einen 
rekursiven Aufruf der Funktion und schont damit den Stapel-
speicher. Hier liegt eine Mglichkeit der Programmoptimierung. 
Das Programm arbeitet schneller. Hurra! Ob das aber auch 
mebar ist, bleibt nachzuprfen.
TSCHIBTSCH!
Die Formel sieht zwar einfacher aus, bentigt aber offenbar 
mehr Stapelspeicher als die erste Form. Scheinbar wird wohl 
der Stackbereich nach dem Abarbeiten eines rekursiven Aufrufs 
zurckgesetzt. Deshalb wird auch in dem Beispiel der Stackbe-
reich vergrert. Man kann das austesten, indem man die 
hchsten Zahlen bis zum Stapelberlauf feststellt und dann 
sieht, ob die erste Version nicht weniger Stapelspeicher fr 
dieselbe Zahlenkombination bentigt.
Fazit: Faszinierende Lsungen sind nicht immer optimal!
       Das war kein Hack!

Trotzdem: Hier ist das POWERBASIC-Programm: Jedenfalls kann
es als Illustration zum Aufruf einer Funktion mit 2 Variablen
dienen (KOMBI2_3.BAS).

 $STACK &H2700
 CLS
 INPUT "Geben Sie bitte eine Zahl fr n ein: ", N%
 INPUT "Geben Sie bitte eine Zahl fr k ein: ", K%
 PRINT "Die Zahl der Mglichkeiten betrgt fr";N%;"ber";
 PRINT K%;":";Q##=N%/K%
 PRINT Q##*FNFakultaet##((N%-1),(K%-1))
 END

 DEF FNFakultaet##(X%,Y%)
  IF Y% =>1 AND Y%<=200 THEN
     FNFakultaet## = X%/Y%*FNFakultaet##((X%-1),(Y%-1))
    ELSEIF Y%=0  THEN
     FNFakultaet## = 1
   ELSE
     FNFakultaet## = -1
  END IF
 END DEF

Und das QBASIC-Programm folgt sogleich (KOMBI2_4.BAS).

 DECLARE FUNCTION fakultaet# (x!, y!)
 CLEAR , , 10000
 CLS
 INPUT "Geben Sie bitte eine Zahl fr n ein: ", N!
 INPUT "Geben Sie bitte eine Zahl fr k ein: ", K!
 PRINT "Die Zahl der Mglichkeiten fr"; N!; "ber"; K!; ": ";
 PRINT N! / K! * fakultaet#((N! - 1), (K! - 1))
 END

 FUNCTION fakultaet# (x!, y!)
  IF y! = 0 THEN fakultaet# = 1 ELSE fakultaet# = ...
     ... x! / y! * fakultaet#((x! - 1), (y - 1))
     REM Auch die letzten beiden Zeilen sind wieder nur eine 
     REM Zeile. Das Format ... Na, ja, ihr wit schon. 
 END FUNCTION

Jedenfalls knnen wir nun berechnen, wieviele Lottoscheine man
ausfllen mu, um am Samstag mit Sicherheit "6 Richtige" zu 
haben. Leider ist das Ergebnis nicht ermutigend.

Jetzt wird auch klar, warum beim alten Mittwochslotto (6 aus 
36) die Gewinne niedriger als beim Lotto 6 aus 49 waren. Wurde
es deshalb abgeschafft?
   
Aber es gibt auch noch andere Anwendungsmglichkeiten: 
z.B.: Das   Machoproblem!

Wir denken an folgende (alltgliche) Situation:   
Thomas und Gero mchten zwei ihrer Schulfreundinnen Tina, 
Lisa, Anne, Beate und Carla zum Eis einladen. Wieviele Mg-
lichkeiten haben sie, ihre Wahl zu treffen? 
Das ist ja noch ganz einfach. 5 (Mdels) ber 2 (Jungs).
Hmmmmm!
Interessanter wre es jedoch, sich eine Liste mit allen
mglichen Kombinationen ausgeben zu lassen.
Einfacher gesagt, wir brauchen ein Programm, das die Liste 
aller "k-elementigen Teilmengen" (genauer: Teillisten) einer 
Menge (nmlich der Ursprungsliste) ausgibt. Alles klar? Oder?
(KOMBI2_5.BAS)

 10  CLS
 20  DIM KOMBI$(200)
 30  PRINT
 40  ZAHL%=1 : KOMBI$(ZAHL%)=""
 50  INPUT "  Wieviele Jungen";JK%
 60  INPUT "  Wieviele Mdchen";MN%
 70  PRINT
 80  IF MN%<JK% THEN PRINT "  Wo ist die Wahl?" : END
 90  IF MN%< 2 THEN PRINT "  Wo ist die Wahl?" : END
100  FOR A=1 TO MN%
110  PRINT "  Name des";:PRINT USING "###"; A;
120  PRINT ". Mdchens: ";:INPUT, NAMEN$(A)
130  NEXT A
200  FOR I=1 TO JK%
210  KOMBI$(ZAHL%)=KOMBI$(ZAHL%)+NAMEN$(I)+" "
220  NEXT I
230  ZAHL%=ZAHL%+1
240  IF JK%=MN% THEN 700
250  I=JK% : J(I)=0
260  I=I+1 : J(I)=JK%
270  H$=NAMEN$(I) : NAMEN$(I)= NAMEN$(J(I)) : NAMEN$(J(I))=H$
280  J(I)=J(I)-1
300  FOR L=1 TO JK%
310  KOMBI$(ZAHL%)=KOMBI$(ZAHL%)+NAMEN$(L)+" "
320  NEXT L
330  ZAHL%=ZAHL%+1
400  IF I<MN% THEN 260
410  IF J(I)>J(I-1) THEN 270
500  J(I)=J(I)+1
510  H$=NAMEN$(I) : NAMEN$(I)= NAMEN$(J(I)) : NAMEN$(J(I))=H$
520  IF J(I)<JK% THEN 500
600  I=I-1 :IF I>JK% THEN 410
700  ZAHL%=ZAHL%-1 : PRINT
710  PRINT "  Anzahl der Kombinationen: "; ZAHL% : PRINT
720  FOR A=1 TO ZAHL%
730  PRINT USING "###";A; : PRINT ". Kombination: ";KOMBI$(A)
750  NEXT A
760  END

Nach dem Start geben wir als Zahl der Jungen 2 ein, die Zahl 
der Mdchen ist 5 und die Namen sind: 

	Tina Lisa Anne Beate und Carla

Anmerkung zur Problemlsung:
Wenn wir den Namen Elemente zuordnen, erhalten wir als Ele-
mentnummern:
Name:           Tina Lisa Anne Beate und Carla
Element(nummer):  1    2    3    4         5

     (5)    
Die    = 10 Kombinationen der Elemente 1 2 3 4 5 sind:
     (2)    
     
Tausch: Stelle  genutze   nicht genutzte  Tausch: Stelle
A gegen B       Elemente   Elemente        A gegen B
			  
		       1 23 4 5           2 gegen 3
		       1 32 4 5           2 gegen 4
		       1 42 3 5           2 gegen 5
		       1 52 3 4
1 gegen 3              2 31 4 5           2 gegen 4
		       2 41 3 5           2 gegen 5
		       2 51 3 4
1 gegen 4              3 41 2 5           2 gegen 5
		       3 51 2 4
1 gegen 5              4 51 2 3

Durch diese Darstellung wird der Zweck der bung deutlich: 
Das erste Element (1) wird mit allen ihm folgenden Elementen
(2-5) verbunden. Dann wird das zweite Element (2) mit allen 
ihm folgenden Elementen (3-5) verbunden. Dann das dritte Ele-
ment (3) mit dem ihm folgenden (4 und 5); schlielich das 
vierte Element (4) mit dem ihm folgenden Element (5).
Das funktioniert aber nur, wenn die Reihenfolge der nicht ge-
nutzten, weil momentan nicht dargestellten Elemente verwaltet 
wird. Tausch A gegen B heit also, da das Element, das gerade
an der Position A steht, gegen das Element getauscht wird, das
sich gerade an der Position B befindet. Es drfen also nicht 
die Elementnummern (=NAMEN$(I)) getauscht werden! Es mssen 
die Positionen getauscht werden!

Zeile 260 : Jedesmal, wenn die neue Tauschposition gewhlt 
	    wird, wird I um 1 erhht und J(I) auf JK% (in un-
	    serem Beispiel auf 2) gesetzt.
Zeile 270 : Die Namen an den entsprechenden Positionen werden
	    ausgetauscht (sog. Dreieckstausch)
Zeile 280 : Die Kennzahl J(I) wird um 1 vermindert
Zeile 300 : Die hergestellte Kombination wird als Variable
	    (KOMBI$(ZAHL%)) gespeichert.
Zeile 400 : Dieses Verfahren wird fortgesetzt, solange I<MN%
	    ist.
Zeile 410 : Ist I=MN% (in unserem Falle 5) wird, wenn J(I)>
	    J(I-) ist, noch einmal getauscht (Zeile 270), an-
	    dernfalls das letzte Element abgearbeitet (500).
Zeile 500 : J(I) wird um 1 erhht; die Namenelemente werden 
	    getauscht. 
Zeile 520 : Dieser Vorgang wird wiederholt, wenn J(I)<JK% ist.
Zeile 600 : Ist I=JK%, ist der Algorithmus beendet.

Da der im Programm genutzte Algorithmus nicht nur fr das 
angefhrte Beispiel gilt, zeigt sich, wenn wir das Macho-
problem erweitern und am folgenden Beipiel berprfen:

Thomas und Gero erzhlen nmlich ihrem gemeinsamen Freund Sven
von ihrer Absicht. Er wrde mitmachen, besteht aber darauf, 
da Steffi und Daniela mit in die Auswahl kommen. 

Natrlich haben die drei Freunde mehr Auswahlmglichkeiten, 
wenn sie drei Mdchen einladen wollen. 

     (7)    
Die    = 35 Kombinationen der Mdchennamen kann man sich mit 
     (3)    

dem Programm ausdrucken lassen.

Verwirrt genug? Ok, Schlu fr heute. Beim nchsten Mal geht 
es weiter mit der Freude des Fotografen und dem frhneuzeit-
lichen Problem eines Angestellten des Herrn von Tor Tellini.
Schon gespannt?
Das ist auch 

		  Herbie

