当前位置: 首页 > 知识库问答 >
问题:

CPLEX python中的动态工作人员约束

丌官浩旷
2023-03-14

我一直在使用python中的docplex解决rcpsp问题。我考虑了10个具有指示性成本的任务和一个必须在10个时间框架内完成这些任务的工人(可以是周、天等)。

我的限制之一是工作人员可以在每个时间帧(worker_availability列表)中执行一组特定的任务。如果我考虑下面链接上的示例,可以将辅助角色的可用性限制为不超过特定点,即mdl.sum(资源)

我希望使用符合worker_可用性的动态约束,即在0点,我的worker可以处理2个任务,在10个任务等。

有人知道如何使用python中的docplex实现这一点吗?

链接:http://ibmdecisionoptimization.github.io/docplex-doc/cp/visu.rcpsp.py.html?highlight=rcpsp

import numpy as np
import pandas as pd
import sys
import time
from docplex.cp.model import *

# Tasks to be planned
Tasks= ["task1",
             "task2",
             "task3",
             "task4",
             "task5",
             "task6",
             "task7",
             "task8",
             "task9",
             "task10"]

# Duration of Tasks
Task_Duration =  [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]

# Cost of tasks
Cost= {"task1": 700,
         "task2": 1200,
         "task3": 189,
         "task4": 296,
         "task5": 562,
         "task6": 584,
         "task7": -100,
         "task8": -200,
         "task9": - 189,
         "task10": -296
}

# Define time interval, worker availability
time_interval = number_of_week - ReleaseDate
worker_availability = [2,0,2,0,2,0,2,1,1,1]
timespan = 10

# Create  model
model = CpoModel()

# Create interval variables
itvs = {}
for i,t in enumerate(Tasks):
    _name = '_'+str(t)
    itvs[t] = model.interval_var(start=(0, INTERVAL_MAX), end = (INTERVAL_MIN,10), size = Duration[i], name = _name)

# case of static constraints - this is where we need to get it to dynamic
tasks = [model.pulse(itvs[t], 1) for t in Tasks]
model.add(model.sum(tasks) <= 2)

# Solve the model
tmp = 0
time_interval = number_of_week - ReleaseDate
for task in Tasks:
    tmp += Cost[task] + Cost[task] * model.max([time_interval - model.start_of(itvs[task]),0])
model.add(model.minimize(tmp))
msol = model.solve(FailLimit=300000)

# Print output
for t in Tasks:
    wt = msol.get_var_solution(itvs[t])
    print(t,'start at:',wt.get_start())
print('Cost: ', msol.get_objective_values()[0])
print('worker availability: ',worker_availability)

共有1个答案

戚默
2023-03-14

你可以信赖always_in

让我给你举一个OPL的例子。

 using CP;
 
 range r=1..2;
 
 dvar interval itvs[r] size 3;
 cumulFunction simultaneousJobs=sum(i in r) pulse(itvs[i],1);
 
 minimize max(i in r) endOf(itvs[i]);
 
 subject to
 {
   simultaneousJobs<=2;
   
   //alwaysIn(simultaneousJobs,0,1,0,1);
 }

给出3作为最佳目标,同时我们看到

如果我们取消注释alwaysIn,我们得到4作为目标,对于cumul,我们将看到

 类似资料:
  • 对于我的拓扑--我在一个任务上的负载为90%,而第二个任务的负载为0%。 为什么对多个工人来说这是不同的。

  • POM是否可以声明(或至少发布)包含系统属性的?我指的是实际项目的工件,而不是依赖项。 我正在使用maven构建一个scala项目,因此,为了允许为不同的scala版本发布项目,pom.xml我想声明:

  • 我试图用一个服务人员使用Workbox制作一个非常基本的PWA,但是我有一个问题。我正在使用命令行界面来生成服务工作人员,一切正常,完美的亮点,但我不能将我的index.html添加到运行时缓存中。我必须将其添加到全局模式,以便我的网站在离线模式下工作,但当我更新index.html文件时,除非我清除缓存,否则不会更新。我想要和我的js和css一样的东西。当我升级这些文件时,它们会更新。这是我的工

  • 我希望通过Workday API检索Workday worker(又名employee)的web配置文件URL。使用案例是,我正在构建一个聊天机器人来检索用户信息,我希望能够深入链接到工人(员工)的web配置文件。 问题是我不能做以下任何一项: 从API获取web配置文件URL 从API中的数据创建web配置文件URL web配置文件URL如下所示。用户ID看起来像就在扩展名,因为这是员工档案之间

  • 创建部门表 到目前为止,我已经收到了下面的查询,我无法得到该部门工作的员工人数。我怎么能那么做?