Algorithm 蓄水调度

Algorithm 蓄水调度,algorithm,optimization,workflow,scheduling,Algorithm,Optimization,Workflow,Scheduling,MIB总部有N个水箱。水箱我最多可以储存ci单位的水。每个储罐都有自己的进出管道。水箱i的进水管以ui的速率漏水,这意味着如果我们想将100单位的水放入水箱i,将消耗100/(1-ui)的水。输出管道都是完美的。其容量为ini和outi,这意味着储罐i的进水管在一个单位的时间内最多可输送ini单位的水(包括泄漏),而出水管在一个单位的时间内最多可输送outi单位的水 整数序列wt(1

MIB总部有N个水箱。水箱我最多可以储存ci单位的水。每个储罐都有自己的进出管道。水箱i的进水管以ui的速率漏水,这意味着如果我们想将100单位的水放入水箱i,将消耗100/(1-ui)的水。输出管道都是完美的。其容量为ini和outi,这意味着储罐i的进水管在一个单位的时间内最多可输送ini单位的水(包括泄漏),而出水管在一个单位的时间内最多可输送outi单位的水

整数序列wt(1 N<10000,T<10000


首先,这是一个无法单独工作的方案,因为它忽略了对最大流入和流出率的限制,所以解决了一个更简单的问题

这里比较棘手的一点似乎是,在什么时候使用哪个坦克。看起来Ui值越低的坦克越好。如果您采取的任何顺序都是用较高的Ui值填充一个水箱,而有较低的Ui值的水箱有空间,那么您可以通过先填充较好的水箱,并在使用本应放入较差水箱中的水时使用额外的水来获得较好的顺序。类似地,如果你在一个好的水箱里有水的情况下从一个坏的水箱里取水,你可以通过从好的水箱里取水来获得更好的顺序,这样你就有机会在本来要往坏的水箱里注水的时候给它注水

所以看起来,当你加满一个油箱时,你想加满最好的油箱,当你清空一个油箱时,你想清空最好的油箱。考虑到这一点——并且假设没有你没有提到的任何限制,比如整数量的水在传输中——看起来在任何给定的情况下都很容易找到最佳的时间表。所以,试试这个最好的时间表,如果它不起作用,什么都不会

上述方法不起作用,因为我忽略了约束。我当然忽略了流入和流出率,我还假设在每一步中可以使用多个油箱,我怀疑情况可能并非如此

还有其他方案可以解决更简单的问题-您可以忽略除流出率以外的所有约束,在每个阶段以您能达到的最高流出率填充水箱,并以能够满足需求的最低流出率从水箱供水

这些变体不能解决您的问题,但如果忽略某些约束时没有解决方案,则原始问题就没有解决方案。这导致了分支和绑定的变体

1) 如果一个简单的贪婪解找到了一个好的时间表,那么这个序列显然是可解的

2) 试着解决容易的问题。如果其中任何一个是不可解的,那么这个序列就没有解


3)考虑第一次步骤的所有可能的选择,递归地调用你自己来解决产生的较短序列,从水箱中的水开始。一旦他们中的任何一个找到了解决方案,你就可以带着它返回。如果你检查所有问题,他们都说“没有解决方案”,那么就没有解决方案。

听起来像是家庭作业。你试过什么?@thursdaysgeek这真的不是家庭作业。我试图将其建模为一个线性规划问题。不过,这需要O((NT)^2)内存,只是不可行。嗨@mcdowella,谢谢你的回复。问题是,除了UI之外,我们仍然需要考虑CI。假设我们有两个油箱,u1=0,u2=0.5,in1=10,in2=10,c1=10,c2=20。W=(10,20)。如果我们先给1号水箱加满水,那么1号水箱将在时间段1后加满,最后我们将有15个单位的水(10个来自1号水箱,5个来自2号水箱)。在这种情况下,先给油箱2加满油更好。好吧-我过度简化了它,遗漏了细节(和往常一样!)。然而,我注意到,如果你发现问题的过度简化版本是无法解决的,那么主要问题也不是。所以我想你们可以试试这个分支和绑定,编辑我的答案来描述这个。