在嵌入式上快速解决许多微小的线性规划问题
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
我想使用宽松的许可证快速解决此问题。
搜索我找到了谷歌的线性优化库 glop (Apache2),但是
- 这是一个相当大的依赖项,对于如此小的东西,7MB的代码
- 我担心设置 LP 问题的开销。
我觉得应该可以通过枚举顶点并测试目标函数来直接解决这个问题,但我无法绕开它。
是否有一个开销很小的小型 LP 库可供我使用?或者,我将如何分解数学?
解决方案可以合理地硬编码如下:
-
采用前两个线性约束并选择三个变量(有 10 种方法),您可以为其分配 0 或 max(有 8 种方法可以做到这一点)。这导致了 10 个基本的 2x2 系统,具有 8 个不同的右侧。
-
检查这些解决方案是否可接受(从 0 到 MAX 范围内的两个计算未知数)。
-
保留可接受的解决方案,以最小化目标。
我不会感到惊讶的是,仔细的微优化和展开的代码可以击败通用求解器(单纯形算法)。
我建议您使用线性规划的灵敏度分析(此处为Excel示例)。这个想法是求解 LP:min{ cx: Ax>= b }
给定的输入(c,A,b)
并找到解决方案保持最优的参数范围(使用上面链接中的公式)。如果您知道参数的近似可能边界,那么就需要解决许多 LP 并存储范围和解决方案。
你的可行集合是一个 5 维的超立方体,被两个平面切片。它足够小,可以以不同的形式表示 - 作为极端顶点的组合。可以枚举顶点,并且可以通过简单地评估每个顶点中的目标函数来找到最优值。
如果平面系数发生变化,则可以从将超立方体定义为极值顶点组合的 32 个顶点开始。
您需要编写一些代码来对平面上的极端顶点表示的区域(多面体)进行切片。
由于您只对其进行了两次切片,因此不会添加太多额外的顶点。
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 静态数据成员的问题-修复链接错误会导致编译器错误
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 一个关于在C++中重载布尔运算符的问题
- 首要问题的答案让值班员搞错了
- setlocale的C++土耳其字符串问题
- 如何重构类层次结构以避免菱形问题
- 基于boost的程序的静态链接——zlib问题
- 求解线性规划中最大化问题的C++算法
- 在嵌入式上快速解决许多微小的线性规划问题