java - Java中的Max-Flow图模拟

标签 java graph simulation

我正在为联赛体育项目编写Java程序,该程序会遍历每支球队当前进行的比赛以及他们接下来比赛的日程安排,然后基于此我制作一个流网络模型。计划的目的是找出哪些球队已经被淘汰并且没有机会获胜或与任何其他球队分享 1 个位置。在分析网络(应用 EdmondsKarp 算法)后,我找出团队是否被淘汰。现在我也想模拟一下这个。我使用 JGraphT 作为图形库,并且可能会使用 JGraph 进行可视化(原因:一旦创建 JGraphT 对象,我可以简单地用它们实例化 JGraph 对象并显示图形)。我昨天也发现了Jung框架,看起来不错。

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

最佳答案

如果我理解正确的话,您是在要求一种方法来动画您的算法并在动画中交互式地控制其执行,这与模拟不太一样(模拟只是通常在给定的时间间隔内执行模型 - 这与用户交互或动画无关,但当然也可以将两者结合起来)。

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

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

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

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

关于java - Java中的Max-Flow图模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1023184/

相关文章:

python - Monty Hall 模拟未按预期工作

c++ - C++的离散事件模拟器

Java 线程 - 生成大量线程的替代方案

java - 父类是否应该引用子类?

java - DefaultTableModel,添加行,动态列数

java - 在java中着色字符串的指定字符

matlab - 如何使用 MATLAB 绘制给定值的阶梯图?

java - JPanel 上的 MouseEvent - 坐标错误

python - NetworkX Graph 中所有节点之间的边

algorithm - 转换一棵树需要多少 Right Rotation?