我有一个计划优化问题,我需要根据优先级来优化在给定时间范围内要执行的活动.在下面的问题中,有足够的时间进行所有的活动,所以所有的活动都应该进行.

问题是,优化是将活动分解,而不是建议活动的整个持续时间一次性发生的时间表.

import pulp

# Define activities with durations, resource requirements, priorities, and parallel constraints
# Resources are per timeframe (ie, if every hour you need 1 machine, the value is 1 not 1*hours)
# priority is total
activities = {
    "Activity A": {
        "duration": 2,
        "resources": {"resource1": 1, "resource2": 1},
        "priority": 3,
    },
    "Activity B": {
        "duration": 3,
        "resources": {"resource1": 2, "resource2": 1},
        "priority": 2,
    },
    "Activity C": {
        "duration": 1,
        "resources": {"resource1": 1, "resource2": 2},
        "priority": 1,
    },
    "Activity D": {
        "duration": 2,
        "resources": {"resource1": 1, "resource2": 1},
        "priority": 4,
    },
}

for name, value in activities.items():
    activities[name]["priority"] = (
        activities[name]["priority"] / activities[name]["duration"]
    )

# Define the time horizon
time_horizon = 10

# Create a LP problem
problem = pulp.LpProblem("ScheduleOptimization", pulp.LpMaximize)

# Create binary variables for each activity and time slot
activity_vars = {}
for activity in activities:
    for t in range(time_horizon):
        activity_vars[(activity, t)] = pulp.LpVariable(
            f"{activity}_{t}", 0, 1, pulp.LpInteger
        )

# Create a variable to represent the total priority
total_priority = pulp.LpVariable("TotalPriority", cat=pulp.LpContinuous)

# Objective: Maximize the total priority
problem += total_priority

# Constraints
## Activities can run a maximum of their duration
for activity_name, activity in activities.items():
    problem += (
        pulp.lpSum(activity_vars[(activity_name, tt)] for tt in range(0, time_horizon))
        <= activity["duration"]
    )

# Update total_priority variable to reflect the actual total priority
problem += total_priority == pulp.lpSum(
    activity["priority"] * activity_vars[(activity_name, t)]
    for activity_name, activity in activities.items()
    for t in range(time_horizon)
)

# Solve the problem
problem.solve(pulp.PULP_CBC_CMD(msg=1))

# Print the schedule
schedule = {}
for activity_name in activities:
    for t in range(time_horizon):
        print(
            activity_vars[(activity_name, t)],
            "___",
            pulp.value(activity_vars[(activity_name, t)]),
        )
        if (
            pulp.value(activity_vars[(activity_name, t)]) == 1
            and schedule.get(activity_name) is None
        ):
            schedule[activity_name] = t

print("Optimal Schedule:")
for activity, start_time in schedule.items():
    print(f"{activity} starts at time {start_time}")
print(f"Total Priority: {pulp.value(total_priority)}")

我希望所有活动都像活动B一样,在其持续时间内开始和结束(即,向量[Activity_B_0到Activity_B_9]中的所有1加在一起-&gt;[0,0,0,0,0,1,1,1,0,0]

另一方面,如果活动A一气呵成,即使没有违反任何限制,它也会被分解.[1,0,1,...]应为[1,1,0,...]

下面是一个示例解决方案,其中变量ACTIVATION_A_0表示活动A在时间0处于活动状态.如果活动的持续时间为2,则ACTIVIT_A_x之和应==2.

Activity_A_0 ___ 1.0 #Not continuous
Activity_A_1 ___ 0.0 #Not continuous
Activity_A_2 ___ 1.0 #Not continuous
Activity_A_3 ___ 0.0
Activity_A_4 ___ 0.0
Activity_A_5 ___ 0.0
Activity_A_6 ___ 0.0
Activity_A_7 ___ 0.0
Activity_A_8 ___ 0.0
Activity_A_9 ___ 0.0
Activity_B_0 ___ 0.0
Activity_B_1 ___ 0.0
Activity_B_2 ___ 0.0
Activity_B_3 ___ 0.0
Activity_B_4 ___ 0.0
Activity_B_5 ___ 1.0 #Continuous
Activity_B_6 ___ 1.0 #Continuous
Activity_B_7 ___ 1.0 #Continuous
Activity_B_8 ___ 0.0
Activity_B_9 ___ 0.0
Activity_C_0 ___ 0.0
Activity_C_1 ___ 0.0
Activity_C_2 ___ 0.0
Activity_C_3 ___ 0.0
Activity_C_4 ___ 0.0
Activity_C_5 ___ 0.0
Activity_C_6 ___ 0.0
Activity_C_7 ___ 0.0
Activity_C_8 ___ 1.0
Activity_C_9 ___ 0.0
Activity_D_0 ___ 0.0
Activity_D_1 ___ 1.0 # Not Continuous
Activity_D_2 ___ 0.0 # Not Continuous
Activity_D_3 ___ 1.0 # Not Continuous
Activity_D_4 ___ 0.0
Activity_D_5 ___ 0.0
Activity_D_6 ___ 0.0
Activity_D_7 ___ 0.0
Activity_D_8 ___ 0.0
Activity_D_9 ___ 0.0

推荐答案

将所有1放在一起的标准且经常使用的方法是限制模式0 1(初创企业)在二进制变量x[t]中的出现次数.这可以用以下方式建模

 s[t] >= x[t] - x[t-1] 
 sum(s[t]) <= 1
 x[t],s[t] binary
  • 目标函数不影响公式
  • 我们可以将s[t]放宽为0到1之间的连续
  • x[t-1]个是外生性的

Python相关问答推荐

使用子字符串动态更新Python DataFrame中的列

使用decorator 重复超载

Django文件上传不起作用:文件未出现在媒体目录或数据库中

telegram 机器人API setMyName不起作用

在for循环中仅执行一次此操作

Python中的负前瞻性regex遇到麻烦

如何让 turtle 通过点击和拖动来绘制?

如何使用pandasDataFrames和scipy高度优化相关性计算

Pystata:从Python并行运行stata实例

try 在树叶 map 上应用覆盖磁贴

处理(潜在)不断增长的任务队列的并行/并行方法

如何制作10,000年及以后的日期时间对象?

用Python解密Java加密文件

如何将Docker内部运行的mariadb与主机上Docker外部运行的Python脚本连接起来

数据抓取失败:寻求帮助

如何在WSL2中更新Python到最新版本(3.12.2)?

有没有一种ONE—LINER的方法给一个框架的每一行一个由整数和字符串组成的唯一id?

Pandas GroupBy可以分成两个盒子吗?

未调用自定义JSON编码器

基于多个数组的多个条件将值添加到numpy数组