Я думаю об использовании параллелизма для одной проблемы, которую пытаюсь решить. Проблема примерно такая: данный вход (последовательность точек) находит лучший результат (самый большой треугольник, составленный из этих точек, самая длинная линия и т. Д.). В последовательности точек можно найти 3 разных «фигуры», однако меня интересует только та, у которой «лучший результат» (обычно в некоторой форме, умноженной на коэффициент длины). Назовем фигуры S1, S2, S3.
У меня есть 2 разных алгоритма для решения S1 - «S1a» в O (n 2 ), «S1b» в основном ведет себя лучше, но наихудший случай - о O (n 4 ).
Первый вопрос: есть ли какой-нибудь простой способ запустить S1a и S1b параллельно, использовать тот, который заканчивается первым, и останавливать другой? Насколько я читаю документацию, это может быть запрограммировано с использованием некоторого forkIO и уничтожение потоков при получении результата - просто спрашиваю, есть ли что-то попроще?
Второй вопрос - гораздо сложнее: я вызываю функцию оптимизации следующим образом:
optimize valueOfSx input
valueOfSx специфично для каждой фигуры и возвращает «оценку» (или оценку оценки) возможное решение. Оптимизация вызывает эту функцию, чтобы найти лучшее решение. То, что меня интересует, это:
s1 = optimize valueOfS1 input
s2 = optimize valueOfS2 input
s3 = optimize valueOfS3 input
<- maximum [s1,s2,s3]
Однако, если я знаю результат S1, я могу отбросить все решения меньшего размера, и, таким образом, заставить s2 и s3 сходиться быстрее, если лучшего решения не существует (или, по крайней мере, отбросить худшие решения и, таким образом, быть более экономичным). , Что я делаю сейчас:
zeroOn threshold f = decide .f
where decide x = if (x < threshold) then 0 else x
s1 = optimize valueOfS1 input
s2 = optimize (zeroOn s1 valueOfS2) input
s3 = optimize (zeroOn (max s1 s2) valueOfS3) input
Вопрос: могу ли я запустить, например, S2 и S3 параллельно таким образом, чтобы в зависимости от того, что завершится первым, обновился бы параметр «threshold» функции счета, выполняющейся в другом потоке? Что-то в смысле:
threshold = 0
firstSolution = firstOf (optimize (zeroOn threshold valueOfS2), optimize (zeroOn threshold valueofS3))
update threshold from firstSolution
wait for second solution