微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将每项任务分配给每个工作人员,以便更好地优化成本?

如何解决如何将每项任务分配给每个工作人员,以便更好地优化成本?

我几乎没有关于显示每项任务以及任务持续时间的任务数据,例如:

表 1:

任务 长度 时间
任务 1 45 分钟 6:30
任务 2 45 分钟 7:00

在这里我知道每项任务、任务持续多长时间以及任务将在什么时间完成。例如,现在我有 10 名工作人员,其中 7 名是签订合同的,他们的每小时工资与常规人员不同。我需要相应地将每项任务分配给所有船员。不能有重叠。一项任务仅分配给一个船员。有 200 个这样的任务。是否有特定的 python 包甚至算法可以帮助我解决这个问题? 我遇到了this。但我不确定这是否可以相应地帮助我。有没有其他算法可以帮助我解决这个问题?

解决方法

您可以在 CP Optimizer 中将问题表述如下。它甚至将问题推广到开始日期不固定但必须在一个时间窗口内决定的任务的情况。

from docplex.cp.model import *

# Time hh:mm to minute
def mn(time):
    h,m = time.split(':')
    return 60*int(h)+int(m)

T = [
  # Length,Earliest start,Latest start
  (45,mn("6:30"),mn("6:30")),(45,mn("7:00"),mn("7:10")),#...
]

# Cost of crew (per minute)
C = [ 10,12,11,13 ]

N = range(len(T)) # Number of nbTasks
M = range(len(C)) # Number of resources (crews)

# CP Optimizer formulation

model = CpoModel()

# Decision variables:
# task[i]    : interval variable representing task i
# alloc[i][j]: optional interval variable representing task i allocated to crew j
task  = [ interval_var(size=T[i][0],start=[T[i][1],T[i][2]],name="T{}".format(i)) for i in N]
alloc = [ [interval_var(optional=True,name="T{}R{}".format(i,j)) for j in M] for i in N]

# Each task must be allocated one and only one crew:
model.add([alternative(task[i],[alloc[i][j] for j in M]) for i in N])
# Tasks performed by a crew do not overlap
model.add([no_overlap([alloc[i][j] for i in N]) for j in M])
# No more than M tasks executed in parallel (this is a redundant constraint)
model.add(sum(pulse(task[i],1) for i in N) <= len(C))

# Minimize total allocation cost
cost = sum(C[j]*length_of(alloc[i][j]) for i in N for j in M)
model.add(minimize(cost))

# CP Optimizer resolution

solution = model.solve(LogPeriod=1000000,TimeLimit=30)

# Display solution

for i in N:
    for j in M:
        s = solution.get_var_solution(alloc[i][j])
        if s.is_present():
            print("Task {} scheduled on {}-{} with crew {}".format(i,s.get_start(),s.get_end(),j))

将显示如下内容:

Task 0 scheduled on 390-435 with crew 0
Task 1 scheduled on 420-465 with crew 2

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。