我想模拟一个节点的偏离只能以“每n小时”的方式进行 . 我已经开始使用两个变量对此进行建模 - starttime [i,j,k]显示当车辆k以j作为目的地离开i时,x [i,j,k]是具有值1的二进制变量,如果车辆k从我到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];