You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中构建该运维决策优化问题的MIP模型

混合整数规划(MIP)模型构建:设备维护优化问题

可行性确认

完全可以将该问题构建为MIP模型。你的决策变量是离散整数类型(每个元素在每个周期的决策选项为0-3),状态变量为连续型(元素的状态值),符合混合整数规划的定义,且约束与目标均可转化为求解器可处理的形式。

核心MIP模型组件

1. 决策变量

定义整数变量 x[j][t],表示元素j在周期t执行的决策,取值范围为{0,1,2,3},对应4种决策选项。

2. 状态变量

定义连续变量 s[j][t],表示元素j在周期t结束后的状态值(条件值)。初始状态 s[j][0] 为给定的初始条件。

3. 状态转移约束

每个周期的状态更新遵循“执行决策提升状态 → 经历自然退化”的逻辑:

s[j][t] = 0.9 × decision_result(x[j][t], s[j][t-1])

注:decision_result函数中的min(...,100)可通过线性约束实现上限控制,避免状态超过100。

4. 系统状态约束

对于每种系统类型m,其加权平均状态需不低于最低阈值(示例中为最后一个周期的状态约束,若需每个周期都满足,可对每个t添加该约束):

(Σ (s[j][T] × value[j]) for j in 系统m的元素) / (Σ value[j] for j in 系统m的元素) ≥ min_condition[m]

其中T为最后一个周期。

5. 预算约束

每个周期t的总决策成本不得超过当期预算:

Σ decision_cost(x[j][t], value[j]) ≤ max_budget[t]

6. 目标函数

可根据业务需求选择,例如:

  • 最大化所有系统的最终加权状态总和
  • 最小化所有周期的总成本
  • 多目标加权优化

Python实现示例(基于pyscipopt)

首先安装依赖:

pip install pyscipopt pandas numpy

完整代码:

import pyscipopt as scip
import pandas as pd
import numpy as np
from random import choices, sample

# 1. 初始化参数与数据
decision_options = [0,1,2,3]
periods = list(range(0,6))
system_types = ['A', 'B', 'C']
element_ids = list(range(0,100))

# 生成初始数据
condition = choices(range(60,101), k=len(element_ids))
system_type = choices(system_types, k=len(element_ids))
value = sample(range(500, 20000), len(element_ids))
df = pd.DataFrame({'Element_ID': element_ids, 'System_Type': system_type, 'Condition': condition, 'Value': value})

# 约束参数
min_condition = {'A':60, 'B':50, 'C':40}
max_budget = [200000]*len(periods)

# 2. 定义决策与状态映射逻辑
def get_cost(decision, val):
    if decision == 0:
        return 0
    elif decision ==1:
        return val/10
    elif decision ==2:
        return val/5
    elif decision ==3:
        return val/2

def get_post_decision_coeff(decision):
    # 返回决策对应的状态提升系数
    if decision ==0:
        return 1.0
    elif decision ==1:
        return 1.1
    elif decision ==2:
        return 1.2
    elif decision ==3:
        return 1.5

# 3. 初始化MIP模型
model = scip.Model("MaintenanceOptimization")

# 4. 创建变量
# 决策变量:x[j][t] ∈ {0,1,2,3}
x = {}
for j in element_ids:
    x[j] = {}
    for t in periods:
        x[j][t] = model.addVar(vtype="I", lb=0, ub=3, name=f"x_{j}_{t}")

# 状态变量:s[j][t] ∈ [0,100]
s = {}
for j in element_ids:
    s[j] = {}
    # 初始状态(周期0之前)
    s[j]['init'] = model.addVar(vtype="C", lb=0, ub=100, name=f"s_{j}_init")
    model.addCons(s[j]['init'] == df.loc[j, 'Condition'])
    for t in periods:
        s[j][t] = model.addVar(vtype="C", lb=0, ub=100, name=f"s_{j}_{t}")

