目前,我使用图形来存储依赖项,然后运行没有任何依赖项的所有顶点.这有效,但感觉很糟糕.我应该使用更好的算法或数据结构吗?
#!/usr/bin/perl use strict; use warnings; use Graph; #FIXME: naive implementation,there may be a much better way to do this sub run_in_parallel { my $g = shift->copy; while (my @v = $g->vertices) { my @run = grep { $g->is_successorless_vertex($_) } @v; print "running ",join(",",@run)," in parallel\n"; for my $compenent (@run) { $g->delete_vertex($compenent); }; } } my $g = Graph->new; while (<DATA>) { my ($component,@dependencies) = split; unless ($g->has_vertex($component)) { $g->add_vertex($component); } for my $dependency (@dependencies) { unless ($g->has_vertex($dependency)) { $g->add_vertex($dependency); } $g->add_edge($component,$dependency); } } run_in_parallel($g); #component dependency list __DATA__ a b c d b e c f g d e f g
解决方法
另一个想法是到
use a Petri net.
图中的节点是它的位置,动作是它的过渡.
每个地方都应该只有一个启用转换,即使它没有依赖关系.
这样你甚至不需要放置任何初始令牌.
图中的节点是它的位置,动作是它的过渡.
每个地方都应该只有一个启用转换,即使它没有依赖关系.
这样你甚至不需要放置任何初始令牌.
这也包含了Karl Bielefeldt的建议.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。