{"id":18607756,"url":"https://github.com/cfries/clustering","last_synced_at":"2025-11-02T15:30:35.410Z","repository":{"id":77716889,"uuid":"356860537","full_name":"cfries/clustering","owner":"cfries","description":"Brute Force Bisection (Splitting) of a Set into two Groups based on Mandatory Constraints and Preferences (EXPERIMENTAL!)","archived":false,"fork":false,"pushed_at":"2021-04-12T06:28:33.000Z","size":22,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2024-12-27T00:40:54.079Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cfries.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-04-11T12:23:01.000Z","updated_at":"2021-12-11T11:50:07.000Z","dependencies_parsed_at":"2023-08-22T17:33:42.886Z","dependency_job_id":null,"html_url":"https://github.com/cfries/clustering","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfries%2Fclustering","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfries%2Fclustering/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfries%2Fclustering/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cfries%2Fclustering/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cfries","download_url":"https://codeload.github.com/cfries/clustering/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":239396510,"owners_count":19631464,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-07T02:31:09.588Z","updated_at":"2025-11-02T15:30:35.336Z","avatar_url":"https://github.com/cfries.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"Bisection\n==========\n\n****************************************\n\n**Teilung einer Menge in zwei Gruppen basierend auf Nebenbedingungen und Präferenzen**\n\n****************************************\n\nDas Programm nimmt mittels \"Brute-Force\" eine Teilung einer Menge von Elementen (z.B. Schülern) in zwei Gruppen A und B vor.\nDabei werden zwei Arten von Bedingungen berücksichtigt:\n\n- Nebenbedingungen, dass in der Gruppe A exakt n Schüler sein müssen für die eine Kriterium X den Wert x hat. Ein solches Kriterium kann z.B. sein X = \"2. Fremdsprache\", \"x = Latein\". Es können beliebig viele Kriterien vorgegeben werden (\"2. Fremdsprache\", \"Religion\", etc.) und für jedes Kriterium beliebig viele Ausprägungen (\"Latein\", \"Spanisch\", \"Französisch\").\n\n- Präferenzen, dass ein Element (z.B. Schüler) falls möglich mit einem anderen Element (z.B. befreundeter Schüler aus Lerngruppe, etc.) in der gleichen Gruppe sein soll.\n\nMotivation für diese Optimierung ist die Einteilung in zwei Gruppen für einen Wechselunterricht zur Reduktion der Ausbreitung einer Infektion (R-Wert). Dabei wird berücksichtig, ob Schüler außerhalb der Schule kontakt haben.\n\nAnmerkung\n-------\n\nEs handelt sich hier um ein Projekt für den Eigengebrauch ohne Anspruch auf Benutzerfreundlichkeit. Wenn es für andere nützlich ist, kann ich es nach Feedback - sofern möglich - gerne weiter entwicklen. Hierzu könnte man ein Issue hier auf GitHub öffnen.\n\nWarum Brute Force?\n-------\n\nDer Algorithmus enumeriert Brute-Force alle Kombinantion. Es sind hier sicher andere Ansätze möglich (e.g. auch Monte-Carlo Methoden), allerdings besitzt Brute Force den Charm, dass man garantieren kann, dass alle möglichen Szenarien betrachtet wurden. Für eine Klasse von 29 Elementen mit 500 Millionen möglichen Kombination benötigt das Programm ca. 30 Sekunden.\n\nBenutzung\n-------\n\nDas Programm besitzt aktuell kein GUI und keine Datenschnittstelle, sondern nur den nakten, einfachen Algorithmus. Auch gibt es noch keine Dokumentation. Wer sich mit Java auskennt könnte es trotzdem schon nutzen.\n\nIn der `main()`-methode von `com.christianfries.clustering.Bisection` findet sich ein Beispiel, dass angepasst werden kann.\n\nEs wird zuerst die Grundmenge als \"Liste\" definiert. Für jede `Node` wird dabei als Argument spezifiziert welche Ausprägungen einzelne Kategorien haben. Dies ist eine Liste von Integern (Ausprägung). `List.of(a,b)` bedeutet z.B., dass die erste Kategorie die Ausprägung a hat und die zweite Kategorie die Ausprägung b.\n\n```\n\t\tfinal List\u003cNode\u003e nodes = new ArrayList\u003c\u003e();\n\t\tnodes.add(new Node(List.of(0,0)));\n\t\tnodes.add(new Node(List.of(1,0)));\n\t\tnodes.add(new Node(List.of(0,1)));\n```\nDas Beispiel oben legt 3 Schüler an. Wenn die erste Kategorie \"2. Fremdsprache\" ist mit den Werten 0=Französisch, 1=Latein und die zweite Katregorie \"Religion\" mit den Werten 0=kat., 1=ev., dann haben die Schüler (Französisch,kat.), (Latein,kat.), (Französisch,ev.).\n\nSodann wird definiert welche Größen die Ausprägungen in Gruppe A haben sollen. Dies wird als `int[][]`-Matrix spezifiziert. So ist z.B.\n\n```\n\t\tfinal int[][] mandatorySizes = new int[][] { new int[] {9,6}, new int[] {8,6,1} };\n```\n\nDie Spezifikation, dass die erste Kategorie 9 Element mit Ausprägung 0 und 6 Elemente mit Ausprägung 1 haben soll und die zweite Kategorie 8 Elemente mit Ausprägung 0, 6 Elemente mit Ausprägung 1, 1 Element mit Ausprägung 2. Aktuell müssen exakt diese Größen getroffen werden. Eine Erwerterung, dass Bereiche erlaubt sind wäre hier einfach möglich.\n\nDie Präferenzen der Elemente wird als `Map` definiert\n\n```\n\t\tfinal Map\u003cNode, List\u003cPreference\u003e\u003e perferences = new HashMap\u003cNode, List\u003cPreference\u003e\u003e();\n```\ndie für jede `Node` ein oder mehrere Präferenzen definiert. Eine Präferenz ist ein Paar bestehend aus einer anderen Node und einem Gewicht (das z.B. eine Priorität ausdrückt).\n\nDas Programm gibt dann eine Tabelle mit den ersten 100 besten Aufteilungen aus.\n\n\nPrerequisite\n-------\n\nThe project uses Maven an build management tool and requires Java 11 or better.\n\nRunning from Command Line / Terminal\n-------\n\nIf have you git, Maven and Java 11 (or better) installed you may check it out and run it via\n```\ngit clone https://github.com/cfries/clustering\ncd clustering\nmvn install exec:java -Dexec.mainClass=com.christianfries.clustering.Bisection\n```\n\n\nLicense\n-------\n\nThe code of package \"com.christianfries.clustering\" is distributed under the [Apache License version\n2.0][], unless otherwise explicitly stated.\n \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcfries%2Fclustering","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcfries%2Fclustering","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcfries%2Fclustering/lists"}