最优化算法是一个很大的家族,线性规划只是很简单的一种,本文旨在引导大家理解什么叫最优化,简单说就是 在 所有 x 里面找到 y 最大的方法

 

线性规划

优化模型试图在满足给定约束的决策变量的所有值的集合中,找到优化(最大化或最小化)目标函数的决策变量的值。

 

它的三个主要组成部分是:

  • 目标函数:要优化的函数(最大化或最小化)。
  • 决策变量:影响系统性能的可控变量。
  • 约束:决策变量的一组约束(即线性不等式或等式)。非负性约束限制了决策变量取正值。  【约束都是线性的,故叫线性规划】

优化模型的解称为最优可行解。

 

示例

import numpy as np
import matplotlib.pyplot as mpl
from scipy import optimize

### 问题
# minmize:
#        -7x1+7x2-2x3-x4-6x5
# s.t.:
#        3x1-x2+x3-2x4=-3
#        2x1+x2+x4+x5=4
#        -x1+3x2-3x4+x6=12
#        xi>=0

### 线性规划代码
c = np.array([-7, 7, -2, -1, -6, 0])
a = np.array([[3, -1, 1, -2, 0, 0], [2, 1, 0, 1, 1, 0], [-1, 3, 0, -3, 0, 1]])
b = np.array([-3, 4, 12])

res = optimize.linprog(c, A_eq=a, b_eq=b, bounds=((0, None), (0, None), (0, None), (0, None), (0, None), (0, None)))
print(res)

# con: array([-6.18438634e-12, -1.54809499e-12, 1.85451654e-11])
# fun: -16.50000000001507
# message: 'Optimization terminated successfully.'
# nit: 6
# slack: array([], dtype=float64)
# status: 0
# success: True
# x: array([4.31310891e-13, 3.96214625e-13, 2.56502186e-13, 1.50000000e+00,
#           2.50000000e+00, 1.65000000e+01])

fun 是最终的 y,x 为对应的解

注意:约束必须是有限的可行解,不能是无穷解

 

更多用法

更完整的示例请看参考资料

如 xi>0 的约束如何表示

通过 [-1,0,0]*x1=-x1来表示 x1的非负约束

 

 

参考资料:

https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.linprog.html  官网

https://www.cnblogs.com/caiyishuai/p/11175373.html  【数学建模】线性规划各种问题的Python调包方法

https://baijiahao.baidu.com/s?id=1666564495926266704&wfr=spider&for=pc  使用Python进行线性规划示例