我有两个 pandas dfs,一个包含工作人员列表,另一个包含任务列表。我打算把任务分配给工人。每个任务都需要一定数量的工作人员,我现在执行的方式是遍历任务 df 并在每一行停止,然后检查工作人员 df 并继续分配工作人员,直到任务足够。然后我继续执行下一个任务,依此类推。我还一一检查了工人,并根据外部函数决定是否分配工人,该外部函数给出 1 进行分配或 0 0 进行传递。
我不确定我处理这个问题的方式是否正确,或者我是否应该以不同的方式来做。如果您有关于根据外部职能的决定为每项任务分配所需工作人员数量的更清晰方法的建议,请告诉我。
任务 df 看起来像这样:
task_id day shift workers_needed
0 1 4 1 3
1 2 4 2 5
2 3 7 1 4
3 4 5 2 4
工人 df 看起来像这样:
worker_id name
0 101 Worker_101
1 102 Worker_102
2 103 Worker_103
3 104 Worker_104
我当前的方法在下面的代码中:
你可以看到 while 循环在 i
i = 0
cur_task = tasks_df.iloc[i]['task_id']
needed_workers = tasks_df.iloc[i]['workers_needed']
print(f"Current Task is = {cur_task}")
print(f"needed workers = {needed_workers}")
while i < len(tasks_df):
# print(f" i = {i}")
random_int = random.randint(0, 1)
print(f"random_int = {random_int}")
if(random_int==1):
needed_workers-= 1
print(f"updated needed workers = {needed_workers}")
if needed_workers==0:
i+=1
if i>len(tasks_df)-1:
break
cur_task = tasks_df.iloc[i]['task_id']
needed_workers = tasks_df.iloc[i]['workers_needed']
print(f"Current Task is = {cur_task} ----------------")
print(f"needed workers = {needed_workers}")
我现在正在决定使用给出 1 或 0 的随机变量进行分配。现在,决定本身并不重要,重要的是通过 dfs 并使用该决定将所需的工作人员分配给任务的方式。
您可以按以下方式使用
iterows()
代替。使用 tasks_df
直接迭代 iterrows()
的行,这比手动管理循环索引更清晰、更安全。模拟决策过程并分配工作人员,直到满足任务要求或没有更多可用工作人员为止。我完全基于我可以从您提供的代码中读取的逻辑,所以除非它是错误的,否则这应该会产生您想要的结果。
import pandas as pd
import random
tasks_data = {
'task_id': [1, 2, 3, 4],
'day': [4, 4, 7, 5],
'shift': [1, 2, 1, 2],
'workers_needed': [3, 5, 4, 4]
}
workers_data = {
'worker_id': [101, 102, 103, 104],
'name': ['Worker_101', 'Worker_102', 'Worker_103', 'Worker_104']
}
tasks_df = pd.DataFrame(tasks_data)
workers_df = pd.DataFrame(workers_data)
available_workers = list(workers_df['worker_id'])
assignments = {task_id: [] for task_id in tasks_df['task_id']}
for _, task in tasks_df.iterrows():
print(f"Current Task: {task['task_id']} needs {task['workers_needed']} workers")
while task['workers_needed'] > 0 and available_workers:
if random.randint(0, 1) == 1:
assigned_worker = available_workers.pop(0)
assignments[task['task_id']].append(assigned_worker)
task['workers_needed'] -= 1
print(f"Assigned Worker {assigned_worker}. Remaining: {task['workers_needed']}")
if task['workers_needed'] > 0:
print(f"Not enough workers for Task {task['task_id']}. Needed: {task['workers_needed']} more.")
print("Assignments:", assignments)
返回
Current Task: 1 needs 3 workers
Assigned Worker 101. Remaining: 2
Assigned Worker 102. Remaining: 1
Assigned Worker 103. Remaining: 0
Current Task: 2 needs 5 workers
Assigned Worker 104. Remaining: 4
Not enough workers for Task 2. Needed: 4 more.
Current Task: 3 needs 4 workers
Not enough workers for Task 3. Needed: 4 more.
Current Task: 4 needs 4 workers
Not enough workers for Task 4. Needed: 4 more.
Assignments: {1: [101, 102, 103], 2: [104], 3: [], 4: []}