Предостережение: у меня нет опыта работы с вашей проблемной областью, так что, возможно, это и не ответ. Однако это может дать некоторые указания относительно того, где могут возникнуть проблемы (надеюсь).
Я запустил ваш код со следующими данными в prot.ini:
ARR1 MafB
MafB JunD
ARR1 MET4
ARR1 ATF1
ARR1 BACH1
ARR1 CHOP
ATF1 BACH1
ATF1 MET4
ATF1 NFE2L1
ATF2 ATF7
ATF2 BATF
(убрал гипс для удобочитаемости!)
после функции dijkstra% prev выглядит так:
$prev = {
'ATF1' => 'ARR1',
'MafB' => 'ARR1',
'BACH1' => 'ARR1',
'BATF' => 'ATF2', # problem here
'ATF2' => 'BATF', # values are cyclic
'CHOP' => 'ARR1',
'ARR1' => 'ARR1',
'JunD' => 'MafB',
'NFE2L1' => 'ATF1',
'ATF7' => 'ATF2',
'MET4' => 'ARR1'
};
В вашем print_path цикл while $ t бесконечно чередуется между 'BATF' и 'ATF2'.
Вы можете обнаружить это в функции print_path - но в итоге я добавил следующую строку в функцию dijkstra, чтобы предотвратить циклические проблемы:
if (($dist{$node2} eq inf)) {
$dist{$node2} = $dist{$node1} + $graph->{$node1}{$node2};
if ($prev{$node1} ne $node2) {
$prev{$node2} = $node1;
}
}
затем я изменил цикл while в функции print_path:
while ($tmp ne $root) {
$tmp = $prev->{$tmp};
last unless $tmp;
$path = "$tmp -> $path";
}
Также я заметил, что в этой строке:
$dist{$node2} = $dist{$node1} + $graph->{$node1}{$node2};
$ dist {$ node1} может быть бесконечностью, поэтому результатом будет бесконечность. Не уверен, что это намеренно.
Надеюсь, это поможет.