Bibliothek für NP-harte Zuordnung gesucht.

Anja-Schaefer

Neues Mitglied
Hallo,

ich habe ein Problem, weiss aber nicht genau, wie ich es exakt einordnen kann. Ich habe durch mein Nebenfach ein wenig in die Themen Programmierung/Informatik reingeschnuppert, bin aber alles andere als ein Experte.

Zum Problem: Ich möchte ein Programm entwickeln, dass eine Menge von Personen optimal zu Kursgruppen zuordnet. Dort sollen sie gemeinsam lernen. Nehmen wir an, es sind ca. 200 Anmeldungen. Nun gibt es einige Randbedingungen:

- Die Personen haben einen gewissen Kenntnisstand. Die Gruppen sollen alle möglichst homogen sein, dh alle Teilnehmer einen ähnlichen Kenntnisstand haben.
- Die Gruppen kommen zu unterschiedlichen Terminen zusammen. Hier sollen die Teilnehmer Präferenzen nennen.
- Einige Teilnehmer kennen sich schon vorher und möchten gerne gemeinsam in eine Gruppe. Dies soll nach Möglichkeit berücksichtigt werden.

Meine schwachen Erinnerungen sagen mir, dass das jetzt irgendwas mit Constraints, NP-Hart, Optimierung oder irgendwas ähnlichem zu tun haben müsste.

Kann mir jemand sagen, in welcher Richtung ich hier weitersuchen sollte? Es macht ja sicher keinen Sinn, hier eine Lösung komplett von vorne zu programmieren. Da gibt es doch bestimmt Bibliotheken.

Kann mir jemand da ein paar Stichworte oder Bibliotheken nennen, nach denen ich suchen kann?

Freue mich über jeden Hinweis!
 
T

Tomate_Salat

Gast
Optimierung ist immer gut, Constraints haben etwas mit Datenbanken zu tun.

Hast du bereits einen Ansatz? Soll das ganze später ein GUI haben? Wieviel hast du schon in Java programmiert?
 
S

SlaterB

Gast
ne GUI? was ist das denn für eine Frage, es geht hier um ein extrem komplexes Problem,
zu dem man eine Zauberlösung wie Dijkstra bei Graphen braucht, nur weitaus größer, da interessiert das drumherum doch nicht,

Ansatz kann man auch fast vergessen, entweder was für Wochen zu modellieren (allein die Eingabe/ Gewichung/ Einbindung der noch völlig unklaren Faktoren 'Präferenzen') oder es gibt ein größeres fertiges Tool dafür,
danach ist gefragt
 
F

FlorianP

Gast
Zuerst brauchst du wohl eine Art "Kostenfunktion" die das ganze nach "gut" und "schlecht" bewertet. Davon hängt dann vieles ab, wohl auch ob es (effizient) exakt lösbar ist oder ob du dich mit einer Näherungslösung zufrieden geben musst.

Wenn z.B. deine Kostenfunktion den Kenntnisstand extrem hoch bewertet, wirds wohl ziemlich einfach, die Teilnehmer nach Kenntnisstand sortieren und dann die Gruppen auswählen und am Rand bei ähnlichem Kenntnisstand den Rest (wie Sympathie) berücksichtigen. Wenn alle Faktoren gleich wichtig sind, wirds wohl eher schwer werden eine exakte Lösung (in vernünftiger Zeit) zu bekommen, dann wird's wohl NP-hart.
 

fastjack

Top Contributor
@Tomate_Salat Gerade bei NP hast Du Constraints ;) Die sind aber nicht mit denselbigen in Datenbanken zu verwechseln.

Eine Bibliothek in Java, die grundlegende Algorithmen oder so für NP anbietet ist mir nicht bekannt, nur viele Java-Lösungen für konkrete Probleme. Aber die gibt es bei google massig.
 
D

Dow Jones

Gast
Kann mir jemand da ein paar Stichworte oder Bibliotheken nennen, nach denen ich suchen kann?

Hmm, das schon, aber die Anwendung der gängigen Methoden um solche Optimierungsprobleme zu bearbeiten (z.B. Integer Linear Programming oder Simulated Annealing) ist nicht so ganz trivial.

