Java中的Max-Flow图形仿真

时间:2009-06-21 04:12:20

标签: java graph simulation

我正在为联盟体育编写Java程序,通过每个团队的当前游戏和他们的下一个游戏的时间表,然后基于我制作流动网络的模型。计划的想法是找出已经被淘汰的团队,并且没有机会与任何其他团队一起赢得或分享1个地方。在分析网络(应用EdmondsKarp算法)后,我发现团队是否被淘汰了。现在我也想模拟这个。我使用JGraphT作为图形库,可能会使用JGraph进行可视化(原因:一旦我创建了JGraphT对象,我可以简单地用它们实例化JGraph对象并显示图形)。昨天我也发现了Jung框架,看起来不错。

主要问题是我从未写过模拟,这是我需要“Hello World”帮助的地方。当我说模拟时,我的意思是我想在视觉上显示算法执行的每个部分,这里是示例场景:算法必须找到扩充路径,所以我想显示何时将每个新边缘添加到扩充路径。用户将能够播放和停止动画。我还想在所有边缘和类似的东西中显示流量的变化。到目前为止,我有算法工作,但我不知道如何进行模拟。我应该使用单独的线程进行模拟执行吗?我应该编写单独的类,它将作为算法执行,但状态记录甚至不知道真正的算法(因为我不想中断真实算法的性能)。我是否应该使用当前算法并在其间添加一些行来保存某些数据结构中的执行状态,以后我可以使用它来向用户显示模拟?任何想法都可能有所帮助..

1 个答案:

答案 0 :(得分:1)

如果我理解你的话,你就是想要一种方法来动画你的算法并从动画中以交互方式控制它的执行,这与模拟不同(模拟只是通常在给定的时间间隔内执行模型 - 这与用户交互或动画无关,但当然也可以与两者结合使用。

我建议你将问题分成两个主要部分,即交互和动画。两者都可以通过应用model-view-controller方法来解决:

  • 要与您的算法进行互动,请确定您要区分的“原子步骤”,例如:向路径添加边缘。然后,您可以将算法扩展为逐步工作,也可以编写一个包含算法的额外类,并为逐步执行提供必要的例程。

  • 要为算法所处的当前状态设置动画,您应该使用observer pattern,其中您的动画组件是观察者,并在算法状态发生变化时通过算法通知,例如边缘被添加到路径中。您还可以通过传递提示(例如已添加到路径中的边缘对象)来描述实际状态更改;这可能会更容易想象旧状态和新状态之间的差异。

关于你的线程问题:算法应该在一个额外的线程中运行(除非它非常快),你也可以将动画放在一个额外的线程中(这可能已经由JGraph提供了,只需检查文档或者按照建议使用他们的组件。但是,您应该注意,即使 在另一个线程中运行,您的算法的运行时性能几乎肯定会受到影响的影响(因为通知仍然必须由算法完成) - 所以要小心进行性能分析并使用未动画版本进行此类研究。