国赛的A题,美赛的ABD题。
以寻找最优的策略为背景
一,线性规划模型
求一个线性目标函数在线性可行域的:最值问题
具体来说:约束(边界)为 线性的(直线),问题 为 线性的(直线)
什么是线性呢?
(线性代数)
向量(数的集合): 1,向量的基本运算
矩阵(向量的集合): 1,矩阵的运算(行列式怎么算,矩阵乘法,矩阵求逆)
用python进行矩阵运算
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = np.array([[1,2],[3,4],[5,6]])
c = np.array([[1,2,3]])
d = np.array([[9,8,7],[3,2,1]])
#矩阵加法
sum =a+d
#放缩
e=3*a
#数乘、矩阵乘
e = np.dot(a,b)#元素乘
e=a*d
#转置
e = c.T
e = np.array([[1,2],[3,4]])
#逆矩阵
result = np.linalg.inv(e)
#行列式
result = np.linalg.det(e)
#矩阵的秩
e = np.linalg.matrix_rank(d)
运用python求一次方程组的解
import numpy as np
A = np.array([[10,-1,-2],[-1,10,-2],[-1,-1,5]])#A为系数矩阵
b = np.array([72,83,42])#b为常数列
inv_A = np.linalg.inv(A)# A的逆矩阵
x = inv_A.dot(b) # A的逆矩阵与b做点积运算
x = np.linalg.solve(A,b) # 5,6两行也可以用本行替代
print(x)
from sympy import symbols, Eq, solve
x,y,z = symbols('x y z')
eqs = [Eq(10 * x - y - 2 * z, 72),
Eq(-x + 10 * y - 2 * z, 83),
Eq(-x -y + 5 * z, 42)]
print(solve(eqs,[x,y, z]))
标准形式 规范式
指令求解
代码略
二,非线性规划
什么是非线性?
(高数)
多元函数,多元函数的微分,多元函数求极值,拉格朗日乘子法和KKT(python实现)
例题代码
代码略
三,整数规划模型
0-1规划
指派问题
例题
代码略
四,动态规划
代码略
贪心策略
贪心算法总是作出在当前看来是最好的选择。也就是说贪心算法并不从整体最优上加以考虑,它所作出的选择只是在某种意义上的局部最优选择。当然,我们希望贪心算法得到的最终结果也是整体最优的。
贪心算法通过一系列的选择来得到一个问题的解。它所作的每一个选择都是当前状态下某种意义的最好选择,即贪心选择。希望通过每次所作的贪心选择导致最终结果是问题的一个最优解。这种启发式的策略并不总能奏效,然而在许多情况下确能达到预期的目的。解活动安排问题的贪心算法就是一个例子。下面我们着重讨论可以用贪心算法求解的问题的一般特征。
对于一个具体的问题,我们怎么知道是否可用贪心算法来解此问题,以及能否得到问题的一个最优解呢?这个问题很难给予肯定的回答。但是,从许多可以用贪心算法求解的问题中我们看到它们般具有两个重要的性质:贪心选择性质和最优子结构性质。
代码略
方法总结
单纯形法
思想: 固定变量,不断变换基向量求方程组的解带入,看是不是最优解,不是就更新迭代现阶段的解
蒙特卡洛法
蒙特卡洛方法就是在可行域范围内生成大批量随机数据点观测这些数据点在什么位置取得近似最优。但是生成点因为是随机的所以肯定是要生成大批量数据去做计算的,然后求出来的也只是数值的近似最优解,更多的适用于解非线性问题,线性问题是能得到准确解的。