WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Scheduling: Alle Kombinationen der Zahlen 1-28 in 4x4 matrix

 

Davyd

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2015, 19:57     Titel: Scheduling: Alle Kombinationen der Zahlen 1-28 in 4x4 matrix
  Antworten mit Zitat      
Moin moin.

Es geht um Scheduling.

Problem: Es gibt 8 Teams. Diese sollen an jeweils 4 Orten einem anderen Gegner gegenüberstehen. Kein Team soll ein anderes zwei mal sehen. Kein Team soll einen Ort zwei Mal sehen.

=> 8x4 matrix

Ansatz: Reduzierung der Teams auf mögliche Paarungen
1-2, 1-3, 1-4, (...), 2-3, 2-4, (...), 7-8 => 28 Möglichkeiten

Somit mache ich aus der 8x4 matrix schonmal eine 4 x 4 matrix und spare rechenzeit

Ich hatte mir gedacht, dass ich sicher mit matlab jetzt alle möglichen kombinationen der zahlen 1-28 in einer 4x4 matrix rausfinden kann. Von mir aus kann es auch ne Stunde dauern, den code durchlaufen zu lassen - aber das problem muss ich bis morgen gelöst haben.

Bisher habe ich die paarungen folgend gespeichert:

Code:
anzahl = 8;

z = 1;
for i = 1:anzahl-1
    for j = i+1:anzahl
        t{z} = [i,j];
        z=z+1;
    end
end;


dann ist z = 21 und t{z} die paarung mit zwei teams.

Ich hatte mir gedacht das ganze mit for-schleifen zu machen und dann nach und nach die vorgänge mit kriterien einzugrenzen (z.b. dass die zahlen nicht zweimal vorkommen können, etc). Aber da ich kein Matlab Profi bin, frage ich hier mal um professionellen rat.

Mein ziel ist es übrigens, dass das script nachher auch kombinationen für 6, 10 und 12 teams finden kann, deshalb halte ich es variabel.

ich hoffe ich habe mein problem präzise genug beschrieben und mir kann jemand helfen.

BTW: round robin scheduling kenne ich - habe ich probiert - bringt aber nix, da jedes team genau einmal an einem ort sein soll


Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2015, 20:40     Titel:
  Antworten mit Zitat      
Muss jedes Team mal gespielt haben? Gibt ja auch noch ne Menge Lösungen, bei denen einige Teams überhaupt nicht antreten müssen.

Wenn die Lösung für dein Problem tatsächlich alle Kombinationen der Zahlen 1-28 sind, dann bekommst Du am Ende 28! = 3,05e29 Kombinationen heraus. Wenn Du es geschickt machst und jede Kombination als matrix aus 2 uint8 speicherst, benötigt jede Kombination 16 Bit = 2Byte Speicher. Deine Ergebnismatrix ist also 6,1e29 Byte groß. Das ist eine Speichermenge, die so groß ist, dass es dafür nicht mal mehr ein passendes SI-Präfix gibt. Wahlweise ist es 600.000 mal die Kapazität des Utah Data Center, wenn man die großzügigste Schätzung der Kapazität nimmt. Oder 2e11 mal das, was besagtes Rechenzentrum speichern kann, wenn man von der kleinsten geschätzten Kapazität ausgeht. In Tagen wäre das ungefähr das Alter unseres Universums.
Private Nachricht senden Benutzer-Profile anzeigen
 
Davyd

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2015, 23:03     Titel:
  Antworten mit Zitat      
Jedes Team muss 4 mal antreten, aber nicht gegen jedes andere.

Wenn ich mir mögliche paarungen anschaue, kann ich diese nummerieren und in gruppen einteilen

1-2 2-3 3-4 4-5 5-6 6-7 7-8
1-3 2-4 3-5 4-6 5-7 6-8
1-4 2-5 3-6 4-7 5-8
1-5 2-6 3-7 4-8
1-6 2-7 3-8
1-7 2-8
1-8

Gruppe 1: 1. 1-2; 8. 1-8
Gruppe 2: 9. 2-3; 14. 2-8
Gruppe 3: ....

Dann kann ich als einschränkung direkt sagen: Nr 1 kann nicht in der gleichen zeile mit einer zahl aus gruppe 2 stehen. Nr 2 kann nicht in der gleichen zahl mit gruppe 3 stehen, etc. (das wäre dann ja: 1-2 und 2-x in der selben zeile -> nicht möglich)

Mich interessieren auch nicht alle lösungen, sondern nur eine einzige.

es muss doch mit den oben genannten einschränkungen möglich sein, so etwas in nicht allzulanger zeit zu berechnen?
 
Davyd

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2015, 23:09     Titel:
  Antworten mit Zitat      
Vielleicht zur verdeutlichung nochmal eine tabelle, die das gelöste problem mit 10 teams an 5 orten darstellt:



Die Stops sind die Orte. Die Spalte ganz links sind die Zeitpunkte, zu denen die jeweils nächste runde anfängt.
Jetzt gilt es für 8 statt 10 teams paarungen zu finden, dass jedes Team jeden ort nur einmal sieht und kein team ein anderes zweimal sieht. Ich weigere mich zu glauben, dass dies unmöglich ist.
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2015, 23:22     Titel:
  Antworten mit Zitat      
Ok, also Dein konkretes Problem ist, dass Du morgen ein Turnier veranstaltest und Du wirklich nur eine einzige sinnvolle Lösung brauchst, damit das nicht ausfallen muss, richtig? :D

Ort 1:
1. Spiel: 1-5
2. Spiel: 2-6
3. Spiel: 3-7
4. Spiel: 4-8

Ort 2:
1. Spiel: 1-6
3. Spiel: 2-7
2. Spiel: 3-8
4. Spiel: 4-5

