我正在寻找一个分配问题的解决方案,其中任务来了并且需要按顺序分配,但是您可以使任务等待最多K个周期。
正式地,让有一系列有序的任务 aabbaba ... 和有序的资源序列 ABBABAA ... ,系统可以使用边堆栈。目的是将最多 a (resp b )任务与 A (resp B )资源相匹配。 约束条件如下:每个句点 i 程序获取资源 i 并将其分配给任务。资源被分配给堆栈中的任务,或者继续按顺序从任务序列中读取。读取的每个任务可以立即分配给资源 i ,也可以放在堆栈中,如果它将在 K 期间等待,并将分配给它匹配(a-> A,b-> B)。
如果 K = 0 ,则必须将 i -th任务分配给 i -th资源,这非常糟糕。如果 K> 0 ,那么使用贪婪算法可以做得更好。什么是最佳解决方案?
澄清:
通过排列 m 表示赋值,其中 m(i)= j 表示资源 j 已分配给任务 i 。如果没有堆栈 m(i)= i 。当存在堆栈时,可以不按顺序分配任务,但是如果将 i 之后的任务放入堆栈中,则 i 必须分配以下其中一个 K 资源。也就是说,如果所有任务 i :
,则分配是合法的m(i)< = Min {m(i')s.t。我'> i} + K
我正在寻找能够在满足约束的所有分配中找到具有最小错失分配量(aB或bA)的分配的算法。
答案 0 :(得分:3)
您可以通过这种方式表达问题:
ressources=[a,b,b,a,b,a,a,...]
tasks=[a,a,b,b,a,b,a,...]
我们可以定义一个将任务j分配给资源i的成本函数:
C(i,j)= (ressources[i]==tasks[j])*1+(ressources[i]!=tasks[j])*1000
我选择1000>>如果您无法满足要求,则为1。
让我们写下约束:
因为你一个接一个地关注资源 你可以等待k period max(i-j <= K)
然后您将获得以下线性程序:
最小化:总和(C(i,j)* xi,j)
受制于:
xi,j在{0,1}
所有i的总和(xi,j)= 1
所有j的总和(xi,j)= 1
xi,j = 0,如果i-j> K
xi,j&gt; = 0否则
你可能需要纠正一些约束......一旦纠正这个解决方案应该是最优的但是我不确定贪婪算法是不是已经最优。
使用具有2个以上不同资源的配方会更有趣。
希望我理解你的问题并帮助
<强>修改:强>
我会翻译这个约束:
m(i)&lt; = Min {m(i')s.t。我'&GT; i} + K
注意:强>
if xi,j =1 then Sum(j*xi,j on i) = j since only one xi,j = 1
<强> “翻译”:强>
以前的符号:
_m(i) <= Min{ m(i') s.t. i'> i } + K_
< = > j <= Min{j' s.t i'>i and xi',j' =1 } + K_ (OK ?)
新的线性约束:
我们有:
xi,j=1 < = > Sum(j*xi,j on j) = j for i
and
xi',j'=1 < = > Sum(j'*xi',j' on j') = j' for all i'
因此:
j <= Min{j' s.t i'>i and xi',j' =1 } + K_
< = >
Sum(j*xi,j on j) <= Min { Sum(j'*xi',j' on j') , i'>i} + K
和小于min相当于小于每个。
然后新的约束集是:
Sum(j*xi,j on j) <= Sum(j'*xi',j' on j') + K for all i' > i
您可以将这些约束添加到之前的约束中,然后获得线性程序。
您可以使用单纯形算法解决此问题。