我想模拟一个节点的离开只能以“每n小时”的方式发生。我已经开始使用两个变量对此进行建模 - starttime[i,j,k] 显示车辆 k 何时以 j 作为目的地离开 i,x[i,j,k] 是一个二进制变量,如果车辆 k 从i 到 j,否则为 0。型号为:
maximize maxdrive: sum{i in V, j in V, k in K} traveltime[i,j]*x[i,j,k];
subject to TimeConstraint {k in K}:
sum{i in V, j in V} (traveltime[i,j]+servicetime[i])*x [i,j,k] <= 1440;
subject to StartTime{i in V,j in V, k in K}:
starttime[i,j,k] + traveltime[i,j] - 9000 * (1 - x[i,j,k]) <= starttime[j,i,k];
subject to yvar{i in V, j in V}:
sum{k in K} x[i,j,k] <= maxVisits[i,j];
subject to Constraint1{i in V, j in V, k in K, g in V, h in K}:
starttime[i,j,k] + TimeInterval[i]*x[i,j,k] <= starttime[i,g,h];
所讨论的约束是“Constraint1”,其中 i 是源节点,j 是目标节点,k 是车辆。索引 g 用于表明较晚的出发点可以到任何目的地节点。TimeInterval 对应于预期的间隔,即如果 i 处的 TimeInterval 为 2 小时,则从 i 出发的下一辆车的开始时间不得少于前一次出发的 2 小时。起源对应于特定产品(仅可从所述起源节点获得),而我希望车辆不被绑定到特定起源节点 - 它们应该能够在节点之间跳转以利用回程等。换句话说,我想进行这种约束不受车辆本身的约束,而是对原始节点的约束。
“最大化旅行时间”的目标函数可能看起来很奇怪,但目标函数实际上已经过时了。如果满足约束条件,则解决方案就足够了。最大化旅行时间只是试图“强制” x 变量变为 1。
问题是:我该怎么做?使用这个公式,所有 x[i,j,k] 变量都会从答案中消失(没有这个约束,一些二元变量 x 变为 1,而另一个变为 0。解决方案满足 maxVisits 要求。在约束下,所有 x 变量变为0 并且所有开始时间也变为 0。MINTO(求解器)也没有说明问题是不可行的。另外,如何分离车辆以便程序识别它是所有出发之间的比较?我宁愿不包括时间维度,它会提供更多的变量。
编辑:在使用非线性求解器尝试新模型后,我看到了一些奇怪的结果。具体来说,我使用限制 1440(分钟)作为车辆每天可以运行多长时间的上限。使用下面的这个模型,每个变量的解都是 0,但是 i、j、k 的所有组合的开始时间是 720(1440 的一半)。是否有人对导致此解决方案的原因有任何线索?此约束如何消除 starttime 高于 0 要求 x 必须为 1 之间的联系。
subject to StartTimeSelf{i in V, j in V, k in K, g in K, h in V}:
starttime[i,j,k]*x[i,j,k] + TimeInterval[i]*x[i,j,k] + y[i,k] <= starttime[i,h,g]*x[i,j,k];