在嵌入式上快速解决许多微小的线性规划问题

Solving many tiny linear programming problems quickly on embedded

作为在 iOS/Android 上运行的程序的一些实时渲染过程的一部分,用 C/C++ 编写,我需要解决许多微小的线性规划问题,有 5 个变量和 2 个约束, 即

minimize: a_0*x + b_0*y + c_0*z + d_0*u + e_0*v
subject to:
  p_1 = a_1*x + b_1*y + c_1*z + d_1*u + e_1*v
  p_2 = a_2*x + b_2*y + c_2*z + d_2*u + e_2*v
  0 <= x <= x_max
  0 <= y <= y_max
  0 <= z <= z_max
  0 <= u <= u_max
  0 <= v <= v_max

我想使用宽松许可证快速解决这个问题。

搜索我找到了 Google 的线性优化库 glop (Apache2),但是

  1. 这是一个相当大的依赖项,这么小的东西需要 7MB 的代码
  2. 我担心设置 LP 问题的开销。

我觉得应该可以直接解决这个问题,只需枚举顶点并测试 objective 函数,但我无法理解它。

有没有我可以使用的开销很小的小型 LP 库?或者,我将如何分解数学?

解决方案可以合理地硬编码如下:

  • 采用前两个线性约束和 select 三个变量(有 10 种方法),您可以为它们分配 0 或 max(有 8 种方法) ).这导致 10 个基本 2x2 系统,具有 8 个不同的右侧。

  • 检查这些解决方案是否可接受(两个计算的未知数在 0 到最大值范围内)。

  • 保留最小化 objective 的可接受解。

仔细微优化和展开的代码可以击败通用求解器(单纯形算法),我不会感到惊讶。

我建议您使用 Sensitivity Analysis for Linear Programming (example with Excel is here)。这个想法是解决 LP:min{ cx: Ax>= b } 对于给定的输入 (c,A,b) 并找到解决方案保持最佳的参数范围(使用上面 link 中的公式)。如果您知道参数的大致可能范围,那么只需求解多个 LP 并存储范围和解决方案即可。

你的可行集是一个被两个平面分割的 5 维超立方体。它足够小,可以用不同的形式表示——作为极端顶点的组合。可以枚举顶点,只需在每个顶点中评估objective函数即可找到最优

如果您的平面系数发生变化,您可以从将超立方体定义为极端顶点组合的 32 个顶点开始。

您需要编写一些代码来根据平面对由极端顶点表示的区域(多面体)进行切片。

因为你只切了两次,所以不会添加太多额外的顶点。