Die Mathe-Redaktion - 20.09.2018 11:24 - Registrieren/Login
Auswahl
ListenpunktHome
ListenpunktAktuell und Interessant ai
ListenpunktArtikelübersicht/-suche
ListenpunktAlle Links / Mathe-Links
ListenpunktFach- & Sachbücher
ListenpunktMitglieder / Karte
ListenpunktRegistrieren/Login
ListenpunktArbeitsgruppen
ListenpunktSchwätz / Top 15
ListenpunktWerde Mathe-Millionär!
ListenpunktFormeleditor fedgeo
Aktion im Forum
Suche
Stichwortsuche in Artikeln und Links von Matheplanet
Suchen im Forum
Suchtipps

Bücher
Englische Bücher
Software
Suchbegriffe:
Mathematik bei amazon
Naturwissenschaft & Technik
In Partnerschaft mit Amazon.de
Kontakt
Mail an Matroid
[Keine Übungsaufgaben!]
Impressum

Bitte beachten Sie unsere Nutzungsbedingungen, die Distanzierung, unsere Datenschutzerklärung und
die Forumregeln.

Sie können Mitglied werden. Mitglieder können den Matheplanet-Newsletter bestellen, der etwa alle 2 Monate erscheint.

Der Newsletter Okt. 2017

Für Mitglieder
Mathematisch für Anfänger
Wer ist Online
Aktuell sind 431 Gäste und 16 Mitglieder online.

Sie können Mitglied werden:
Klick hier.

Über Matheplanet
 
Zum letzten Themenfilter: Themenfilter:
Matroids Matheplanet Forum Index
Moderiert von matroid
Informatik » Algorithmen / Datenstrukturen » PHP - Optimierungsproblem - zweidimensionale Arrays... (Konferenzplanung)
Druckversion
Druckversion
Autor
Kein bestimmter Bereich J PHP - Optimierungsproblem - zweidimensionale Arrays... (Konferenzplanung)
afinckh
Neu Letzter Besuch: im letzten Monat
Dabei seit: 20.08.2018
Mitteilungen: 2
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Themenstart: 2018-08-20


Hallo zusammen,

ich programmiere derzeit eine kleine Konferenzplanung für unsere Schule und habe dabei folgendes Problem / benötige Anregungen..

Ziel: Möglichst wenige Konferenztermine, wobei jedoch jeder Lehrer, der in einer Klasse unterrichtet auch zu dieser Konferenz gehen können muss (also keine Überschneidung mit den anderen Konferenzterminen, bei denen er anwesend sein muss).

Ich bin nun so weit, dass ich aus den Daten von der Stundenplansoftware zwei Arrays (ein zweidimensionales) gebastelt habe mit folgenden Strukturen:


[CODE]
#das erste Array liefert mir zu jeder Klasse die Anzahl an möglichen anderen Klassen, mit denen die Lehrerschaft der Klasse keine Überscheidung hat
array1 = { ["07b"]=> int(1)
["06b"]=> int(1) << Die 6b kann nur mit einer anderen Klasse überschneidungsfrei kombiniert werden
["09e"]=> int(1)
["06a"]=> int(1)
["06e"]=> int(1)
["07c"]=> int(2)
["10b"]=> int(2)
["07d"]=> int(2)
["05b"]=> int(2)
["09a"]=> int(3)
["09d"]=> int(3)
["10a"]=> int(3)
["10c"]=> int(3)
["06d"]=> int(3)
["05f"]=> int(3)
["08d"]=> int(4)
["05d"]=> int(4)
["10e"]=> int(4)
["08e"]=> int(4)
["05c"]=> int(5)
["06c"]=> int(5)
["07e"]=> int(5)
["05e"]=> int(5)
["05a"]=> int(6)
["08b"]=> int(6)
["08c"]=> int(7)
["09c"]=> int(8)
["06f"]=> int(8)
["08a"]=> int(10) << Die 8a kann mit 10 anderen Klasse überschneidungsfrei kombiniert werden (die jedoch untereinander Überschneidungen haben)}

# Das zweite Array enthält die möglichen überschneidungsfreien Klassen jeweils als Arrays "in zweiter Dimension"

