0

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

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

4

1 回答 1

1

如果我对您的理解正确,那么您正在寻求一种方法来为您的算法设置动画并从动画中交互式控制其执行,这与模拟并不完全相同(模拟通常在给定的时间间隔内执行模型- 这与用户交互或动画无关,但当然也可以与两者结合)。

我建议您将问题分为两个主要部分,交互和动画。两者都可以通过应用模型-视图-控制器方法来解决:

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

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

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

于 2009-06-22T18:49:59.510 回答