基于FICO Mosel Xpress IVE的风电场退役工期优化求助
风电场退役工期限制优化方案
核心思路
要实现“指定月份前完成所有退役工作”,本质是禁止在截止月份之后的任何月份安排退役任务,无需复杂的MONTHSUSED变量,直接通过约束限制超期月份的退役量为0即可。
具体修改步骤
1. 调整声明部分
替换原有的MAXMONTHS和MONTHSUSED数组,改为单个截止月份参数:
DECLARATIONS MONTHS = 1..24 PORTS = 1..5 N1 = 75 N2 = 91 N3 = 88 N4 = 67 N5 = 90 M = 24 T: integer ! 退役截止月份(例如设为18,表示必须在前18个月完成所有工作) CAPACITY: array(PORTS, MONTHS) of integer COST: array(PORTS, MONTHS) of integer DISTANCES1: array(MONTHS,PORTS) of real ! 2.d.p DISTANCES2: array(MONTHS,PORTS) of real ! 2.d.p DISTANCES3: array(MONTHS,PORTS) of real ! 2.d.p DISTANCES4: array(MONTHS,PORTS) of real ! 2.d.p DISTANCES5: array(MONTHS,PORTS) of real ! 2.d.p DECOM1: array(MONTHS,PORTS) of mpvar ! decom of farm 1 DECOM2: array(MONTHS,PORTS) of mpvar ! decom of farm 2 DECOM3: array(MONTHS,PORTS) of mpvar ! decom of farm 3 DECOM4: array(MONTHS,PORTS) of mpvar ! decom of farm 4 DECOM5: array(MONTHS,PORTS) of mpvar ! decom of farm 5 END-DECLARATIONS
注:原DECOM数组未被使用,可直接删除以简化模型
2. 添加工期限制约束
在现有约束后添加以下内容,强制所有截止月份之后的月份不能安排退役任务:
! 工期限制:所有退役工作必须在第T个月及之前完成 forall(m in MONTHS where m > T, p in PORTS) DECOM1(m,p) = 0 forall(m in MONTHS where m > T, p in PORTS) DECOM2(m,p) = 0 forall(m in MONTHS where m > T, p in PORTS) DECOM3(m,p) = 0 forall(m in MONTHS where m > T, p in PORTS) DECOM4(m,p) = 0 forall(m in MONTHS where m > T, p in PORTS) DECOM5(m,p) = 0
3. 动态调整工期
在数据段(DATA)中给T赋值,例如要提前到第18个月完成:
DATA T:=18; ! 其他数据赋值... END-DATA
每次修改T的数值(如12、20等),重新求解即可得到对应工期下的最小成本。
原方案失效原因
你之前声明的MAXMONTHS数组和MONTHSUSED变量没有与实际的退役任务变量(DECOM1-DECOM5)建立约束关联,模型无法识别“超期月份不能使用”的规则,因此约束未生效。
内容的提问来源于stack exchange,提问作者Datakid
相关产品推荐
相关产品推荐

