Fico Xpress / Mosel:最优解中不满足约束条件
Fico Xpress / Mosel: Constraint not satisfied in optimal solution
考虑以下最小化问题:
declarations
A,B,C: range
Objective:linctr
ct1: array(a,b,c) of linctr
ct2: linctr
z: array (a,b,c) of real
x: array (a,b,c) of mpvar
end-declarations
initializations
...
end-initializations
forall(a in A, b in B, c in C) create(x(a,b,c))
Objective := sum(a in A, b in B, c in C) z(a,b,c) * x(a,b,c)
forall(a in A, b in B, c in C) ct1(a,b,c):= (a,b,c) is_binary
forall(a in A) ct2:= sum(b in B, c in C) x(a,b,c) = 1
minimize(Objective)
决策变量的 3 维数组应该受到约束,使得对于第一维 A 上的每个索引,约束 ct2
断言只有一个 x(1,b,c)
,只有一个 x(2,b,c)
,等等等于1
。
然而,Xpress returns 一个最佳解决方案,其中 ct2
被违反,因此 x(1,2,3) = 1
和 x(1,4,6) = 1
。
有人知道为什么违反了该约束吗?
这段代码中存在多个问题。
首先,要使 x(a,b,c) 二进制化,您不需要约束。你可以这样做:
forall(a in A, b in B, c in C) x(a,b,c) is_binary
其次,因为你想为 A 的每个元素编写 ct2,你应该像这样在 A 的集合上定义它:
ct2: array(A) of linctr
然后像这样定义约束:
forall(a in A) ct2(a):= sum(b in B, c in C) x(a,b,c) = 1
这样它将为 A 的每个元素定义。以前 ct2 仅在范围 A 的最后一个元素上实现。
考虑以下最小化问题:
declarations
A,B,C: range
Objective:linctr
ct1: array(a,b,c) of linctr
ct2: linctr
z: array (a,b,c) of real
x: array (a,b,c) of mpvar
end-declarations
initializations
...
end-initializations
forall(a in A, b in B, c in C) create(x(a,b,c))
Objective := sum(a in A, b in B, c in C) z(a,b,c) * x(a,b,c)
forall(a in A, b in B, c in C) ct1(a,b,c):= (a,b,c) is_binary
forall(a in A) ct2:= sum(b in B, c in C) x(a,b,c) = 1
minimize(Objective)
决策变量的 3 维数组应该受到约束,使得对于第一维 A 上的每个索引,约束 ct2
断言只有一个 x(1,b,c)
,只有一个 x(2,b,c)
,等等等于1
。
然而,Xpress returns 一个最佳解决方案,其中 ct2
被违反,因此 x(1,2,3) = 1
和 x(1,4,6) = 1
。
有人知道为什么违反了该约束吗?
这段代码中存在多个问题。
首先,要使 x(a,b,c) 二进制化,您不需要约束。你可以这样做:
forall(a in A, b in B, c in C) x(a,b,c) is_binary
其次,因为你想为 A 的每个元素编写 ct2,你应该像这样在 A 的集合上定义它:
ct2: array(A) of linctr
然后像这样定义约束:
forall(a in A) ct2(a):= sum(b in B, c in C) x(a,b,c) = 1
这样它将为 A 的每个元素定义。以前 ct2 仅在范围 A 的最后一个元素上实现。