array(54) {
[0]=> array(2) { [0]=> string(3) "05a" [1]=> string(3) "05e" }
[1]=> array(3) { [0]=> string(3) "05a" [1]=> string(3) "05e" [2]=> string(3) "08e" }
[2]=> array(2) { [0]=> string(3) "05a" [1]=> string(3) "06c" }
[3]=> array(2) { [0]=> string(3) "05a" [1]=> string(3) "06f" }
[4]=> array(2) { [0]=> string(3) "05a" [1]=> string(3) "08e" }
[5]=> array(2) { [0]=> string(3) "05a" [1]=> string(3) "10e" }
[6]=> array(2) { [0]=> string(3) "05b" [1]=> string(3) "06f" }
[7]=> array(2) { [0]=> string(3) "05b" [1]=> string(3) "08a" }
[8]=> array(2) { [0]=> string(3) "05c" [1]=> string(3) "06b" }
[9]=> array(2) { [0]=> string(3) "05c" [1]=> string(3) "06c" }
[10]=> array(2) { [0]=> string(3) "05c" [1]=> string(3) "06d" }
[11]=> array(2) { [0]=> string(3) "05c" [1]=> string(3) "07e" }
[12]=> array(2) { [0]=> string(3) "05c" [1]=> string(3) "09a" }
[13]=> array(2) { [0]=> string(3) "05d" [1]=> string(3) "07e" }
[14]=> array(2) { [0]=> string(3) "05d" [1]=> string(3) "08a" }
[15]=> array(2) { [0]=> string(3) "05d" [1]=> string(3) "08b" }
[16]=> array(2) { [0]=> string(3) "05d" [1]=> string(3) "09a" }
[17]=> array(2) { [0]=> string(3) "05e" [1]=> string(3) "08a" }
[18]=> array(2) { [0]=> string(3) "05e" [1]=> string(3) "08e" }
[19]=> array(2) { [0]=> string(3) "05e" [1]=> string(3) "10a" }
[20]=> array(2) { [0]=> string(3) "05f" [1]=> string(3) "06c" }
[21]=> array(2) { [0]=> string(3) "05f" [1]=> string(3) "07b" }
[22]=> array(2) { [0]=> string(3) "05f" [1]=> string(3) "09d" }
[23]=> array(2) { [0]=> string(3) "06a" [1]=> string(3) "09c" }
[24]=> array(2) { [0]=> string(3) "06c" [1]=> string(3) "08a" }
[25]=> array(2) { [0]=> string(3) "06c" [1]=> string(3) "09e" }
[26]=> array(2) { [0]=> string(3) "06d" [1]=> string(3) "06f" }
[27]=> array(2) { [0]=> string(3) "06d" [1]=> string(3) "08c" }
[28]=> array(2) { [0]=> string(3) "06e" [1]=> string(3) "08b" }
[29]=> array(2) { [0]=> string(3) "06f" [1]=> string(3) "08b" }
[30]=> array(3) { [0]=> string(3) "06f" [1]=> string(3) "08b" [2]=> string(3) "09c" }
[31]=> array(2) { [0]=> string(3) "06f" [1]=> string(3) "09c" }
[32]=> array(2) { [0]=> string(3) "06f" [1]=> string(3) "10b" }
[33]=> array(2) { [0]=> string(3) "06f" [1]=> string(3) "10c" }
[34]=> array(2) { [0]=> string(3) "07c" [1]=> string(3) "08c" }
[35]=> array(2) { [0]=> string(3) "07c" [1]=> string(3) "09a" }
[36]=> array(2) { [0]=> string(3) "07d" [1]=> string(3) "07e" }
[37]=> array(2) { [0]=> string(3) "07d" [1]=> string(3) "09c" }
[38]=> array(2) { [0]=> string(3) "07e" [1]=> string(3) "10a" }
[39]=> array(2) { [0]=> string(3) "07e" [1]=> string(3) "10c" }
[40]=> array(2) { [0]=> string(3) "08a" [1]=> string(3) "08c" }
[41]=> array(3) { [0]=> string(3) "08a" [1]=> string(3) "08c" [2]=> string(3) "09c" }
[42]=> array(2) { [0]=> string(3) "08a" [1]=> string(3) "08d" }
[43]=> array(3) { [0]=> string(3) "08a" [1]=> string(3) "08d" [2]=> string(3) "10e" }
[44]=> array(2) { [0]=> string(3) "08a" [1]=> string(3) "09c" }
[45]=> array(2) { [0]=> string(3) "08a" [1]=> string(3) "10e" }
[46]=> array(2) { [0]=> string(3) "08b" [1]=> string(3) "09c" }
[47]=> array(2) { [0]=> string(3) "08b" [1]=> string(3) "09d" }
[48]=> array(2) { [0]=> string(3) "08c" [1]=> string(3) "09c" }
[49]=> array(2) { [0]=> string(3) "08c" [1]=> string(3) "09d" }
[50]=> array(2) { [0]=> string(3) "08c" [1]=> string(3) "10c" }
[51]=> array(2) { [0]=> string(3) "08d" [1]=> string(3) "10a" }
[52]=> array(2) { [0]=> string(3) "08d" [1]=> string(3) "10e" }
[53]=> array(2) { [0]=> string(3) "08e" [1]=> string(3) "10b" } }
[/CODE]