Wie FlorianP schon schrieb wirst du kaum darum herum kommen dein gewünschtes Optimierungsziel in Form von mathematischen Formeln zu formulieren, und das kann durchaus recht aufwendig werden. Zumal wenn die Anforderungen an die Lösung nur umgangssprachlich und vage vorgegeben sind ("soll", "nach Möglichkeit" etc).

Ich würde vorschlagen du nimmst dir mal einen Nachmittag Zeit um das Problem mathematisch zu formulieren. Dazu stellst du Formeln auf mit denen sich die Güte einer konkreten Verteilung der Personen auf Kursgruppen berechnen lässt (in der Literatur oftmals als Fitnessfunktion bezeichnet). Dabei sollte man ruhig kleinschrittig vorgehen, das hilft sehr die Übersicht zu behalten.

Fangen wir einfach mal an Formeln für die verschiedenen Kriterien aufzustellen, die wir für die Berechnung der Güte einer Lösung benötigen. Als erstes nehmen wir uns das Kriterium "homogener Kentnisstand der Teilnehmer" vor. Mathematisch formuliert könnte das so aussehen:

Code:
wissensdifferenz_zweier_personen (p1, p2) = wissensstand (p1) - wissensstand (p2)
quadratische_wissensdifferenz_zweier_personen (p1, p2) = wissensdifferenz_zweier_personen (p1, p2) ^ 2
Es bietet sich an die Wissensdifferenz zu quadrieren, denn
1) müssen wir dann das Vorzeichen der Ergebnisses nicht weiter berücksichtigen. nach der quadrierung es ist immer positiv
2) große Wissensdifferenzen werden "verstärkt". wenn wir später die Summe aller (quadratischen) Wissensdifferenzen der Teilnehmer in einer Kursgruppe bilden, dann ist eine große Wissensdifferenz schwerwiegender als 10 kleine Wissensdifferenzen.

Weiter geht's:
Code:
kursgruppe_von_person ( p ) = ...
ist_person_in_gruppe ( g, p ) = 0 ^ ( g - kursgruppe_von_person (p) )
sind_personen_in_gruppe ( g, p1, p2 ) = ist_person_in_gruppe (g, p1) * ist_person_in_gruppe (g, p2)
Die Funktion kursgruppe_von_person ( p ) soll für eine Person p die Nummer seiner Kursgruppe liefern. Diese ist aber leider unbekannt (denn genau das wollen wir ja schlußendlich ermitteln, in welche Gruppe wir eine Person einordnen sollen). Dazu schreibe ich weiter unten etwas.
Die Funktion is_person_in_gruppe(g, p) sieht vielleicht ersteinmal merkwürdig aus, aber hier machen wir uns eine mathematische "Obskurität" zunutze:
0^0 = 1,
0^irgendwas anderes = 0
Unsere Funktion liefert genau dann den Wert 1 wenn Person p in Gruppe Nummer g ist. In allen anderen Fällen liefert sie den Wert 0.
Ähnlich auch die nächste Funktion: sind_personen_in_gruppe(g, p1, p2) liefert genau dann 1 wenn p1 und p2 in Gruppe g sind. sonst ist das Ergebnis 0.

Die bisherigen Formeln können wir nun nutzen um die Wissensschwankung ein einer Gruppe zu berechnen:
Code:
wissensschwankung_in_gruppe ( g ) = 
   [Summe von x=1 bis x=anzahl_von_angemeldeten_personen] 
      [Summe von y=(x+1) bis y=anzahl_von_angemeldeten_personen]  
         sind_personen_in_gruppe (g, x, y) * quadratische_wissensdifferenz_zweier_personen (x, y)
Durch die doppelte Summe werden alle Personenpaare gebildet und jeweils deren Wissensdifferenz berechnet. Die Wissensdifferenz zweier Personen werden dabei entweder mit 1 (wenn beide Personen in der gleichen Gruppe sind) oder mit 0 (wenn sie in unterschiedlichen Gruppen sind) multipliziert. wissensschwankung_in_gruppe ( g ) berechnet also die Summe der quadratischen wissensschwankungen aller personen, die in Gruppe g sind. Das ist ein Wert, für den gilt: Je kleiner, desto besser.


