Это немного сложно объяснить, но здесь мы идем. По сути, проблема заключается в том, «как эффективно разбить проблемы на подзадачи». «Эффективный» здесь означает, что разбитые подзадачи как можно больше. По сути, было бы идеально, если бы мне вообще не приходилось разбирать проблемы. Тем не менее, поскольку работник может работать только над определенными блоками проблем, мне нужно расстаться. Но я хочу найти способ сделать это как можно более грубым.
Вот какой-то псевдокод ..
У нас есть такие проблемы (извините, это на 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);
}
}
уф.
Итак, у нас много Problem
с, и Workers
постоянно просят больше SubProblems
. Моя задача разбить Problems
на SubProblem
и отдать им. Сложность, однако, заключается в том, что позже мне нужно собрать все результаты для подзадач и объединить (уменьшить) их в Result
для всего Problem
.
Это, однако, дорого, поэтому я хочу дать рабочим "куски" как можно большего размера (имеет как можно больше targetedSections
).
Это не обязательно должно быть идеально (математически настолько эффективно, насколько это возможно или что-то в этом роде). Я имею в виду, я думаю, что невозможно найти идеальное решение, потому что вы не можете предсказать, сколько времени займет каждое вычисление и т. Д. Но есть ли хорошее эвристическое решение для этого? Или, может быть, некоторые ресурсы, которые я могу прочитать, прежде чем приступить к проектированию?
Любой совет высоко ценится!
EDIT:
У нас также есть контроль над Распределением Разделов, так что это еще один вариант. По сути, единственным ограничением является то, что рабочий может иметь только фиксированное количество секций.