1

我正在林业行业进行优化,其中一组公司 C 可能会从收获区域集 I 中的某个分类集 A 中扣除一些木材。参数 x[I,J,V,T,C,A ] 变量表示从采伐区 I 到锯木厂 J 的流量,使用车辆 V 在时间 T 用于公司 C 和分类 A。

我遇到的麻烦是每个锯木厂都必须满足最低需求,d_minus。这是在:

# The total flow into a node at time period t must exceed the minimum demand.
subject to Constraint2 {j in J, t in T, p in T, c in C, a in A: p <> t}:
    sum{v in V, i in I} x[i,j,v,p,c,a] >= d_minus[j,t,c,a];

问题是车辆 V 具有特定容量,模型如下:

# The flow must not exceed the total capacity for each vehicle and time period  
subject to Constraint6 {v in V, t in T}:
   sum{i in I, j in J, c in C, a in A} x[i,j,v,t,c,a] <= capacity[v];

然而,这会导致编译器抱怨约束 2 的不可能边界。例如

presolve: constraint Constraint2[1,1,6,1,3] cannot hold:
body >= 1000 cannot be <= 273; difference = 727

我使用 4 辆车,每辆车的容量为 40(我也尝试使用 400 和 1000,但错误仍然存​​在)。d_minus 参数介于 500 和 1000 之间。

我认为参数不应该太窄。使用 1000 人的容量,他们应该满足我认为 3 人的车队的需要。我倾向于“所有人”的约束是限制解决方案的原因,从而导致错误。我已经尝试对 Constraint2 使用“for all t in T, j in J”,但是它找不到 d_minus 的那些下标。有人有任何线索吗?

问候

4

1 回答 1

1

我建议在 presolve 后使用solexpand命令显示约束:Constraint2[1,1,6,1,3]

solexpand Constraint2[1,1,6,1,3];

这可能会对究竟是什么导致不可行提供一些见解。由于问题在于单个约束,除非您有一个非常大的约束表达式,否则应该不会太难,在这种情况下,我建议将您的数据集减少到仍然导致不可行的最小可能。

于 2014-10-24T16:58:28.597 回答