Auf diese Weise kann man das gesamte Problem in Form von mathematischen Formeln bringen. Was dann noch übrig bleibt sind die Parameter. Dabei gibt es zum einen Konstanten (wie z.B. der Wissensstand von Person x), die muss man halt kennen und irgendwo angeben. Zum anderen gibt es Variablen, die man nicht kennt sondern erfahren möchte (z.B. die Kursgruppe von Person x). Und dazu kann man nun einen sogenannten ILP-Solver verwenden. Das kann man sich vorstellen wie ein Programm, das alle Möglichkeiten ausprobiert Personen in Kursgruppen einzuordnen, und dann am Ende eine Lösung ausgibt.

Damit das funktioniert muss man diesem ILP-Solver natürlich die ganzen Formeln und Konstanten übergeben. Und zusätzlich auch noch Bedingungen, die man erfüllt haben möchte:
Code:
1 <= anzahl_von_gruppen <= 10
quadratische_wissensschwankung_in_den_gruppen : MINIMIZE
Damit würde der ILP-Solver nach einer Lösung suchen, bei der es zwischen 1 und 10 Kursgruppen gibt, und bei der die die minimalste Wissensschwankung in den Gruppen auftritt.

Das ganze Verfahren macht auf den ersten Blick zwar einen aufwändigen Eindruck, aber wenn man erstmal verstanden hat wie das System funktioniert, dann kann man damit schon zurechtkommen. :)


PS: Freie ILP-Solver gibt es genug, Links finden sich in der Wikipedia. Empfehlen kann ich aber keinen, da ich bisher auch nur einmal mit so einem Teil gearbeitet habe
PPS: Nur der Vollständigkeit halber - die ILP-Solver probieren natürlich nicht wirklich alle Möglichkeiten aus, die arbeiten schon etwas pfiffiger. Sonst dürfte man wahrscheinlich 20 Jahre auf die Lösung warten...
 

Landei

