From 6c58de656446e5dab54fd77777133d6c6996e9bb Mon Sep 17 00:00:00 2001 From: JohanGrims Date: Tue, 5 Nov 2024 23:04:26 +0100 Subject: [PATCH] refactor(workflow): optimize deployment steps for Firestore rules --- python/assign.ipynb | 398 -------------------------------------------- 1 file changed, 398 deletions(-) delete mode 100644 python/assign.ipynb diff --git a/python/assign.ipynb b/python/assign.ipynb deleted file mode 100644 index 022fa59..0000000 --- a/python/assign.ipynb +++ /dev/null @@ -1,398 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 2, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Defaulting to user installation because normal site-packages is not writeable\n", - "Requirement already satisfied: pulp in c:\\users\\johan\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (2.9.0)\n", - "Defaulting to user installation because normal site-packages is not writeable\n", - "Requirement already satisfied: pandas in c:\\users\\johan\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (2.2.2)\n", - "Requirement already satisfied: numpy>=1.26.0 in c:\\users\\johan\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from pandas) (2.1.1)\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in c:\\users\\johan\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from pandas) (2.9.0.post0)\n", - "Requirement already satisfied: pytz>=2020.1 in c:\\users\\johan\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from pandas) (2024.2)\n", - "Requirement already satisfied: tzdata>=2022.7 in c:\\users\\johan\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from pandas) (2024.1)\n", - "Requirement already satisfied: six>=1.5 in c:\\users\\johan\\appdata\\local\\packages\\pythonsoftwarefoundation.python.3.12_qbz5n2kfra8p0\\localcache\\local-packages\\python312\\site-packages (from python-dateutil>=2.8.2->pandas) (1.16.0)\n" - ] - } - ], - "source": [ - "!pip install pulp\n", - "!pip install pandas" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "{0: {'title': 'Wir vs. Müll', 'max': np.int64(15)}, 1: {'title': 'Kreatives Schreiben', 'max': np.int64(10)}, 2: {'title': 'Volleyball', 'max': np.int64(12)}, 3: {'title': 'Musik-Produktion am PC', 'max': np.int64(10)}, 4: {'title': 'Vegan kochen & backen', 'max': np.int64(12)}, 5: {'title': 'Schmuck mit Perlen', 'max': np.int64(12)}, 6: {'title': 'Die Welt – was sie bewegt und wem sie gehört', 'max': np.int64(15)}, 7: {'title': 'Fußball', 'max': np.int64(22)}, 8: {'title': 'Bouldern', 'max': np.int64(10)}, 9: {'title': 'Soziale Projekte', 'max': np.int64(8)}, 10: {'title': 'Beseeltes Schreiben', 'max': np.int64(15)}}\n", - "{0: {'title': 'Wir vs. Müll', 'max': np.int64(15)}, 1: {'title': 'Kreatives Schreiben', 'max': np.int64(10)}, 2: {'title': 'Volleyball', 'max': np.int64(12)}, 3: {'title': 'Musik-Produktion am PC', 'max': np.int64(10)}, 4: {'title': 'Vegan kochen & backen', 'max': np.int64(12)}, 5: {'title': 'Schmuck mit Perlen', 'max': np.int64(12)}, 6: {'title': 'Die Welt – was sie bewegt und wem sie gehört', 'max': np.int64(15)}, 7: {'title': 'Fußball', 'max': np.int64(22)}, 8: {'title': 'Bouldern', 'max': np.int64(10)}, 9: {'title': 'Soziale Projekte', 'max': np.int64(8)}, 10: {'title': 'Beseeltes Schreiben', 'max': np.int64(15)}}\n", - "{0: [5, 8, 4], 1: [5, 6, 4], 2: [5, 4, 6], 3: [5, 4, 0], 4: [4, 2, 6], 5: [7, 2, 8], 6: [4, 5, 0], 7: [2, 4, 3], 8: [7, 2, 6], 9: [3, 8, 4], 10: [4, 5, 7], 11: [4, 6, 5], 12: [4, 5, 7], 13: [2, 3, 7], 14: [10, 1, 4], 15: [8, 5, 2], 16: [3, 7, 8], 17: [3, 6, 7], 18: [5, 4, 9], 19: [4, 5, 1], 20: [5, 4, 9], 21: [3, 4, 8], 22: [7, 3, 2], 23: [2, 7, 9], 24: [2, 4, 8], 25: [2, 0, 4], 26: [5, 4, 6], 27: [2, 4, 7], 28: [7, 8, 2], 29: [5, 4, 3], 30: [6, 2, 1], 31: [3, 6, 8], 32: [5, 4, 9], 33: [4, 5, 7], 34: [5, 6, 0], 35: [7, 3, 4], 36: [4, 3, 9], 37: [8, 5, 4], 38: [4, 5, 2], 39: [2, 8, 0], 40: [8, 7, 6], 41: [8, 2, 7], 42: [2, 8, 7], 43: [7, 3, 8], 44: [3, 7, 2], 45: [5, 0, 4], 46: [2, 9, 4], 47: [5, 0, 8], 48: [7, 4, 5], 49: [7, 6, 10], 50: [6, 1, 5], 51: [2, 5, 7], 52: [4, 10, 9], 53: [4, 8, 7], 54: [4, 8, 6], 55: [7, 2, 3], 56: [5, 4, 9], 57: [5, 9, 4], 58: [3, 4, 1], 59: [7, 2, 9], 60: [2, 5, 1], 61: [4, 5, 6], 62: [4, 5, 8], 63: [7, 6, 3], 64: [9, 0, 10], 65: [5, 4, 6], 66: [4, 1, 0], 67: [4, 8, 0], 68: [4, 2, 6], 69: [5, 4, 3], 70: [6, 8, 10], 71: [8, 2, 3], 72: [8, 2, 7], 73: [7, 2, 8], 74: [4, 0, 5], 75: [4, 6, 10], 76: [2, 7, 6], 77: [5, 4, 3], 78: [2, 4, 3], 79: [5, 4, 8], 80: [5, 4, 1], 81: [5, 4, 6], 82: [5, 4, 6], 83: [3, 2, 7], 84: [7, 1, 4], 85: [8, 4, 2], 86: [3, 7, 2], 87: [4, 8, 3], 88: [3, 4, 5], 89: [2, 9, 4], 90: [2, 4, 3], 91: [3, 5, 4], 92: [7, 4, 5], 93: [8, 4, 2], 94: [2, 4, 0], 95: [5, 6, 0], 96: [3, 4, 6], 97: [2, 4, 0], 98: [4, 8, 7], 99: [4, 2, 10], 100: [5, 4, 9], 101: [4, 8, 3], 102: [5, 4, 0], 103: [2, 5, 1], 104: [3, 6, 8], 105: [4, 6, 5]}\n" - ] - }, - { - "name": "stderr", - "output_type": "stream", - "text": [ - "C:\\Users\\johan\\AppData\\Local\\Temp\\ipykernel_23500\\136023282.py:9: FutureWarning: Series.__getitem__ treating keys as positions is deprecated. In a future version, integer keys will always be treated as labels (consistent with DataFrame behavior). To access a value by position, use `ser.iloc[pos]`\n", - " projects = {i: {'title': projectsCSV.iloc[i][0], 'max': projectsCSV.iloc[i][2]} for i in range(len(projectsCSV))}\n" - ] - } - ], - "source": [ - "import pandas as pd\n", - "\n", - "projectsCSV = pd.read_csv(r'C:\\Users\\johan\\OneDrive\\Schule\\10. Klasse\\Schülerprojektwoche\\projects.csv', sep=';')\n", - "preferencesCSV = pd.read_csv(r'C:\\Users\\johan\\OneDrive\\Schule\\10. Klasse\\Schülerprojektwoche\\votes.csv', sep=';')\n", - "\n", - "\n", - "\n", - "# create a dictionary of the projects with a unique ID as key and the project name (first row) and the number of participants (third row) as value\n", - "projects = {i: {'title': projectsCSV.iloc[i][0], 'max': projectsCSV.iloc[i][2]} for i in range(len(projectsCSV))}\n", - "\n", - "print(projects)\n", - "\n", - "# Create preferences dictionary using project IDs instead of names\n", - "preferences = {\n", - " i: [\n", - " [key for key, value in projects.items() if value['title'] == row['1. Wahl']][0] if any(value['title'] == row['1. Wahl'] for value in projects.values()) else None,\n", - " [key for key, value in projects.items() if value['title'] == row['2. Wahl']][0] if any(value['title'] == row['2. Wahl'] for value in projects.values()) else None,\n", - " [key for key, value in projects.items() if value['title'] == row['3. Wahl']][0] if any(value['title'] == row['3. Wahl'] for value in projects.values()) else None\n", - " ]\n", - " for i, row in preferencesCSV.iterrows()\n", - "}\n", - "\n", - "print(projects)\n", - "print(preferences)" - ] - }, - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "106\n", - "11\n", - "{'first': 1, 'second': 2, 'third': 4}\n" - ] - } - ], - "source": [ - "import pulp\n", - "\n", - "# Anzahl der Teilnehmer und Kurse\n", - "num_participants = len(preferences)\n", - "num_courses = len(projects)\n", - "\n", - "# Scores für Präferenzen: 1 für erste Wahl, 2 für zweite Wahl, 4 für dritte Wahl\n", - "scores = {\n", - " 'first': 1,\n", - " 'second': 2,\n", - " 'third': 4\n", - "}\n", - "\n", - "# LP-Problem erstellen\n", - "problem = pulp.LpProblem(\"CourseAssignment\", pulp.LpMinimize)\n", - "\n", - "# Entscheidungsvariablen: x_ij ist 1, wenn Teilnehmer i Kurs j zugewiesen wird, sonst 0\n", - "x = pulp.LpVariable.dicts(\"x\", ((i, j) for i in range(num_participants) for j in range(num_courses)), cat=\"Binary\")\n", - "\n", - "# Überbuchungsvariablen: o_j ist 0 oder mehr, wenn Kurs j überbucht ist\n", - "o = pulp.LpVariable.dicts(\"o\", (j for j in range(num_courses)), lowBound=0, cat=\"Integer\")\n", - "\n", - "# Zielfunktion: Minimieren der Präferenz-Scores und Überbuchungsstrafen\n", - "problem += pulp.lpSum(\n", - " scores['first'] * x[i, preferences[i][0]] +\n", - " scores['second'] * x[i, preferences[i][1]] +\n", - " scores['third'] * x[i, preferences[i][2]]\n", - " for i in range(num_participants)\n", - ") + pulp.lpSum(10 * o[j] for j in range(num_courses))\n", - "\n", - "# Nebenbedingung: Jeder Teilnehmer wird genau einem Kurs zugewiesen\n", - "for i in range(num_participants):\n", - " problem += pulp.lpSum(x[i, j] for j in range(num_courses)) == 1\n", - "\n", - "# Nebenbedingung: Maximale Teilnehmeranzahl pro Kurs (mit Überbuchung)\n", - "for j in range(num_courses):\n", - " problem += pulp.lpSum(x[i, j] for i in range(num_participants)) <= projects[j]['max'] + o[j]\n", - "\n", - "# Präferenzzuweisung: Teilnehmer dürfen nur auf ihre 1., 2. oder 3. Wahl zugewiesen werden\n", - "for i in range(num_participants):\n", - " for j in range(num_courses):\n", - " if j not in preferences[i]:\n", - " problem += x[i, j] == 0\n", - "\n", - "# Problem lösen\n", - "problem.solve()\n", - "\n", - "print(num_participants)\n", - "print(num_courses)\n", - "print(scores)" - ] - }, - { - "cell_type": "code", - "execution_count": 12, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Status: Optimal\n", - "Teilnehmer 0 wurde Kurs 8 zugewiesen (2. Wahl)\n", - "Teilnehmer 1 wurde Kurs 6 zugewiesen (2. Wahl)\n", - "Teilnehmer 2 wurde Kurs 5 zugewiesen (1. Wahl)\n", - "Teilnehmer 3 wurde Kurs 0 zugewiesen (3. Wahl)\n", - "Teilnehmer 4 wurde Kurs 4 zugewiesen (1. Wahl)\n", - "Teilnehmer 5 wurde Kurs 7 zugewiesen (1. Wahl)\n", - "Teilnehmer 6 wurde Kurs 0 zugewiesen (3. Wahl)\n", - "Teilnehmer 7 wurde Kurs 2 zugewiesen (1. Wahl)\n", - "Teilnehmer 8 wurde Kurs 7 zugewiesen (1. Wahl)\n", - "Teilnehmer 9 wurde Kurs 3 zugewiesen (1. Wahl)\n", - "Teilnehmer 10 wurde Kurs 4 zugewiesen (1. Wahl)\n", - "Teilnehmer 11 wurde Kurs 6 zugewiesen (2. Wahl)\n", - "Teilnehmer 12 wurde Kurs 4 zugewiesen (1. Wahl)\n", - "Teilnehmer 13 wurde Kurs 3 zugewiesen (2. Wahl)\n", - "Teilnehmer 14 wurde Kurs 10 zugewiesen (1. Wahl)\n", - "Teilnehmer 15 wurde Kurs 8 zugewiesen (1. Wahl)\n", - "Teilnehmer 16 wurde Kurs 7 zugewiesen (2. Wahl)\n", - "Teilnehmer 17 wurde Kurs 6 zugewiesen (2. Wahl)\n", - "Teilnehmer 18 wurde Kurs 5 zugewiesen (1. Wahl)\n", - "Teilnehmer 19 wurde Kurs 1 zugewiesen (3. Wahl)\n", - "Teilnehmer 20 wurde Kurs 5 zugewiesen (1. Wahl)\n", - "Teilnehmer 21 wurde Kurs 3 zugewiesen (1. Wahl)\n", - "Teilnehmer 22 wurde Kurs 7 zugewiesen (1. Wahl)\n", - "Teilnehmer 23 wurde Kurs 7 zugewiesen (2. Wahl)\n", - "Teilnehmer 24 wurde Kurs 2 zugewiesen (1. Wahl)\n", - "Teilnehmer 25 wurde Kurs 0 zugewiesen (2. Wahl)\n", - "Teilnehmer 26 wurde Kurs 5 zugewiesen (1. Wahl)\n", - "Teilnehmer 27 wurde Kurs 2 zugewiesen (1. Wahl)\n", - "Teilnehmer 28 wurde Kurs 7 zugewiesen (1. Wahl)\n", - "Teilnehmer 29 wurde Kurs 5 zugewiesen (1. Wahl)\n", - "Teilnehmer 30 wurde Kurs 6 zugewiesen (1. Wahl)\n", - "Teilnehmer 31 wurde Kurs 3 zugewiesen (1. Wahl)\n", - "Teilnehmer 32 wurde Kurs 5 zugewiesen (1. Wahl)\n", - "Teilnehmer 33 wurde Kurs 4 zugewiesen (1. Wahl)\n", - "Teilnehmer 34 wurde Kurs 6 zugewiesen (2. Wahl)\n", - "Teilnehmer 35 wurde Kurs 7 zugewiesen (1. Wahl)\n", - "Teilnehmer 36 wurde Kurs 3 zugewiesen (2. Wahl)\n", - "Teilnehmer 37 wurde Kurs 8 zugewiesen (1. Wahl)\n", - "Teilnehmer 38 wurde Kurs 4 zugewiesen (1. Wahl)\n", - "Teilnehmer 39 wurde Kurs 2 zugewiesen (1. Wahl)\n", - "Teilnehmer 40 wurde Kurs 7 zugewiesen (2. Wahl)\n", - "Teilnehmer 41 wurde Kurs 8 zugewiesen (1. Wahl)\n", - "Teilnehmer 42 wurde Kurs 2 zugewiesen (1. Wahl)\n", - "Teilnehmer 43 wurde Kurs 7 zugewiesen (1. Wahl)\n", - "Teilnehmer 44 wurde Kurs 7 zugewiesen (2. Wahl)\n", - "Teilnehmer 45 wurde Kurs 0 zugewiesen (2. Wahl)\n", - "Teilnehmer 46 wurde Kurs 9 zugewiesen (2. Wahl)\n", - "Teilnehmer 47 wurde Kurs 0 zugewiesen (2. Wahl)\n", - "Teilnehmer 48 wurde Kurs 7 zugewiesen (1. Wahl)\n", - "Teilnehmer 49 wurde Kurs 7 zugewiesen (1. Wahl)\n", - "Teilnehmer 50 wurde Kurs 6 zugewiesen (1. Wahl)\n", - "Teilnehmer 51 wurde Kurs 2 zugewiesen (1. Wahl)\n", - "Teilnehmer 52 wurde Kurs 10 zugewiesen (2. Wahl)\n", - "Teilnehmer 53 wurde Kurs 4 zugewiesen (1. Wahl)\n", - "Teilnehmer 54 wurde Kurs 4 zugewiesen (1. Wahl)\n", - "Teilnehmer 55 wurde Kurs 7 zugewiesen (1. Wahl)\n", - "Teilnehmer 56 wurde Kurs 5 zugewiesen (1. Wahl)\n", - "Teilnehmer 57 wurde Kurs 9 zugewiesen (2. Wahl)\n", - "Teilnehmer 58 wurde Kurs 3 zugewiesen (1. Wahl)\n", - "Teilnehmer 59 wurde Kurs 7 zugewiesen (1. Wahl)\n", - "Teilnehmer 60 wurde Kurs 2 zugewiesen (1. Wahl)\n", - "Teilnehmer 61 wurde Kurs 4 zugewiesen (1. Wahl)\n", - "Teilnehmer 62 wurde Kurs 4 zugewiesen (1. Wahl)\n", - "Teilnehmer 63 wurde Kurs 7 zugewiesen (1. Wahl)\n", - "Teilnehmer 64 wurde Kurs 9 zugewiesen (1. Wahl)\n", - "Teilnehmer 65 wurde Kurs 6 zugewiesen (3. Wahl)\n", - "Teilnehmer 66 wurde Kurs 1 zugewiesen (2. Wahl)\n", - "Teilnehmer 67 wurde Kurs 4 zugewiesen (1. Wahl)\n", - "Teilnehmer 68 wurde Kurs 4 zugewiesen (1. Wahl)\n", - "Teilnehmer 69 wurde Kurs 5 zugewiesen (1. Wahl)\n", - "Teilnehmer 70 wurde Kurs 6 zugewiesen (1. Wahl)\n", - "Teilnehmer 71 wurde Kurs 8 zugewiesen (1. Wahl)\n", - "Teilnehmer 72 wurde Kurs 8 zugewiesen (1. Wahl)\n", - "Teilnehmer 73 wurde Kurs 7 zugewiesen (1. Wahl)\n", - "Teilnehmer 74 wurde Kurs 0 zugewiesen (2. Wahl)\n", - "Teilnehmer 75 wurde Kurs 6 zugewiesen (2. Wahl)\n", - "Teilnehmer 76 wurde Kurs 7 zugewiesen (2. Wahl)\n", - "Teilnehmer 77 wurde Kurs 5 zugewiesen (1. Wahl)\n", - "Teilnehmer 78 wurde Kurs 2 zugewiesen (1. Wahl)\n", - "Teilnehmer 79 wurde Kurs 5 zugewiesen (1. Wahl)\n", - "Teilnehmer 80 wurde Kurs 1 zugewiesen (3. Wahl)\n", - "Teilnehmer 81 wurde Kurs 5 zugewiesen (1. Wahl)\n", - "Teilnehmer 82 wurde Kurs 6 zugewiesen (3. Wahl)\n", - "Teilnehmer 83 wurde Kurs 3 zugewiesen (1. Wahl)\n", - "Teilnehmer 84 wurde Kurs 7 zugewiesen (1. Wahl)\n", - "Teilnehmer 85 wurde Kurs 8 zugewiesen (1. Wahl)\n", - "Teilnehmer 86 wurde Kurs 7 zugewiesen (2. Wahl)\n", - "Teilnehmer 87 wurde Kurs 8 zugewiesen (2. Wahl)\n", - "Teilnehmer 88 wurde Kurs 3 zugewiesen (1. Wahl)\n", - "Teilnehmer 89 wurde Kurs 9 zugewiesen (2. Wahl)\n", - "Teilnehmer 90 wurde Kurs 2 zugewiesen (1. Wahl)\n", - "Teilnehmer 91 wurde Kurs 3 zugewiesen (1. Wahl)\n", - "Teilnehmer 92 wurde Kurs 7 zugewiesen (1. Wahl)\n", - "Teilnehmer 93 wurde Kurs 8 zugewiesen (1. Wahl)\n", - "Teilnehmer 94 wurde Kurs 2 zugewiesen (1. Wahl)\n", - "Teilnehmer 95 wurde Kurs 6 zugewiesen (2. Wahl)\n", - "Teilnehmer 96 wurde Kurs 3 zugewiesen (1. Wahl)\n", - "Teilnehmer 97 wurde Kurs 2 zugewiesen (1. Wahl)\n", - "Teilnehmer 98 wurde Kurs 8 zugewiesen (2. Wahl)\n", - "Teilnehmer 99 wurde Kurs 10 zugewiesen (3. Wahl)\n", - "Teilnehmer 100 wurde Kurs 5 zugewiesen (1. Wahl)\n", - "Teilnehmer 101 wurde Kurs 4 zugewiesen (1. Wahl)\n", - "Teilnehmer 102 wurde Kurs 0 zugewiesen (3. Wahl)\n", - "Teilnehmer 103 wurde Kurs 2 zugewiesen (1. Wahl)\n", - "Teilnehmer 104 wurde Kurs 6 zugewiesen (2. Wahl)\n", - "Teilnehmer 105 wurde Kurs 6 zugewiesen (2. Wahl)\n", - "Überbuchung für Kurs 0: 0.0\n", - "Überbuchung für Kurs 1: 0.0\n", - "Überbuchung für Kurs 2: 0.0\n", - "Überbuchung für Kurs 3: 0.0\n", - "Überbuchung für Kurs 4: 0.0\n", - "Überbuchung für Kurs 5: 0.0\n", - "Überbuchung für Kurs 6: 0.0\n", - "Überbuchung für Kurs 7: 0.0\n", - "Überbuchung für Kurs 8: 0.0\n", - "Überbuchung für Kurs 9: 0.0\n", - "Überbuchung für Kurs 10: 0.0\n", - "Kurs {'title': 'Wir vs. Müll', 'max': np.int64(15), 'first': 0, 'second': 1, 'third': 5} hat 7.0 Teilnehmer\n", - "Kurs {'title': 'Kreatives Schreiben', 'max': np.int64(10), 'first': 0, 'second': 1, 'third': 4} hat 3.0 Teilnehmer\n", - "Kurs {'title': 'Volleyball', 'max': np.int64(12), 'first': 6, 'second': 3, 'third': 2} hat 12.0 Teilnehmer\n", - "Kurs {'title': 'Musik-Produktion am PC', 'max': np.int64(10), 'first': 0, 'second': 2, 'third': 2} hat 10.0 Teilnehmer\n", - "Kurs {'title': 'Vegan kochen & backen', 'max': np.int64(12), 'first': 4, 'second': 9, 'third': 5} hat 12.0 Teilnehmer\n", - "Kurs {'title': 'Schmuck mit Perlen', 'max': np.int64(12), 'first': 9, 'second': 4, 'third': 5} hat 12.0 Teilnehmer\n", - "Kurs {'title': 'Die Welt – was sie bewegt und wem sie gehört', 'max': np.int64(15), 'first': 0, 'second': 4, 'third': 6} hat 13.0 Teilnehmer\n", - "Kurs {'title': 'Fußball', 'max': np.int64(22), 'first': 4, 'second': 1, 'third': 2} hat 20.0 Teilnehmer\n", - "Kurs {'title': 'Bouldern', 'max': np.int64(10), 'first': 3, 'second': 8, 'third': 8} hat 10.0 Teilnehmer\n", - "Kurs {'title': 'Soziale Projekte', 'max': np.int64(8), 'first': 0, 'second': 1, 'third': 6} hat 4.0 Teilnehmer\n", - "Kurs {'title': 'Beseeltes Schreiben', 'max': np.int64(15), 'first': 0, 'second': 0, 'third': 1} hat 3.0 Teilnehmer\n", - "Projekt Wir vs. Müll: 1. Wahl: 0, 2. Wahl: 4, 3. Wahl: 3\n", - "Projekt Kreatives Schreiben: 1. Wahl: 0, 2. Wahl: 1, 3. Wahl: 2\n", - "Projekt Volleyball: 1. Wahl: 12, 2. Wahl: 0, 3. Wahl: 0\n", - "Projekt Musik-Produktion am PC: 1. Wahl: 8, 2. Wahl: 2, 3. Wahl: 0\n", - "Projekt Vegan kochen & backen: 1. Wahl: 12, 2. Wahl: 0, 3. Wahl: 0\n", - "Projekt Schmuck mit Perlen: 1. Wahl: 12, 2. Wahl: 0, 3. Wahl: 0\n", - "Projekt Die Welt – was sie bewegt und wem sie gehört: 1. Wahl: 3, 2. Wahl: 8, 3. Wahl: 2\n", - "Projekt Fußball: 1. Wahl: 14, 2. Wahl: 6, 3. Wahl: 0\n", - "Projekt Bouldern: 1. Wahl: 7, 2. Wahl: 3, 3. Wahl: 0\n", - "Projekt Soziale Projekte: 1. Wahl: 1, 2. Wahl: 3, 3. Wahl: 0\n", - "Projekt Beseeltes Schreiben: 1. Wahl: 1, 2. Wahl: 1, 3. Wahl: 1\n", - "1. Wahl: 70, 2. Wahl: 28, 3. Wahl: 8\n", - "Projekt Wir vs. Müll: 7.0 Teilnehmer\n", - "Projekt Kreatives Schreiben: 3.0 Teilnehmer\n", - "Projekt Volleyball: 12.0 Teilnehmer\n", - "Projekt Musik-Produktion am PC: 10.0 Teilnehmer\n", - "Projekt Vegan kochen & backen: 12.0 Teilnehmer\n", - "Projekt Schmuck mit Perlen: 12.0 Teilnehmer\n", - "Projekt Die Welt – was sie bewegt und wem sie gehört: 13.0 Teilnehmer\n", - "Projekt Fußball: 20.0 Teilnehmer\n", - "Projekt Bouldern: 10.0 Teilnehmer\n", - "Projekt Soziale Projekte: 4.0 Teilnehmer\n", - "Projekt Beseeltes Schreiben: 3.0 Teilnehmer\n" - ] - } - ], - "source": [ - "# Ergebnisse ausgeben\n", - "print(\"Status:\", pulp.LpStatus[problem.status])\n", - "\n", - "for i in range(num_participants):\n", - " for j in range(num_courses):\n", - " if pulp.value(x[i, j]) == 1:\n", - " if j == preferences[i][0]:\n", - " wahl = '1. Wahl'\n", - " elif j == preferences[i][1]:\n", - " wahl = '2. Wahl'\n", - " elif j == preferences[i][2]:\n", - " wahl = '3. Wahl'\n", - " print(f\"Teilnehmer {i} wurde Kurs {j} zugewiesen ({wahl})\")\n", - "\n", - "for j in range(num_courses):\n", - " print(f\"Überbuchung für Kurs {j}: {pulp.value(o[j])}\")\n", - "\n", - "# Anzahl der Teilnehmer in jedem Kurs ausgeben\n", - "for j in range(num_courses):\n", - " teilnehmer_in_kurs = sum(pulp.value(x[i, j]) for i in range(num_participants))\n", - " if j in projects:\n", - " print(f\"Kurs {projects[j]} hat {teilnehmer_in_kurs} Teilnehmer\")\n", - " else:\n", - " print(f\"Kurs {j} hat {teilnehmer_in_kurs} Teilnehmer\")\n", - "\n", - "# Initialize counts for first, second, and third choices in each project\n", - "for project in projects.values():\n", - " project['first'] = 0\n", - " project['second'] = 0\n", - " project['third'] = 0\n", - "\n", - "# Anzahl an 1. 2. und 3. Wahlen ausgeben\n", - "for i in range(num_participants):\n", - " for j in range(num_courses):\n", - " if pulp.value(x[i, j]) == 1:\n", - " if j == preferences[i][0]:\n", - " projects[j]['first'] += 1\n", - " elif j == preferences[i][1]:\n", - " projects[j]['second'] += 1\n", - " elif j == preferences[i][2]:\n", - " projects[j]['third'] += 1\n", - "\n", - "# Print the counts for each project\n", - "for j, project in projects.items():\n", - " print(f\"Projekt {project['title']}: 1. Wahl: {project['first']}, 2. Wahl: {project['second']}, 3. Wahl: {project['third']}\")\n", - "\n", - "# print the counts in total\n", - "first_choices = sum(project['first'] for project in projects.values())\n", - "second_choices = sum(project['second'] for project in projects.values())\n", - "third_choices = sum(project['third'] for project in projects.values())\n", - "print(f\"1. Wahl: {first_choices}, 2. Wahl: {second_choices}, 3. Wahl: {third_choices}\")\n", - "\n", - "# Print the total number of participants in each project\n", - "for j, project in projects.items():\n", - " print(f\"Projekt {project['title']}: {sum(pulp.value(x[i, j]) for i in range(num_participants))} Teilnehmer\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.12.6" - } - }, - "nbformat": 4, - "nbformat_minor": 2 -}