你可以这样表述问题:
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。
让我们写出约束条件:
- 如果将任务j分配给资源j,则xi,j = 1,否则为0。
- 此外,如果i-j>K,则xi,j = 0
因为您按顺序跟随资源,并且最多可以等待k个周期(i-j<=K)
然后您将获得以下线性规划:
最小化:Sum(C(i,j)*xi,j)
受制于:
xi,j在{0,1}中
对于所有i,Sum(xi,j) = 1
对于所有j,Sum(xi,j) = 1
如果i-j>K,则xi,j = 0
否则,xi,j>=0
您可能需要稍微调整一下约束条件... 一旦纠正了这个问题,这个解决方案应该是最优的,但我不确定贪心算法是否已经是最优的。
使用这种表达式处理多于两种不同资源会更加有趣。
希望我理解了您的问题,并且能够为您提供帮助。
修改:
我将翻译这个约束条件:
m(i) <= Min{ m(i') s.t. i'> 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
小于最小值相当于小于每个值。
然后新的约束集合为:
Sum(j*xi,j on j) <= Sum(j'*xi',j' on j') + K for all i' > i
你可以将这些约束条件添加到之前的条件中,从而得到一个线性规划问题。
你可以使用单纯形算法来解决它。