説明するのは少し複雑ですが、ここまでです。基本的には、「いかに効率的に問題を部分問題に分解するか」が課題です。ここでの「効率的」とは、分割された部分問題が可能な限り大きいことを意味します。基本的に、問題を分解する必要がまったくなければ理想的です。ただし、ワーカーは問題の特定のブロックにしか取り組むことができないため、私は解散する必要があります。しかし、これをできるだけ粗くする方法を見つけたいと思っています。
ここにいくつかの擬似コードがあります..
このような問題があります (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));
}
}
}
これで、独自の state を持つ「Worker」のインスタンスができました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);
}
}
ふぅ。
そのため、私たちは多くの を持っており、より多くのProblem
をWorkers
常に求めていますSubProblems
。私の仕事は、彼らに別れProblems
をSubProblem
告げることです。ただし、難しいのは、後で SubProblems のすべての結果を収集し、それらをResult
全体の にマージ (削減) する必要があることProblem
です。
ただし、これにはコストがかかるため、ワーカーにできるだけ大きな「チャンク」を提供したいと考えています (できるだけ多くのチャンクを持ってtargetedSections
います)。
完璧である必要はありません (数学的に可能な限り効率的か何か)。つまり、各計算にかかる時間を予測できないなどの理由で、完全な解決策を見つけることは不可能だと思います。しかし、これに対する優れたヒューリスティックな解決策はありますか? それとも、設計に入る前に読むことができるリソースはありますか?
どんなアドバイスでも大歓迎です!
編集:セクション割り当ても制御できるため、それを制御することは別のオプションです。基本的に、これに関する唯一の制限は、ワーカーが固定数のセクションしか持つことができないということです。