【问题标题】:Can I implement a multi objective optimization problem in Anylogic using optimization experiment?我可以使用优化实验在 Anylogic 中实现多目标优化问题吗?
【发布时间】:2021-02-15 17:06:14
【问题描述】:
我正在尝试在 Anylogic 中使用基于 Anylogic 代理的建模和自定义实验功能来实现多目标优化实验,以在每次修改参数的情况下循环运行模型。在每次模拟运行结束时,我检查 3 个目标函数的值,使用遗传算法修改参数并再次运行。
据说优化和参数变化实验可以利用Anylogic中的多核处理。我正在尝试找到一种方法来利用此选项并使我的实验运行得更快。
任何线索都可以提供帮助!
谢谢
【问题讨论】:
标签:
java
optimization
genetic-algorithm
anylogic
【解决方案1】:
所以看起来您的问题实际上是关于如何将运行并行化(就像其他 AnyLogic 实验类型可以做的那样)添加到您创建的自定义实验中,以使用遗传算法(GAs)进行您自己的多目标优化)。 (我建议您编辑您的问题标题,因为正如 Ben 在他的评论中所建议的那样,它非常具有误导性。)但我也会稍微覆盖更广的角度。
我正在尝试使用 Anylogic 中的 [...] 自定义实验功能来实现多目标优化实验,以便每次使用修改后的参数循环运行模型。在每次模拟运行结束时,我检查 3 个目标函数的值,使用遗传算法修改参数并再次运行。
是的,如果您想要一种特定的 GA 驱动风格的多目标“优化”(这不是使用 OptQuest 启发式优化的 AnyLogic 意义上的优化,因此是引号),您将需要使用自定义实验,其中您可以设置/与 GA 交互,并根据需要明确控制运行的设置/创建。
据说优化和参数变化实验可以利用Anylogic中的多核处理。我正在尝试找到一种方法来利用此选项并让我的实验运行得更快。
这些实验中的并行化只是意味着运行在单独的 Java 线程中执行,因此这自然会在您拥有的 CPU 内核之间进行并行化。您可以通过 Tools --> Preferences --> Runtime 中的“Number of processor for parallel execution”设置来限制并行度。
因此,在自定义实验中,您需要自己使用 Java 并发显式处理此问题(创建您自己的一组 Thread 对象,这些对象通过模板自定义实验代码中已包含的步骤进行模型设置和执行)。如果您还不了解这些技术,您将需要学习并对它们充满信心。 (Java 8 添加了许多改进的并发处理技术。)没有更高级别的 AnyLogic API 来处理它。
NB:您还必须处理控制运行选择的事物(在您的情况下为 GA)如何处理并行性。例如,如果您要并行启动 4 批运行,它会在决定下一组模型参数之前等待所有 4 次运行完成(因此它拥有所有客观结果的完整信息),还是在每个完成时做出决定? (在开启并行执行的优化实验中,AnyLogic 的 OptQuest 优化器也不得不担心这一点。)