koushik0310 commited on
Commit
d88f815
·
verified ·
1 Parent(s): d023664

Upload 4 files

Browse files
Files changed (4) hide show
  1. app.py +128 -0
  2. requirements.txt +4 -0
  3. tasks.json +197 -0
  4. workers.json +182 -0
app.py ADDED
@@ -0,0 +1,128 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import json
2
+ import random
3
+ import numpy as np
4
+ import pandas as pd
5
+ import gradio as gr
6
+
7
+ # Load datasets from JSON files (must be in the same folder)
8
+ with open('workers.json', 'r') as f:
9
+ workers = json.load(f)
10
+
11
+ with open('tasks.json', 'r') as f:
12
+ tasks = json.load(f)
13
+
14
+ class SkillMatchPro:
15
+ def __init__(self, workers, tasks):
16
+ self.workers = workers
17
+ self.tasks = tasks
18
+
19
+ def calculate_match_score(self, worker, task):
20
+ score = 0
21
+ req = set(task['required_skills'])
22
+ if req:
23
+ score += (len(set(worker['skills']) & req) / len(req)) * 40
24
+ score += min(worker['experience_years'] / 10, 1) * 30
25
+ score += 20 if worker['availability'] == "Available" else 5 if worker['availability'] == "Busy" else 0
26
+ score += 10 if worker['shift'] == task['shift_required'] else 0
27
+ score += (worker['performance_rating'] - 3) * 2
28
+ return round(score, 2)
29
+
30
+ def get_best_matches(self, task_id, top_n=5):
31
+ task = next((x for x in self.tasks if x['task_id'] == task_id), None)
32
+ if not task:
33
+ return []
34
+ matches = []
35
+ for w in self.workers:
36
+ matches.append({
37
+ 'worker_id': w['worker_id'],
38
+ 'worker_name': w['name'],
39
+ 'score': self.calculate_match_score(w, task),
40
+ 'skills': w['skills'],
41
+ 'experience': w['experience_years'],
42
+ 'availability': w['availability'],
43
+ 'shift': w['shift'],
44
+ 'performance_rating': w['performance_rating']
45
+ })
46
+ matches.sort(key=lambda x: x['score'], reverse=True)
47
+ return matches[:top_n]
48
+
49
+ def assign_all_tasks(self):
50
+ assignments = []
51
+ assigned_workers = set()
52
+ priority_order = {'High': 3, 'Medium': 2, 'Low': 1}
53
+ for task in sorted(self.tasks, key=lambda x: priority_order[x['priority']], reverse=True):
54
+ best_matches = self.get_best_matches(task['task_id'])
55
+ for m in best_matches:
56
+ if m['worker_id'] not in assigned_workers and m['availability'] == "Available":
57
+ assignments.append({
58
+ 'task_id': task['task_id'],
59
+ 'task_name': task['task_name'],
60
+ 'assigned_worker': m['worker_name'],
61
+ 'worker_id': m['worker_id'],
62
+ 'match_score': m['score'],
63
+ 'priority': task['priority']
64
+ })
65
+ assigned_workers.add(m['worker_id'])
66
+ break
67
+ else:
68
+ if best_matches:
69
+ top = best_matches[0]
70
+ assignments.append({
71
+ 'task_id': task['task_id'],
72
+ 'task_name': task['task_name'],
73
+ 'assigned_worker': f"{top['worker_name']} (Override)",
74
+ 'worker_id': top['worker_id'],
75
+ 'match_score': top['score'],
76
+ 'priority': task['priority']
77
+ })
78
+ return assignments
79
+
80
+
81
+ # Initialize matcher with data
82
+ matcher = SkillMatchPro(workers, tasks)
83
+
84
+ # List of task IDs for UI dropdown
85
+ task_ids = [t['task_id'] for t in tasks]
86
+
87
+ # Gradio UI functions
88
+ def find_matches(task_id):
89
+ if not task_id:
90
+ return "Please select a task.", []
91
+ matches = matcher.get_best_matches(task_id, top_n=5)
92
+ table = [[m['worker_name'], m['score'], ", ".join(m['skills']),
93
+ m['experience'], m['availability'], m['shift']] for m in matches]
94
+ return f"Best matches for {task_id}:", table
95
+
96
+ def auto_assign():
97
+ assignments = matcher.assign_all_tasks()
98
+ table = [[a['task_id'], a['task_name'], a['assigned_worker'], a['match_score'], a['priority']] for a in assignments]
99
+ return f"Auto-assignment completed! ({len(assignments)} tasks assigned)", table
100
+
101
+ # Define Gradio interface
102
+ with gr.Blocks() as demo:
103
+ gr.Markdown("# 🏭 SkillMatch Pro - Workforce Assignment")
104
+
105
+ with gr.Row():
106
+ with gr.Column():
107
+ dropdown = gr.Dropdown(task_ids, label="Select Task")
108
+ find_button = gr.Button("Find Best Workers")
109
+ with gr.Column():
110
+ result_text1 = gr.Textbox(label="Result")
111
+ result_table1 = gr.Dataframe(
112
+ headers=["Worker", "Score", "Skills", "Experience", "Availability", "Shift"]
113
+ )
114
+ find_button.click(find_matches, inputs=dropdown, outputs=[result_text1, result_table1])
115
+
116
+ gr.Markdown("---")
117
+
118
+ with gr.Row():
119
+ with gr.Column():
120
+ auto_assign_button = gr.Button("Auto-Assign All Tasks")
121
+ with gr.Column():
122
+ result_text2 = gr.Textbox(label="Result")
123
+ result_table2 = gr.Dataframe(
124
+ headers=["Task ID", "Task Name", "Assigned Worker", "Score", "Priority"]
125
+ )
126
+ auto_assign_button.click(auto_assign, outputs=[result_text2, result_table2])
127
+
128
+ demo.launch()
requirements.txt ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ gradio
2
+ pandas
3
+ numpy
4
+ json
tasks.json ADDED
@@ -0,0 +1,197 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "task_id": "T001",
4
+ "task_name": "Weld steel frame components",
5
+ "required_skills": [
6
+ "Welding",
7
+ "Safety Inspection"
8
+ ],
9
+ "difficulty_level": 4,
10
+ "estimated_duration": 180,
11
+ "priority": "High",
12
+ "shift_required": "Morning",
13
+ "deadline": "2025-10-18"
14
+ },
15
+ {
16
+ "task_id": "T002",
17
+ "task_name": "Assemble electronic control units",
18
+ "required_skills": [
19
+ "Assembly",
20
+ "Precision Work"
21
+ ],
22
+ "difficulty_level": 3,
23
+ "estimated_duration": 120,
24
+ "priority": "Medium",
25
+ "shift_required": "Afternoon",
26
+ "deadline": "2025-10-19"
27
+ },
28
+ {
29
+ "task_id": "T003",
30
+ "task_name": "Install electrical wiring system",
31
+ "required_skills": [
32
+ "Electrical Work",
33
+ "Safety Inspection"
34
+ ],
35
+ "difficulty_level": 5,
36
+ "estimated_duration": 240,
37
+ "priority": "High",
38
+ "shift_required": "Morning",
39
+ "deadline": "2025-10-17"
40
+ },
41
+ {
42
+ "task_id": "T004",
43
+ "task_name": "Paint metal surface components",
44
+ "required_skills": [
45
+ "Painting",
46
+ "Quality Control"
47
+ ],
48
+ "difficulty_level": 2,
49
+ "estimated_duration": 90,
50
+ "priority": "Low",
51
+ "shift_required": "Night",
52
+ "deadline": "2025-10-20"
53
+ },
54
+ {
55
+ "task_id": "T005",
56
+ "task_name": "Operate CNC milling machine",
57
+ "required_skills": [
58
+ "Machine Operation",
59
+ "Precision Work"
60
+ ],
61
+ "difficulty_level": 4,
62
+ "estimated_duration": 200,
63
+ "priority": "High",
64
+ "shift_required": "Morning",
65
+ "deadline": "2025-10-18"
66
+ },
67
+ {
68
+ "task_id": "T006",
69
+ "task_name": "Package finished products",
70
+ "required_skills": [
71
+ "Packaging",
72
+ "Quality Control"
73
+ ],
74
+ "difficulty_level": 1,
75
+ "estimated_duration": 60,
76
+ "priority": "Medium",
77
+ "shift_required": "Afternoon",
78
+ "deadline": "2025-10-21"
79
+ },
80
+ {
81
+ "task_id": "T007",
82
+ "task_name": "Perform equipment maintenance",
83
+ "required_skills": [
84
+ "Maintenance",
85
+ "Machine Operation"
86
+ ],
87
+ "difficulty_level": 3,
88
+ "estimated_duration": 150,
89
+ "priority": "Medium",
90
+ "shift_required": "Night",
91
+ "deadline": "2025-10-19"
92
+ },
93
+ {
94
+ "task_id": "T008",
95
+ "task_name": "Move heavy machinery parts",
96
+ "required_skills": [
97
+ "Heavy Lifting",
98
+ "Material Handling"
99
+ ],
100
+ "difficulty_level": 2,
101
+ "estimated_duration": 45,
102
+ "priority": "Medium",
103
+ "shift_required": "Morning",
104
+ "deadline": "2025-10-18"
105
+ },
106
+ {
107
+ "task_id": "T009",
108
+ "task_name": "Inspect product quality standards",
109
+ "required_skills": [
110
+ "Quality Control",
111
+ "Precision Work"
112
+ ],
113
+ "difficulty_level": 3,
114
+ "estimated_duration": 75,
115
+ "priority": "High",
116
+ "shift_required": "Afternoon",
117
+ "deadline": "2025-10-17"
118
+ },
119
+ {
120
+ "task_id": "T010",
121
+ "task_name": "Assemble hydraulic components",
122
+ "required_skills": [
123
+ "Assembly",
124
+ "Heavy Lifting"
125
+ ],
126
+ "difficulty_level": 4,
127
+ "estimated_duration": 160,
128
+ "priority": "High",
129
+ "shift_required": "Morning",
130
+ "deadline": "2025-10-18"
131
+ },
132
+ {
133
+ "task_id": "T011",
134
+ "task_name": "Conduct safety equipment inspection",
135
+ "required_skills": [
136
+ "Safety Inspection",
137
+ "Quality Control"
138
+ ],
139
+ "difficulty_level": 2,
140
+ "estimated_duration": 90,
141
+ "priority": "High",
142
+ "shift_required": "Morning",
143
+ "deadline": "2025-10-17"
144
+ },
145
+ {
146
+ "task_id": "T012",
147
+ "task_name": "Sort and organize raw materials",
148
+ "required_skills": [
149
+ "Material Handling",
150
+ "Packaging"
151
+ ],
152
+ "difficulty_level": 1,
153
+ "estimated_duration": 30,
154
+ "priority": "Low",
155
+ "shift_required": "Night",
156
+ "deadline": "2025-10-22"
157
+ },
158
+ {
159
+ "task_id": "T013",
160
+ "task_name": "Repair electrical panel circuits",
161
+ "required_skills": [
162
+ "Electrical Work",
163
+ "Maintenance"
164
+ ],
165
+ "difficulty_level": 5,
166
+ "estimated_duration": 180,
167
+ "priority": "High",
168
+ "shift_required": "Afternoon",
169
+ "deadline": "2025-10-17"
170
+ },
171
+ {
172
+ "task_id": "T014",
173
+ "task_name": "Apply precision coating finish",
174
+ "required_skills": [
175
+ "Painting",
176
+ "Precision Work"
177
+ ],
178
+ "difficulty_level": 3,
179
+ "estimated_duration": 110,
180
+ "priority": "Medium",
181
+ "shift_required": "Afternoon",
182
+ "deadline": "2025-10-20"
183
+ },
184
+ {
185
+ "task_id": "T015",
186
+ "task_name": "Load materials into production line",
187
+ "required_skills": [
188
+ "Material Handling",
189
+ "Heavy Lifting"
190
+ ],
191
+ "difficulty_level": 2,
192
+ "estimated_duration": 40,
193
+ "priority": "Medium",
194
+ "shift_required": "Night",
195
+ "deadline": "2025-10-19"
196
+ }
197
+ ]
workers.json ADDED
@@ -0,0 +1,182 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "worker_id": "W001",
4
+ "name": "Manish",
5
+ "skills": ["Welding", "Safety Inspection", "Heavy Lifting"],
6
+ "experience_years": 8,
7
+ "availability": "Available",
8
+ "shift": "Morning",
9
+ "performance_rating": 4.7
10
+ },
11
+ {
12
+ "worker_id": "W002",
13
+ "name": "Gowtham",
14
+ "skills": ["Assembly", "Quality Control", "Precision Work"],
15
+ "experience_years": 5,
16
+ "availability": "Available",
17
+ "shift": "Afternoon",
18
+ "performance_rating": 4.2
19
+ },
20
+ {
21
+ "worker_id": "W003",
22
+ "name": "Koushik",
23
+ "skills": ["Electrical Work", "Machine Operation", "Maintenance"],
24
+ "experience_years": 12,
25
+ "availability": "Available",
26
+ "shift": "Morning",
27
+ "performance_rating": 4.9
28
+ },
29
+ {
30
+ "worker_id": "W004",
31
+ "name": "Adwaith Binoy",
32
+ "skills": ["Painting", "Quality Control", "Material Handling"],
33
+ "experience_years": 3,
34
+ "availability": "Busy",
35
+ "shift": "Night",
36
+ "performance_rating": 3.8
37
+ },
38
+ {
39
+ "worker_id": "W005",
40
+ "name": "Michael",
41
+ "skills": ["Welding", "Assembly", "Safety Inspection"],
42
+ "experience_years": 15,
43
+ "availability": "Available",
44
+ "shift": "Morning",
45
+ "performance_rating": 4.8
46
+ },
47
+ {
48
+ "worker_id": "W006",
49
+ "name": "Jennifer",
50
+ "skills": ["Packaging", "Material Handling", "Quality Control"],
51
+ "experience_years": 4,
52
+ "availability": "Available",
53
+ "shift": "Afternoon",
54
+ "performance_rating": 4.1
55
+ },
56
+ {
57
+ "worker_id": "W007",
58
+ "name": "Robert Wi",
59
+ "skills": ["Machine Operation", "Maintenance", "Heavy Lifting"],
60
+ "experience_years": 9,
61
+ "availability": "Available",
62
+ "shift": "Night",
63
+ "performance_rating": 4.4
64
+ },
65
+ {
66
+ "worker_id": "W008",
67
+ "name": "Lisa ",
68
+ "skills": ["Electrical Work", "Precision Work", "Assembly"],
69
+ "experience_years": 7,
70
+ "availability": "On Leave",
71
+ "shift": "Morning",
72
+ "performance_rating": 4.3
73
+ },
74
+ {
75
+ "worker_id": "W009",
76
+ "name": "James Martine",
77
+ "skills": ["Welding", "Electrical Work", "Safety Inspection"],
78
+ "experience_years": 11,
79
+ "availability": "Available",
80
+ "shift": "Afternoon",
81
+ "performance_rating": 4.6
82
+ },
83
+ {
84
+ "worker_id": "W010",
85
+ "name": "Taylor",
86
+ "skills": ["Quality Control", "Precision Work", "Packaging"],
87
+ "experience_years": 6,
88
+ "availability": "Busy",
89
+ "shift": "Morning",
90
+ "performance_rating": 4.0
91
+ },
92
+ {
93
+ "worker_id": "W011",
94
+ "name": "Christopher",
95
+ "skills": ["Machine Operation", "Assembly", "Material Handling"],
96
+ "experience_years": 2,
97
+ "availability": "Available",
98
+ "shift": "Night",
99
+ "performance_rating": 3.7
100
+ },
101
+ {
102
+ "worker_id": "W012",
103
+ "name": "Jessica",
104
+ "skills": ["Painting", "Safety Inspection", "Heavy Lifting"],
105
+ "experience_years": 10,
106
+ "availability": "Available",
107
+ "shift": "Afternoon",
108
+ "performance_rating": 4.5
109
+ },
110
+ {
111
+ "worker_id": "W013",
112
+ "name": "Daniel",
113
+ "skills": ["Maintenance", "Electrical Work", "Machine Operation"],
114
+ "experience_years": 14,
115
+ "availability": "Available",
116
+ "shift": "Morning",
117
+ "performance_rating": 4.8
118
+ },
119
+ {
120
+ "worker_id": "W014",
121
+ "name": "Michelle",
122
+ "skills": ["Assembly", "Packaging", "Quality Control"],
123
+ "experience_years": 3,
124
+ "availability": "Available",
125
+ "shift": "Night",
126
+ "performance_rating": 3.9
127
+ },
128
+ {
129
+ "worker_id": "W015",
130
+ "name": "Harris",
131
+ "skills": ["Welding", "Heavy Lifting", "Material Handling"],
132
+ "experience_years": 13,
133
+ "availability": "Busy",
134
+ "shift": "Morning",
135
+ "performance_rating": 4.7
136
+ },
137
+ {
138
+ "worker_id": "W016",
139
+ "name": "Clark",
140
+ "skills": ["Precision Work", "Electrical Work", "Safety Inspection"],
141
+ "experience_years": 8,
142
+ "availability": "Available",
143
+ "shift": "Afternoon",
144
+ "performance_rating": 4.4
145
+ },
146
+ {
147
+ "worker_id": "W017",
148
+ "name": "Mark",
149
+ "skills": ["Machine Operation", "Maintenance", "Assembly"],
150
+ "experience_years": 6,
151
+ "availability": "Available",
152
+ "shift": "Night",
153
+ "performance_rating": 4.2
154
+ },
155
+ {
156
+ "worker_id": "W018",
157
+ "name": "Nicole",
158
+ "skills": ["Quality Control", "Painting", "Material Handling"],
159
+ "experience_years": 4,
160
+ "availability": "On Leave",
161
+ "shift": "Morning",
162
+ "performance_rating": 3.8
163
+ },
164
+ {
165
+ "worker_id": "W019",
166
+ "name": "Steven ",
167
+ "skills": ["Welding", "Assembly", "Precision Work"],
168
+ "experience_years": 9,
169
+ "availability": "Available",
170
+ "shift": "Afternoon",
171
+ "performance_rating": 4.5
172
+ },
173
+ {
174
+ "worker_id": "W020",
175
+ "name": "Stephanie ",
176
+ "skills": ["Packaging", "Heavy Lifting", "Safety Inspection"],
177
+ "experience_years": 5,
178
+ "availability": "Available",
179
+ "shift": "Night",
180
+ "performance_rating": 4.1
181
+ }
182
+ ]