Top Contributor
Na ja, ich würde "Kosten" zuordnenen (z.B. für Wissensunterschiede, Auseinanderreißen von Bekannten, zu große oder zu kleine Gruppen) und dann einen genetischen Algorithmus auf das Dingens loslassen. Dazu finden sich auch Bibliotheken (JGAP: Java Genetic Algorithms Package nach kurzem googeln). Soweit ich weiß kann man über eine geschickte Konstenzuordnung recht gute Ergebnisse erzielen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
krgewb Java-Bibliothek für ONVIF Allgemeine Java-Themen 1
L Bibliothek für kommerizielle Anwendungen validieren? Allgemeine Java-Themen 0
R Bibliothek für Darstellung von char auf 5x7 Dot-Matrix Allgemeine Java-Themen 2
as182005 Bibliothek für Graph Visualisierung gesucht Allgemeine Java-Themen 3
S Bibliothek für Quellcodeerzeugung Allgemeine Java-Themen 3
M Java Bibliothek für Kennzahlen Visualisierung Allgemeine Java-Themen 2
H Java Bibliothek für UML Diagramme? Allgemeine Java-Themen 2
G Bibliothek für Port? Allgemeine Java-Themen 2
A Java PDF Bibliothek für Volltextsuche Allgemeine Java-Themen 2
Luma OpenSource-Bibliothek für den Zugriff auf USB- und COM-Ports Allgemeine Java-Themen 8
C Bibliothek o. ä. für SPS-Bausteinsimulation Allgemeine Java-Themen 3
X Java gewerblich nutzen mit externe Bibliothek. Was zu beachten? Allgemeine Java-Themen 18
A Java ListNode Element einfügen ohne Bibliothek Allgemeine Java-Themen 6
S Bibliothek gleichzeitig fuers JDK und Android entwickeln Allgemeine Java-Themen 8
G JavaDocu in eigener Bibliothek Allgemeine Java-Themen 2
R Input/Output Programmierung mithilfe der Robot Bibliothek Allgemeine Java-Themen 15
M Suche aktuelle Apache Poi Bibliothek zum Einbinden in mein Programm Allgemeine Java-Themen 2
Pr0m3theus Buch Java-Standart-Bibliothek Allgemeine Java-Themen 1
J eigene Java Bibliothek Allgemeine Java-Themen 2
J Beste Musik Bibliothek Allgemeine Java-Themen 12
J Java PIM-Bibliothek Allgemeine Java-Themen 0
Developer_X Geographie Bibliothek Allgemeine Java-Themen 4
M Serielle Schnittstelle ansteuern - mit Processing Bibliothek Allgemeine Java-Themen 4
K Java Mathematik Bibliothek Allgemeine Java-Themen 3
R JavaScript cruncher als Java Bibliothek Allgemeine Java-Themen 4
Guybrush Threepwood Neuronale Netzwerke - Bibliothek gesucht Allgemeine Java-Themen 3
D NetBeans Bibliothek kann nicht genutzt werden Allgemeine Java-Themen 5
R Fehler: Bibliothek bereits geladen Allgemeine Java-Themen 3
S Eigene Bibliothek Allgemeine Java-Themen 2
SuperSeppel13 Packete der Java Bibliothek ins eigene Prjekt integrieren Allgemeine Java-Themen 4
G ANT Tutorial . Schritte bzgl. Junit Bibliothek Allgemeine Java-Themen 4
M *.dll Datei (Bibliothek) in Eclipse einbinden Allgemeine Java-Themen 9
O Java Bibliothek Allgemeine Java-Themen 5
G Bibliothek-Mathematik (Statistik) Allgemeine Java-Themen 2
J Bibliothek gesucht Ana_lysieren von wss. Referenzen Allgemeine Java-Themen 2
Luma Arbeitsverzeichnis innerhalb externen Bibliothek ändern Allgemeine Java-Themen 2
0 Konfiguration lesen / schreiben - Bibliothek dafür? Allgemeine Java-Themen 3
B Drucken - welche Bibliothek favorisiert Ihr? Allgemeine Java-Themen 16
B ASCII-Gui Bibliothek Allgemeine Java-Themen 2
J c++ Bibliothek einbinden Allgemeine Java-Themen 16
DEvent Bibliothek zur Konsolenprogrammierung Allgemeine Java-Themen 6
M Java Bibliothek Allgemeine Java-Themen 3
M BrowsCap Bibliothek Allgemeine Java-Themen 6
P Grafik Bibliothek Allgemeine Java-Themen 4
B Bug in JIMI Bibliothek Allgemeine Java-Themen 3
F Neue Bibliothek dem JDK hinzufügen Allgemeine Java-Themen 5
B Algorithmus für Arbeit mit fehlenden Listenelementen? Allgemeine Java-Themen 1
kodela Eingabe für TextArray bedingt sperren Allgemeine Java-Themen 3
Karl_Der_Nette_Anfänger Hat wer ne Lösung für verknüpfte Postleitzahlen? (Baum/Wurzel Struktur) Allgemeine Java-Themen 11
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
G KeyListener für JTextField Allgemeine Java-Themen 5
webracer999 Library für Textsuche (z. B. include/exclude, and/or)? Allgemeine Java-Themen 5
I Module-Info für Jar erzeugen Allgemeine Java-Themen 7
B Simpler Eventlistener für Tastaturtaste bauen? Allgemeine Java-Themen 13
_user_q Eingegebenen Text Zeile für Zeile ausgeben lassen Allgemeine Java-Themen 11
E Key für TOTP Algorythmus(Google Authentificator) Allgemeine Java-Themen 0
S Formel für Sonnenwinkel in ein Programm überführen Allgemeine Java-Themen 11
M pfx-Zertifikat in Tomcat für SSL-Verschlüsselung nutzen Allgemeine Java-Themen 14
R Best Practice Erfahrungswerte für eine Migration von JSF nach Angular (oder anderes JS-Framework) Allgemeine Java-Themen 1
B HeapSort für Array of Strings funktioniert nur teilweise Allgemeine Java-Themen 3
jhCDtGVjcZGcfzug Klassen Was genau passiert hier? Kann mir das jemand bitte Zeile für Zeile erklären? Allgemeine Java-Themen 1
rosima26 Bester Sortieralgorithmus für kurze Arrays Allgemeine Java-Themen 40
S Mit Methoden kann man definieren für was <T> steht. Geht das auch irgendwie für Variablen? Allgemeine Java-Themen 12
MangoTango Operatoren while-Schleife für Potenz Allgemeine Java-Themen 3
B Lottospiel, genug Reihen tippen für 3 Richtige (Spaß mit Arrays)? Allgemeine Java-Themen 46
B Mit welchen Datentypen und Strukturierung am Besten dutzende Baccaratspiele Shcritt für Schritt durchsimulieren? Allgemeine Java-Themen 26
D Klassendesign für einen Pascal Interpreter Allgemeine Java-Themen 6
I OCR Library für Belegerkennung Allgemeine Java-Themen 7
farah GetterMathod für Farbkanäle Allgemeine Java-Themen 6
B Welcher Datentyp für sehr große Zahlenbereiche? Allgemeine Java-Themen 1
S Webservices für binäre Daten? Allgemeine Java-Themen 5
G Licence-Header für InHouse entwickelten Source Allgemeine Java-Themen 8
M Schleife für einen TicTacToe Computer Allgemeine Java-Themen 5
O git ignore für Intellji braucht es die .idea Dateien? Allgemeine Java-Themen 8
F Java Script für das Vorhaben das richtige? Allgemeine Java-Themen 9
M wiviel Java muss ich für die Berufswelt können ? Allgemeine Java-Themen 5
Robertop Datumsformat für GB ab Java 16 Allgemeine Java-Themen 1
Thallius Verschiedene entities für gleichen Code…. Allgemeine Java-Themen 8
OnDemand Zentrale "Drehscheibe" für verschiedene APIs Allgemeine Java-Themen 14
S Übergabe eines Sortierkriteriums für ein Artikel Array mittels BiPredicate<Artikel, Artikel> Allgemeine Java-Themen 13
F Streams als Alternative für dieses Problem ? Allgemeine Java-Themen 15
D SHA-3 für Java-version 1.8 Allgemeine Java-Themen 1
N Validator für einen SQL-Befehl Allgemeine Java-Themen 22
Muatasem Hammud Erstellung von Testdaten für Arrays Allgemeine Java-Themen 6
B Logikfehlersuche, das perfekte Lottosystem für 3 Richtige mit Arraylists? Allgemeine Java-Themen 61
G Methoden für die Zukunft sinnvoll? Allgemeine Java-Themen 4
M API für PLZ Umkreissuche Allgemeine Java-Themen 3
1Spinne JDK 8 für Eclipse installieren Allgemeine Java-Themen 5
Tobero Meine Funktion für das beinhalten eines Punktes in einem Kreis funktioniert nicht Allgemeine Java-Themen 5
L Methoden Parser für gängige Datumsformate? Allgemeine Java-Themen 1
H Interface PluginSystem ClassNotFound exception für library Klassen Allgemeine Java-Themen 10
N relativier Pfad für sqlite-Datenbank in Gradle/IntelliJ Allgemeine Java-Themen 2
buchfrau Anagram für beliebiges Wort Allgemeine Java-Themen 2
TonioTec Api für Datenaustausch zwischen Client und Server Allgemeine Java-Themen 0
W Suche Ursache für NPE - woher kommt sie? (Hilfe beim Debugging) Allgemeine Java-Themen 19
Kirby.exe Distanz Map für die Distanztransformation erstellen Allgemeine Java-Themen 1
F PI Regler für Heizung Allgemeine Java-Themen 7
8u3631984 Generelle Log4j.xml für alle Module Allgemeine Java-Themen 5
M Wie übergebe ich den Zähler für die Anzahl Rekursionsschritte korrekt? Allgemeine Java-Themen 2
B Login für User, der im Hintergrund Schedules ausführt Allgemeine Java-Themen 16

Ähnliche Java Themen

Neue Themen


Oben