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

Solving many tiny linear programming problems quickly on embedded

本文关键字:线性规划 问题 许多微 解决 嵌入式      更新时间:2023-10-16

作为在 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

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

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

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

我觉得应该可以通过枚举顶点并测试目标函数来直接解决这个问题,但我无法绕开它。

是否有一个开销很小的小型 LP 库可供我使用?或者,我将如何分解数学?

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

  • 采用前两个线性约束并选择三个变量(有 10 种方法),您可以为其分配 0 或 max(有 8 种方法可以做到这一点)。这导致了 10 个基本的 2x2 系统,具有 8 个不同的右侧。

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

  • 保留可接受的解决方案,以最小化目标。

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

我建议您使用线性规划的灵敏度分析(此处为Excel示例)。这个想法是求解 LP:min{ cx: Ax>= b }给定的输入(c,A,b)并找到解决方案保持最优的参数范围(使用上面链接中的公式)。如果您知道参数的近似可能边界,那么就需要解决许多 LP 并存储范围和解决方案。

你的可行集合是一个 5 维的超立方体,被两个平面切片。它足够小,可以以不同的形式表示 - 作为极端顶点的组合。可以枚举顶点,并且可以通过简单地评估每个顶点中的目标函数来找到最优值。

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

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

由于您只对其进行了两次切片,因此不会添加太多额外的顶点。