# 5. 添加状态转移约束
for j in element_ids:
    for t in periods:
        # 获取上一周期的状态
        prev_state = s[j]['init'] if t ==0 else s[j][t-1]
        # 临时变量存储决策后的状态(未退化)
        post_decision = model.addVar(vtype="C", lb=0, ub=100, name=f"post_decision_{j}_{t}")
        
        # 针对每个决策选项添加逻辑约束
        # 决策0:状态不变
        model.addCons((x[j][t] == 0) >> (post_decision == prev_state))
        # 决策1:状态×1.1,不超过100
        model.addCons((x[j][t] == 1) >> (post_decision == prev_state * 1.1))
        model.addCons((x[j][t] == 1) >> (post_decision <= 100))
        # 决策2:状态×1.2,不超过100
        model.addCons((x[j][t] == 2) >> (post_decision == prev_state * 1.2))
        model.addCons((x[j][t] == 2) >> (post_decision <= 100))
        # 决策3:状态×1.5,不超过100
        model.addCons((x[j][t] == 3) >> (post_decision == prev_state * 1.5))
        model.addCons((x[j][t] == 3) >> (post_decision <= 100))
        
        # 退化后的状态(乘以0.9)
        model.addCons(s[j][t] == post_decision * 0.9)

# 6. 添加预算约束
for t in periods:
    total_cost = scip.quicksum(get_cost(x[j][t], df.loc[j, 'Value']) for j in element_ids)
    model.addCons(total_cost <= max_budget[t], name=f"budget_{t}")

# 7. 添加系统状态约束(最后一个周期)
final_t = max(periods)
for sys_type in system_types:
    elements_in_sys = df[df['System_Type'] == sys_type]['Element_ID'].tolist()
    total_weight = sum(df.loc[j, 'Value'] for j in elements_in_sys)
    weighted_sum = scip.quicksum(s[j][final_t] * df.loc[j, 'Value'] for j in elements_in_sys)
    model.addCons(weighted_sum / total_weight >= min_condition[sys_type], name=f"sys_condition_{sys_type}")

# 8. 设置目标函数:最大化最后一个周期的系统加权状态总和
obj = 0
for sys_type in system_types:
    elements_in_sys = df[df['System_Type'] == sys_type]['Element_ID'].tolist()
    total_weight = sum(df.loc[j, 'Value'] for j in elements_in_sys)
    weighted_sum = scip.quicksum(s[j][final_t] * df.loc[j, 'Value'] for j in elements_in_sys)
    obj += weighted_sum / total_weight

model.setObjective(obj, sense="maximize")

# 9. 求解模型
model.optimize()

# 10. 提取结果
if model.getStatus() == "optimal":
    print("找到最优解!")
    # 提取决策矩阵
    decision_matrix = np.zeros((len(element_ids), len(periods)), dtype=int)
    for j in element_ids:
        for t in periods:
            decision_matrix[j][t] = int(model.getVal(x[j][t]))
    print("决策矩阵:")
    print(decision_matrix)
    
    # 提取最终状态
    final_states = []
    for j in element_ids:
        final_states.append(model.getVal(s[j][final_t]))
    df['Final_Condition'] = final_states
    print("最终元素状态:")
    print(df[['Element_ID', 'System_Type', 'Final_Condition']])
else:
    print("未找到最优解,可能是模型不可行或求解超时")

关键注意事项

  • 非线性处理:min(...,100)这类分段逻辑通过求解器支持的逻辑约束实现;若使用不支持逻辑约束的求解器,可将决策拆分为4个0-1变量(每个决策选项对应一个变量),再用线性约束表示状态转移。
  • 求解规模:100个元素×6个周期=600个整数变量,属于中等规模,开源求解器(如SCIP)可处理;若规模扩大,可考虑启发式算法或分解策略。
  • 目标调整:若需最小化总成本,只需将目标改为所有周期的成本总和,并设置为minimize即可。

内容的提问来源于stack exchange,提问作者coolhand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 07:33:09