我正在做一个使用CPLEX解算器的项目,在Netbeans上使用Java。我们有几个优化问题要解决,我已经通过用Java编码所有的约束、目标和变量来解决其中的一个问题,而不使用AMPL。然而,我团队中的一些人想要使用AMPL。
因此,由于我不想阅读所有的AMPL书籍来寻找答案,那么有没有一个明显的理由宁愿使用AMPL而不是“手动”编写所有的约束?此外,AMPL可以集成到Netbeans中吗?我没有找到任何关于这方面的文档。当约束需要“灵活”时,AMPL有用吗(我的意思是,我们不能预先猜测约束的确切数量,它取决于用户固定的参数,模块化是一个非常重要的因素……)
我真的很好奇能很快听到这件事!
感谢你的帮助
发布于 2017-10-31 07:04:26
AMPL是一种代数建模语言,并引用了该链接:
AMPL的一个优点是它的语法与优化问题的数学表示法相似。
例如,这允许您在不预先知道模型尺寸的情况下定义约束组。也许,您可以更快地对模型进行重大更改。(你必须考虑一下你实际做这件事的频率。)
然而,有人可能会争辩说,AMPL的“明显优势”是它支持数十种不同的求解器。您可以创建模型并使用CPLEX进行求解,但随后决定使用不同的求解器(例如,Gurobi、Xpress等)。在AMPL Solvers网页上,他们有以下建议:
我们建议您测试替代求解器,以确定哪种求解器能够在价格和性能之间提供最佳折衷,以满足您的需求。
AMPL网页上说有一个Java API,所以应该允许您将其包含在API项目中,但我对此没有经验。
说到底,你也可以说这些“优势”是品味的问题。直接使用CPLEX Java API当然是一个有效的解决方案,如果它满足您的需求,就像您已经做过的那样。它可能允许您更有效地构建模型,使用AMPL可能不支持的求解器特定/高级功能,并对模型公式进行更细粒度的控制。
发布于 2017-10-31 16:04:29
您刚刚编写了一个优化模型来优化您公司的小部件生产。你的公司在$SOLVER1上得到了很好的交易,所以这就是你正在使用的。
在接下来的十年里,当你的老板向你提出新的要求时,你会改进和扩展这个模型。到那个时候,你可能会有数以万计的优化代码作为系统的一部分,到目前为止,这个系统对你公司的运营绝对是至关重要的。
您公司的原始许可协议已经过期,而$SOLVER1的制造商大幅提高了许可费用,因此您现在每年要支付数十万的许可费用。
与此同时,一家竞争对手公司的研究人员刚刚发布了新版本的$SOLVER2。它有奇特的新算法,可以比$SOLVER1快20%的速度解决小部件优化问题,并找到更好的解决方案。它的成本并不比$SOLVER1高,而且性能更好。
与此同时,开源社区发布了$FREESOLVER。它可能不像顶级的商业选择那样强大,但它和十年前的$SOLVER1一样好,如果你不是每年支付10万美元的许可费用,你可以租用大量的服务器时间来弥补它。
...so,你有没有在一个平台上写你的优化模型,让你切换到一个新的求解器,并利用这些机会,而不需要丢弃十年的代码?
能够快速、轻松地切换求解器具有巨大的优势。我知道有一家公司在他们的工作中使用了三种不同的求解器:他们尝试了两种不同的开源求解器,它们都在云中运行,如果这两种求解器都不能找到足够的解决方案,他们就会把它扔给一个昂贵的具有更智能算法的求解器。开源求解器处理了90%的问题,因此他们只需要使用最后10%的商业求解器,这使得他们可以节省大量的许可成本。
我们在工作中讨论过的一种选择是,将商业求解器用于任务关键型工作,并将开源替代方案用于我们没有相同要求的应用程序,如培训或小规模原型设计。这样,我们可以最大限度地减少商业求解器需要许可的并发用户数量。
(是的,平台仍然存在锁定问题,但像AMPL这样的平台比高端商业解决方案便宜得多。)
发布于 2017-10-31 14:50:23
完全同意rkersh所说的一切。还要注意,无论你是用代数建模语言还是通过更直接的API,你都不应该以硬编码问题大小等细节的方式来编写你的模型。
此外,使用建模语言为您提供了额外的抽象层/抽象层,这可以帮助您,特别是在与其他人共享或解释您的模型,与一系列标准问题类型等进行比较时,但我更喜欢使用更直接的API的更具体的“感觉”,并且几乎不需要(或有时间和预算)来重新构建我的模型。
https://stackoverflow.com/questions/47019354
复制相似问题