Ort 3:
1. Spiel: 1-7
2. Spiel: 2-8
3. Spiel: 3-5
4. Spiel: 4-6

Ort 4:
1. Spiel: 1-8
2. Spiel: 2-5
3. Spiel: 3-6
4. Spiel: 4-7

Womöglich lässt sich dieses System auch auf Deine anderen Anzahlen von Teams übertragen. Spontan wüsste ich nicht, warum es schief gehen sollte. So lange die Anzahl der Teams geteilt durch die Anzahl der Orte gleich der Anzahl der Teams ist, die sich in einem Match gegenüber stehen, müsste das eigentlich klappen.

Nachtrag: es gibt natürlich keine einzige Kombination, bei der ein Team weniger als 4 mal gespielt haben muss. Da habe ich mich oben vertan.
Private Nachricht senden Benutzer-Profile anzeigen
 
Davyd

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.08.2015, 23:54     Titel:
  Antworten mit Zitat      
Ja, schön wäre es, wenn es so einfach wäre. Allerdings finden alle runden Zeitgleich statt. Es ist also so ne art sudoku, wo in jeder zeile die zahlen 1-8 stehen müssen

aber danke schonmal für deine zeit Very Happy das ganze ist ja doch schwieriger als man meint
 
Davyd

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.09.2015, 00:11     Titel:
  Antworten mit Zitat      
Habe jetzt die folgende Lösung gefunden:



Trotzdem bleibt mein Problem bestehen. ich interessiere mich immernoch für eine variable anzahl an teams und orten Very Happy
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 01.09.2015, 01:35     Titel:
  Antworten mit Zitat      
ok ich hab mal was zusammengeschustert... das ist aber noch nicht sehr gut. aber vielleicht gibt es anregungen die man weiterentwickeln kann.
Code:

for m=1:100000
norte=4;
nteams=8;
teams=1:nteams;
matchup=nan(norte,2*norte);
vs=cell(nteams,1); %teams gegen die gespielt wurde
    try % manchmal werden kombinationen gewählt die nicht aufgehen. darum das try
for k=1:norte
    for l=1:norte
       teams2=setdiff(teams,matchup(:,2*l-1:2*l)); % teams die noch nicht am ort  gespielt haben
       teams2=setdiff(teams2,matchup(k,:)); %teams die noch nicht um die zeit spielen
       matchup(k,2*l-1)=teams2(randi(numel(teams2))); % ein team zufällig auswählen
       teams2=setdiff(teams,matchup(:,2*l-1:2*l));  % teams die noch nicht am ort gespielt haben
       teams2=setdiff(teams2,vs{matchup(k,2*l-1)}); % teams die noch nicht gegen das schon eingetragene team gespielt haben
       teams2=setdiff(teams2,matchup(k,:));         % teams die nicht um die zeit spielen.
       matchup(k,2*l)=teams2(randi(numel(teams2))); % zufälligen gegner auswählen
       vs{matchup(k,2*l)}=[vs{matchup(k,2*l)},matchup(k,2*l-1)]; % begegnung in die vs tabelle eintragen
       vs{matchup(k,2*l-1)}=[vs{matchup(k,2*l-1)},matchup(k,2*l)]; % begegnung in die vs tabelle eintragen
    end
end
    catch err
    end
    if all(~isnan(matchup(:))) %% falls eine lösung gefunden wurde abbrechen.
        break
    end
end

_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.09.2015, 13:31     Titel:
  Antworten mit Zitat      
Habe nochmal ein bisschen nachgedacht: ich fürchte, das Problem ist nur durch Raten (ausprobieren) lösbar. Das Programm ist dann wirklich nicht mehr sehr weit von einem Sudoku-Solver entfernt, der auch ausprobieren kann.

@winkow: ich weiß nicht, ob ich das Ergebnis richtig interpretiere, aber irgendwas haut da noch nicht ganz hin. Bekomme an einem Ort z.B. die Paarungen 1-3 und 3-1 raus.
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 01.09.2015, 14:03     Titel:
  Antworten mit Zitat      
Zitat:
@winkow: ich weiß nicht, ob ich das Ergebnis richtig interpretiere, aber irgendwas haut da noch nicht ganz hin. Bekomme an einem Ort z.B. die Paarungen 1-3 und 3-1 raus.

hmm ist mir bis jetzt in den testläufen noch nicht passiert.
ort sind die spalten. also ort 1 ist spalte 1 und 2 ort 2 ist spalte 3 und 4
eigendlich sollte das von dir beschrieben verhalten nicht möglich sein durch setdiff. aber kann natürlich falsch sein mein code.
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.09.2015, 14:15     Titel:
  Antworten mit Zitat      
Ah, dann habe ich es falsch gelesen. In meinem Kopf sind die Orte zwar auch die Spalten, die Paarungen aber jeweils nebeneinander und nicht untereinander.
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 01.09.2015, 14:53     Titel:
  Antworten mit Zitat      
hmm bei mir sind die pare auch nebeneinander.... kannst du n seed geben der den fehler nachbaut ? würde mich interessieren Smile
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.09.2015, 14:55     Titel:
  Antworten mit Zitat      
Ich prüfe das nochmal. War vielleicht auch einfach zu spät gestern Abend Wink

EDIT: es *war* zu spät. Viel zu spät. Hatte die falsche Variable angeschaut Embarassed
Private Nachricht senden Benutzer-Profile anzeigen
 
Winkow
Moderator

Moderator



Beiträge: 3.842
Anmeldedatum: 04.11.11
Wohnort: Dresden
Version: R2014a 2015a
     Beitrag Verfasst am: 01.09.2015, 14:58     Titel:
  Antworten mit Zitat      
ok dann ist ja gut Smile
_________________

richtig Fragen
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.