Nun müssten aus dem zweiten Array die Einträge derart gelöscht werden, dass es am Ende möglichst wenige Termine gibt, wobei jedoch alle Klassen vorkommen müssen (wenn z.B. die 5a mit der 6c parallel gelegt wird fallen ja alle anderen Kombinationen mit 5a und 6c weg). Die Frage wäre, mit welcher Strategie kann ich hier optimieren?

Ich dachte zunächst daran, die erste Kombination zu nehmen und anschließend alle mit ihr verbundenen Einträge zu löschen, dann die nächste noch verfügbare Klasse zu nehmen etc. und am Ende zu zählen, wie viele Termine übrigbleiben, anschließend wieder die erste Kombination wählen und dann die übernächste noch verfügbare Klasse zu nehmen etc... und am Ende zu schauen, welche Variante die wenigsten Termine produziert.
Dieses Verfahren dürfte jedoch bei einer so großen Datenlage nicht funktionieren

Ich hoffe das Problem ist einigermaßen verständlich gemacht worden.
Für Vorschläge wäre ich sehr dankbar.

Viele Grüße
Andreas



  Profil  Quote  Link auf diesen Beitrag Link
Kitaktus
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 11.09.2008
Mitteilungen: 5464
Aus: Niedersachsen
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.1, eingetragen 2018-08-21


Das zugrunde liegende Problem ist ein Graph-Färbeproblem.
Die Knoten sind die einzelnen Klassen. Zwei Knoten sind verbunden, wenn die Klassenkonferenzen nicht gleichzeitig stattfinden können.
Die Knoten sind nun mit möglichst wenigen Farben zu färben (jede Farbe entspricht einem Termin), so dass benachbarte Knoten immer verschiedene Farben haben.
Unter diesen Stichworten (Graph, Färbung) findet man sicher einiges, z.B. hier.

Ein einfacher Ansatz, der zumindest die Komplexität des Problems verringern kann, ist folgender:
Alle Klassen, die mit keiner anderen Klasse überschneidungsfrei sind, benötigen offensichtlich einen eigenen Termin.
Klassen, die mit genau einer anderen Klasse überschneidungsfrei sind, können mit dieser anderen Klasse einen gemeinsamen Termin bekommen.

Wendet man diese beide Regeln an, so kann es passieren, dass weitere Klassen keinen oder nur noch einen möglichen Partner haben. Auf diese Klassen können dann die Regeln wieder angewendet werden.

Bei deinem konkreten Beispiel kann man damit das ganze Problem auf 5 Klassen reduzieren (5a, 5e, 10a, 8d und 10e), bei denen man leicht sieht, dass 3 Termine notwendig sind (weil es keine Dreiergruppe mehr gibt).

Bei einem allgemeingültigen Algorithmus müsste man an der Stelle eine Heuristik anwenden (z.B. wähle die größte Gruppe aus, die paarweise überschneidungsfrei ist), oder einen Branch-and-Bound-Algorithmus (oder ähnliches), was in der Programmierung schon relativ komplex ist.



  Profil  Quote  Link auf diesen Beitrag Link
afinckh
Neu Letzter Besuch: im letzten Monat
Dabei seit: 20.08.2018
Mitteilungen: 2
Aus:
Zum letzten BeitragZum nächsten BeitragZum vorigen BeitragZum erstem Beitrag  Beitrag No.2, vom Themenstarter, eingetragen 2018-08-22


Lieber Kitaktus,

haben Sie vielen Dank für Ihren Beitrag. Ich habe mir die genannten Algorithmen angesehen. Sie klingen plausibel und sinnvoll, mir fehlt jedoch gerade die Fantasie, wie ich diesen Branch-and-Bound-Algorithmus programmiertechnisch umsetzen kann.

Daher werde ich mich ersteinmal am einfachen Ansatz programmiertechnisch abarbeiten.

Hierzu habe ich, man verzeihe es mir, einen Doppelpost auf php.de eingestellt, da dort sicherlich mehr Personen unterwegs sind, die mir Programmiertechnisch helfen können.
Ich werde aber nach Fertigstellung des Codes, eine Version hier in diesem Thread veröffentlichen.

Viele Grüße und nochmals besten Dank.
afinckh



  Profil  Quote  Link auf diesen Beitrag Link
afinckh hat die Antworten auf ihre/seine Frage gesehen.
Das Thema wurde von einem Senior oder Moderator abgehakt.
afinckh wird per Mail über neue Antworten informiert.
Neues Thema [Neues Thema]  Druckversion [Druckversion]

 


Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2018 by Matroids Matheplanet
This web site was made with PHP-Nuke, a web portal system written in PHP. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]