【问题标题】:Unit test optimization program - Pyomo单元测试优化程序 - Pyomo
【发布时间】:2022-01-25 14:49:39
【问题描述】:

我正在用 pyomo 实现几个优化程序。

到目前为止,我已经用unittest 编写了一些关于最优目标值和最优变量值的集成测试。

我想为每个目标和约束编写单元测试,以确保它们得到正确实施。正确的做法是什么?

【问题讨论】:

  • 我认为这在很大程度上取决于您正在处理的问题的类型,如果您有某些情况下您知道正确(最佳)答案。如果您有一些输入组合绑定了一个约束,您可以运行它,检查约束 ant OBJ 函数,然后将驱动绑定约束的输入加倍并确保没有任何变化,等等。我发现的另一种策略很有用是将 obj 函数(假设它有点复杂)分解成表达式,然后分别检查/测试它们
  • @AirSquid 感谢您的评论。我不确定我是否理解“将驱动绑定约束的输入加倍并确保没有任何变化等”部分。能否请您给出一些精确的信息?
  • 是的,我不确定我说的是否正确...让我发布一个更完整的概念作为答案...
  • 我通常专注于对输入数据和解决方案。每次发生奇怪的事情时,尝试添加可以防止这种情况发生的测试。

标签: python unit-testing mathematical-optimization pyomo


【解决方案1】:

这里有几个策略可能有用,我很好奇其他人是否有其他贡献。

  1. 如果您知道特定场景/数据集的目标值, 对那个值 +/- 一些增量进行单元测试是不费吹灰之力的 你的解决方案

  2. 如果您有一些应该绑定的约束,您可以组成一组输入以确保它绑定。例如,假设您有一个玩具模型,它有 2 个输入:卡车的数量和汽油的加仑数,目标是根据卡车容量、卡车数量、旅行用汽油的一些逻辑限制,在卡车中移动一些包裹。你可以:

  • 作为基准,为模型提供 1 辆卡车和足够的汽油,供 1 次行程使用,并且
    确保解决方案提供 1 卡车的 pkgs

  • 添加一堆额外的卡车并确保目标保持不变(受气体限制)

  • 投入 0 辆卡车 / 0 辆汽油,然后看看什么都没有发生。

  1. 如果您有一个复杂的目标函数,您可以将其分解为表达式,并对这些元素进行检查或断言检查。继续前面的示例,如果您的目标是递送包裹、对使用的旅行和汽油进行处罚,您可以...
pkgs_delivered = sum(...)
trip_count = sum(...)
gas_used = sum(...)
w_1, w_2 = # some weights for penalties...

mdl.obj = pyo.Objective(expr= pkgs_delivered - w_1 * trip_count - w_2 * gas_used, sense=pyo.maximize)

然后您可以在单元测试中剥离这些元素(如果有意义的话)并检查它们的值,因为它们是 pyomo expressions

assertEqual(trip_count.value(), 8, 'this setup should have 8 trips')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-09
    相关资源
    最近更新 更多