我正在开发一种具有模糊处理时间的灵活作业车间调度算法,我尝试随着时间的推移对生产时间进行去模糊化。 这是我生成的清晰时间表之一。然而,我发现当我对生产计划进行模糊化时,我有工作方面的重叠,这意味着一个操作在其前一个操作之前开始。但是,我确保机器方面的依赖关系得到很好的解决。查看该问题的代码如下:
import copy
import numpy as np
# Machine dictionary with [job, machine, start, end, 0, 2] format
machine_dict = {1: [[1, 3, [120.46, 153.93, 174.0], [140.22, 179.17, 202.54], 0, 2], [2, 2, [348.02, 444.69, 502.69], [409.87, 523.72, 592.03], 0, 2]], 2: [[4, 3, [140.66, 179.74, 203.18], [159.86, 204.28, 230.92], 0, 2], [2, 4, [418.38, 534.6, 604.33], [474.35, 606.11, 685.17], 0, 2]], 3: [[2, 1, [0, 0, 0], [348.02, 444.69, 502.69], 0, 2]], 4: [[3, 2, [17.362573615775315, 17.362573615775315, 17.362573615775315], [52.10257361577531, 61.75257361577532, 67.54257361577531], 0, 2], [3, 3, [312.64, 399.47, 451.58], [579.64, 740.6300000000001, 837.24], 0, 2]], 5: [[4, 1, [0, 0, 0], [89.23, 114.02, 128.89], 0, 2]], 6: [[5, 1, [0, 0, 0], [84.93, 108.53, 122.68], 0, 2], [5, 2, [134.72, 172.15, 194.6], [184.51, 235.77, 266.52], 0, 2]], 7: [[1, 1, [0, 0, 0], [49.65, 63.45, 71.72], 0, 2], [1, 2, [120.46, 153.93, 174.0], [191.26999999999998, 244.41000000000003, 276.28], 0, 2]], 8: [[4, 5, [183.09, 233.97, 264.48], [216.45, 276.59, 312.66], 0, 2]], 10: [[4, 4, [159.86, 204.28, 230.92], [183.09, 233.97, 264.48], 0, 2]], 11: [[3, 1, [0, 0, 0], [11.0, 11.0, 11.0], 0, 2], [4, 2, [192.08999999999997, 245.46000000000004, 277.47], [243.51999999999995, 311.18000000000006, 351.76000000000005], 0, 2], [2, 3, [426.89, 545.48, 616.6300000000001], [435.4, 556.36, 628.9300000000002], 0, 2]]}
# Function to print job-wise operation details with machine, start and end times
def print_job_operations(machine_dict):
job_operations = {}
# Organize operations by job
for machine, operations in machine_dict.items():
for op in operations:
job_id, op_id, start_times, end_times, *_ = op
if job_id not in job_operations:
job_operations[job_id] = []
job_operations[job_id].append((op_id, machine, start_times, end_times)) # Store operation ID, machine, start/end times
# Now print the job-wise operations with machine, start and end times
for job_id, ops in job_operations.items():
print(f"Job {job_id}:")
for op in sorted(ops, key=lambda x: x[0]): # Sort by operation number
print(f" Operation {op[0]} - Machine: {op[1]}, Start Time: {op[2]}, End Time: {op[3]}")
# Function to get end time of last operation of each job
def get_last_operation_end_times(machine_dict):
job_operations = {}
# Organize operations by job
for machine, operations in machine_dict.items():
for op in operations:
job_id, op_id, start_times, end_times, *_ = op
if job_id not in job_operations:
job_operations[job_id] = []
job_operations[job_id].append((op_id, end_times)) # Store operation ID and end times
# Get the end time of the last operation for each job
last_operation_end_times = {}
for job_id, ops in job_operations.items():
last_op = max(ops, key=lambda x: x[0]) # Get the operation with the highest operation number
last_operation_end_times[job_id] = last_op[1] # Store the end times of the last operation
return last_operation_end_times
# Printing the adjusted machine-wise and job-wise schedule
print_job_operations(machine_dict)
# Getting the end time of the last operation of each job
last_op_end_times = get_last_operation_end_times(machine_dict)
last_op_end_times
我解决此问题的代码如下:
for machine, ops in machine_dict.items():
#Sort operations by start time (Use middle TFN value for sorting)
ops = sorted(ops, key=lambda x: x[2][1])
for op in ops:
job, opn, start, end, _, _ = op
if (opn>1):
job_prev_end=job_operations[job,opn-1][3]
else:
job_prev_end=[0,0,0]
machine_prev_end= machine_end_times[machine]
print(machine)
print("op-start",start,"op-end",end,"machine_prev_end",machine_prev_end,"job_prev_end",job_prev_end)
# Calculate the adjusted start time based on the latest end time
adjusted_start = [max(start[i], machine_prev_end[i], job_prev_end[i]) for i in range(3)]
duration = [end[i] - start[i] for i in range(3)]
adjusted_end = [adjusted_start[i] + duration[i] for i in range(3)]
# Store the adjusted operation in the final schedule
print([job, opn, adjusted_start, adjusted_end, 0, 2])
# Update end times for job and machine
job_end_times[job] = adjusted_end
machine_end_times[machine] = adjusted_end
if(job==4):
input()
adjusted_schedule[machine].append([job, opn, adjusted_start, adjusted_end, 0, 2])
但是,我发现此代码并不能解决问题,因为它按照在机器中安排的顺序(从机器 1 开始)获取作业-操作对 - 意味着如果作业 4 的操作 4 安排在机器 3 上并且操作4-3 计划在机器 10 上,如果作业 4 的操作 4 在操作 4-3 之前开始,则不会纠正此重叠。
如何正确调整工作/操作以避免生产计划重叠?
当您需要在生产计划中右移任务时(其中有多台机器处理多个作业),这可能有点棘手,但这里有一个简单的方法:
第 1 步:了解您的限制
首先,您需要了解几个关键事项:
机器:有哪些机器可用,其容量是多少?
作业:作业之间是否存在依赖关系(例如,一个作业依赖于另一个作业的输出)?
截止日期:确保您知道每项工作的截止时间。
资源:不要忘记考虑共享资源,例如人员或工具。
第 2 步:确定需要移动的任务
明确您想要推迟的具体任务,并找出推迟的原因。机器是否需要停机维护?是不是材料没有及时到达?还是优先考虑其他工作?
第 3 步:检查时间间隙
在移动任务之前,查看机器的日程安排中是否有足够的空闲时间。这确保您可以将其推迟,而不会遇到其他工作。
第 4 步:转移任务
一旦确认有空间推动任务,请调整其开始时间。您可能还需要移动其他任务。例如,如果您将任务 A 从上午 8 点转移到上午 9 点,而任务 B 应该在任务 A 之后立即开始,您也需要将任务 B 推迟。
第 5 步:仔细检查依赖关系
确保移动此任务不会扰乱任何其他作业依赖性。例如,如果任务 A 生成任务 B 需要启动的内容,您还需要更新任务 B 的开始时间。
第 6 步:最小化空闲时间
每当您转移任务时,就有可能在时间表中造成机器闲置的间隙。最好通过重新安排其他工作或用没有严格截止日期的工作来填补空白来尝试避免这种情况。
第 7 步:查看整个日程表
做出调整后,退后一步,看看整个日程安排。检查是否存在因更改而可能出现的新瓶颈或延迟。
例如,假设您有一个简单的设置,其中:
任务 A 从上午 8 点到上午 10 点在机器 1 上运行 任务 B 从上午 10 点到下午 12 点在机器 1 上执行 如果您想将任务 A 推迟一个小时,则可以将其移至上午 9 点至上午 11 点,然后任务 B 需要移至上午 11 点至下午 1 点。不要忘记检查这是否会对依赖这些任务的其他作业造成任何冲突。
如果您在 Excel 或 Google Sheets 等工具中使用甘特图,则此过程非常直观 - 您可以简单地拖动任务并查看它们如何适合。对于更复杂的调度,Microsoft Project 等生产调度软件或专为作业车间调度定制的软件可以帮助实现自动化。