# A3 Soccer Problem # Rainer's Kurs hat Langeweile, da sie schon eine Woche lang nichts unternommen haben. # Sie entschliessen sich zu ueberlegen, # wie sie eine Fussball-Mannschaft zusammenstellen wuerden. # Es spielen 11 Spieler, 5 nehmen auf der Bank Platz, der Rest auf der Tribuene. # Vor dem Torwart wird mit 4er Abwehrkette gespielt. # Das Mittelfeld besteht mindestens aus 3, der Sturm aus einem Spieler. # Alle Spieler haben unterschiedliche tagesformabhaengige Staerken: # im Tor, der Abwehr, dem Mittelfeld oder dem Sturm. # Ziel ist es, die Summe der Einzelstaerken der eingesetzten Spieler # plus die mit 10% gewichteten Staerken der Ersatzspieler zu maximieren. # Offensichtlich handelt es sich um ein ganzzahliges Auswahlproblem. # Der Kursleiter hat schon mal einen Ansatz entwickelt, weiss aber nicht weiter, # da es verschiedene Sonderwuensche und Restriktionen gibt, # die natuerlich unbedingt beruecksichtigt werden muessen (siehe unten). reset; option omit_zero_rows 1; # fuer Ausgaben ohne Nullen option solution_round 9; option randseed''; # immer frische Zufallszahlen set Spieler := {'Rainer','Son','Nico','Elisa','Xian','Mariya','Matthias','Nicole','Oliver', 'Tim','Carlos','Lars','Benedict','Theresa','Niso','Jan','Mathias','Carl','Janot'}; param tor {i in Spieler} := Uniform(0,100); # Staerke param abwehr {i in Spieler} := Uniform(0,100); # je param mittel {i in Spieler} := Uniform(0,100); # Bereich param sturm {i in Spieler} := Uniform(0,if i='Rainer' then 120 else 100); # Torriecher durch Erfahrung! var B {Spieler} binary; # ob Spieler i auf der Ersatzbank sitzt var T {Spieler} binary; # ob Spieler i Torwart ist var A {Spieler} binary; # ob Spieler i in der Abwehr eingesetzt wird var M {Spieler} binary; # ob Spieler i im Mittelfeld spielt var S {Spieler} binary; # ob Spieler i Stuermer ist var E {i in Spieler} = T[i]+A[i]+M[i]+S[i]; # "ob Spieler i spielt, d.h. in der ersten 11" maximize zfkt: sum{i in Spieler} (T[i]*tor[i] + A[i]*abwehr[i] + M[i]*mittel[i] + S[i]*sturm[i] + 0.1*B[i]*(tor[i] + abwehr[i] + mittel[i] + sturm[i])); subject to spi {i in Spieler}: E[i]+B[i]<=1; # ob Spieler i spielt oder auf Bank (Eindeutigkeit) subject to tr : sum{i in Spieler} T[i] =1; # ein Torwart subject to abw: sum{i in Spieler} A[i] =4; # 4er-Kette subject to mit: sum{i in Spieler} M[i]>=3; # mind. 3er Mittelfeld subject to stu: sum{i in Spieler} S[i]>=1; # mind. 1 Stuermer subject to mus: sum{i in Spieler}(M[i]+S[i])=6; # 6 Mittelfeld+Sturm subject to ban: sum{i in Spieler} B[i] =5; # 5 Plaetze auf der Ersatzbank ### hier bitte Sonderwuensche und Restriktionen siehe unten modellieren :) subject to nb1: B['Rainer']=0; # Rainer nicht auf der Bank subject to nb2: E['Carlos'] <= E['Tim']; # wenn Carlos spielt dann spielt auch Tim solve; # Tipp: am besten mit cplex display B,T,A,M,S; display B; display T; display A; display M; display S; ##### Aufgaben (fuer 1. und 2. vgl. nb1, nb2 siehe oben) #1 Rainer will spielen oder auf die Tribuene, d.h. partout nicht auf die Ersatzbank (ok). #2 Wenn Carlos spielt dann will auch Tim spielen (ok). #3 Lars und Benedict fordern, dass entweder beide spielen oder keiner von beiden. #4 Elisa und Mattias wollen nicht zusammen in der Abwehr spielen. #5 Nico, Oliver oder Theresa muss im Mittelfeld spielen, # aber nicht alle 3 im Mittelfeld. #6 Wenn Xian im Tor ist, dann soll Jan nicht Sturm spielen. #7 Wenn Mariya im Sturm spielt, dann muss Carl auf die Bank und Mathias ins Mittelfeld. #8 Wenn Niso oder Janot im Sturm spielt, dann soll Carl in die Abwehr. #9 Wenn Nicole in Abwehr oder Mittelfeld eingesetzt wird, # dann soll Son ins Mittelfeld oder Niso in den Sturm. #10 Wenn Rainer Sturm spielt, dann wuenscht er sich mindestens einen Sturmpartner, # welcher ihn mit ordentlichen Vorlagen bedient. #11 Wenn Rainer nicht im Sturm spielt, dann soll Nico nicht in die Abwehr. ### zum Austoben: #12 Wenn Theresa im Tor steht, dann sitzt Matthias oder Mathias auf der Bank (aber nicht beide!). end;