解释有点复杂,但我们现在就去。基本上,问题是“如何以有效的方式将问题分解为子问题”。这里的“高效”意味着,破碎的子问题尽可能大。基本上,如果我根本不需要解决问题,那将是理想的。但是,因为工人只能在特定的问题上工作,所以我需要分手。但我想找到尽可能粗糙的方法。分配工作的高效算法?
下面是一些伪代码..
我们有这样的问题(对不起这是在Java中,如果你不明白,我会很高兴来解释)。
class Problem {
final Set<Integer> allSectionIds = { 1,2,4,6,7,8,10 };
final Data data = //Some data
}
而且一个子问题是:
class SubProblem {
final Set<Integer> targetedSectionIds;
final Data data;
SubProblem(Set<Integer> targetedSectionsIds, Data data){
this.targetedSectionIds = targetedSectionIds;
this.data = data;
}
}
工作将这个样子,然后。
class Work implements Runnable {
final Set<Section> subSections;
final Data data;
final Result result;
Work(Set<Section> subSections, Data data) {
this.sections = SubSections;
this.data = data;
}
@Override
public void run(){
for(Section section : subSections){
result.addUp(compute(data, section));
}
}
}
现在我们有“工人”的情况下,有自己的状态sections I have
。
class Worker implements ExecutorService {
final Map<Integer,Section> sectionsIHave;
{
sectionsIHave = {1:section1, 5:section5, 8:section8 };
}
final ExecutorService executor = //some executor.
@Override
public void execute(SubProblem problem){
Set<Section> sectionsNeeded = fetchSections(problem.targetedSectionIds);
super.execute(new Work(sectionsNeeded, problem.data);
}
}
phew。
所以,我们有很多Problem
s和Workers
不断要求更多。我的任务是将分解为SubProblem
并提供给他们。然而,难点在于我必须稍后收集SubProblems的所有结果,并将它们合并(减少)为整个Problem
的Result
。然而,这是昂贵的,所以我想给工人尽可能大的“块”(尽可能多的targetedSections
)。
它不一定是完美的(数学上尽可能高效或者什么的)。我的意思是,我想不可能有完美的解决方案,因为你无法预测每次计算需要多长时间,等等。但是有没有一个很好的启发式解决方案?或者,也许我可以在设计之前阅读一些资源?
任何意见是高度赞赏!
编辑: 我们也控制部分分配,所以控制这是另一种选择。基本上,对此的唯一限制是工人只能有固定数量的部分。
我真的不知道它是否适用,因为我没有足够的了解它,但叉/加入似乎是这样做的算法。 http://www.ibm.com/developerworks/java/library/j-jtp11137.html – nicerobot 2010-03-27 21:50:45
谢谢。我试图让我的头在附近。但问题是,即使我使用这个框架,我仍然必须提供分割任务的逻辑等等。所以我仍然会遇到这个问题。 – 2010-03-27 22:42:08
分布式计算当然是一项不平凡的任务,而且一个活动高性能计算(HPC)研究领域。一本体面的大学文本是McGraw-Hill的Michael Quinn的“用MPI和OpenMP编写C语言的并行编程”ISBM 0-07-282256-2 – 2010-03-28 03:59:05