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

时间:2016-03-11 11:04:38

标签: android c++ ios optimization linear-programming

作为在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问题的开销。
  3. 我觉得应该可以直接解决这个问题,只需枚举顶点并测试目标函数,但我无法绕过它。

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

2 个答案:

答案 0 :(得分:1)

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

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

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

  • 保留允许的最小化目标的解决方案。

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

答案 1 :(得分:1)

我建议你使用Sensitivity Analysis for Linear Programming(Excel的例子是here)。我们的想法是为给定的输入min{ cx: Ax>= b }求解LP:(c,A,b),并找到解决方案保持最佳的参数范围(使用上面链接中的公式)。如果您知道参数的大致可能界限,则需要解决许多LP并存储范围和解决方案。