我正在寻找精确的算法,可以在 N 个相同的处理器中找到任务调度的最佳解决方案。
该算法的时间并不重要,最重要的是一个最佳解决方案(完成最后一个任务时所有处理器的最短时间)。
理论上描述该算法的方程如下:P||Cmax
如果有人有算法(尤其是 Java 算法)或伪代码,我将非常乐意寻求帮助。
我尝试编写自己的精确算法,但 id 不起作用:(。在下面的代码中,permUtil 是一个对应于排列的类。
方法参数:
- 任务 --> 所有任务,其中索引标识任务和值时间
- op --> 分配处理器(分配任务的处理器)
// 我们有一个全局数组 op 处理器 proc,其中索引是标识,值是该处理器上的任务调度时间
public void schedule(Byte[] tasks, int op)
{
PermUtil<Byte> permA = new PermUtil<Byte>(tasks);
Byte[] a;
// permutation of all tasks
while ((a = permA.next()) != null)
{
// assign tasks
for(int i=1; i< a.length; i++)
{
// get the b set from i to end
Byte[] b = Arrays.copyOfRange(a, i, a.length);
// all permutations off b set
PermUtil<Byte> permB = new PermUtil<Byte>(b);
while ((b = permB.next()) != null)
{
// task on assign processor
proc[op] = sum(Arrays.copyOfRange(a, 0, i));
if (op < proc.length)
schedule(b, ++op);
else
{
proc[++op] = sum(b);
}
}
}
}
}
这是迭代所有可能的分配的蓝图。
在真正的实现中你应该替换long
with BigInteger
,
并将数组初始化移到内部循环之外。
public void processOne(int nProcs, int nTasks, int[] assignment) {
/* ... */
}
public void checkAll(int nProcs, int nTasks) {
long count = power(nProcs, nTasks);
/* Iterate over all the possible assignments */
for (long j = 0; j < count; j++) {
int[] assignment = new int[nTasks];
for (int i = 0; i < nTasks; i++)
assignment[i] = (int) (j / power(nProcs, i) % nProcs);
processOne(nProcs, nTasks, assignment);
}
}
诀窍是将分配编码为数字。由于赋值代表nTasks
的决定,每一个都有nProcs
结果,它可以被认为是基数中的数字nProcs
having nTasks
数字。每个这样的数字都对应于一个有效的分配,并且每个分配在该范围内都有一个唯一的数字。迭代所有赋值很容易,因为我们基本上是迭代一系列整数。
您所要做的就是填写processOne(int, int, int[])
函数,这应该是相当简单的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)