CvxPy整数规划笔记
CvxPy整数规划笔记
安装
1 | pip install cvxpy |
实例:[HNCTF 2022 WEEK3]Help_Me!
01背包问题。
1 | import numpy,cvxpy,sys |
选课策略模型
课号 | 课名 | 学分 | 所属类别 | 先修课要求 |
---|---|---|---|---|
1 | 微积分 | 5 | 数学 | |
2 | 线性代数 | 4 | 数学 | |
3 | 最优化方法 | 4 | 数学;运筹学 | 微积分;线性代数 |
4 | 数据结构 | 3 | 数学;计算机 | 计算机编程 |
5 | 应用统计 | 4 | 数学;运筹学 | 微积分;线性代数 |
6 | 计算机模拟 | 3 | 计算机;运筹学 | 计算机编程 |
7 | 计算机编程 | 2 | 计算机 | |
8 | 预测理论 | 2 | 运筹学 | 应用统计 |
9 | 数学实验 | 3 | 运筹学;计算机 | 微积分;线性代数 |
要求:至少选两门数学课、三门运筹学、两门计算机课。
决策变量:$\displaystyle x_i=\begin{cases}1:选修课号i的课程\0:不选课号i的课程\end{cases}$
目标函数:$\displaystyle\min\left{\sum_{i=1}^0x_i\right}$
约束条件:
最少2门数学课,3们运筹学课,2门计算机课:
$$
\begin{cases}
\displaylines{
x_1+x_2+x_3+x_4+x_5\geqslant2\\
x_3+x_5+x_6+x_8+x_9\geqslant3\\
x_4+x_6+x_7+x_9\geqslant2
}
\end{cases}
$$先修课程要求:
例如$2x_3-x_1-x_3\leqslant0$即为$\displaystyle x_3\leqslant\frac{x_1+x_3}{2}$。
$$
\begin{cases}
\displaylines{
2x_3-x_1-x_2\leqslant0\\
x_4-x_7\leqslant0\\
2x_5-x_1-x_2\leqslant0\\
x_6-x_7\leqslant0\\
x_8-x_5\leqslant0\\
2x_9-x_1-x_2\leqslant0
}
\end{cases}
$$
1 | import numpy,cvxpy |
目标改变:选修课程最小时,为了学分尽量多,应学习哪些课程?
目标函数:$\displaystyle\max\left{\sum_{i=1}^9c_ix_i\right}$
约束条件添加:$\displaystyle\sum_{i=1}^9x_i=6$
1 | import numpy,cvxpy |
装箱问题
有$7$种规格的包装箱要装到两辆铁路平板车上去。包装箱的宽和高是一样的,但厚度$l$(单位:厘米)及重量$w$(单位:千克)是不同的。每辆平板车有$10.2\textrm{m}$长的地方来装包装箱,载重量为$40\textrm{t}$。对$C_5,C_6,C_7$类包装箱的总数有一个特别的限制:这类箱子所占的空间(厚度)不能超过$302.7\textrm{cm}$。要求给出最好的装运方式。
$C_1$ | $C_2$ | $C_3$ | $C_4$ | $C_5$ | $C_6$ | $C_7$ | |
---|---|---|---|---|---|---|---|
$l/\textrm{cm}$ | $48.7$ | $52.0$ | $61.3$ | $72.0$ | $48.7$ | $52.0$ | $64.0$ |
$w/\textrm{kg}$ | $2000$ | $3000$ | $1000$ | $500$ | $4000$ | $2000$ | $1000$ |
件数 | $8$ | $7$ | $9$ | $6$ | $6$ | $4$ | $8$ |
设决策变量$x_{ij}(i\in{1,2},j\in{1,2,\cdots,7})$表示第$i$辆车上装第$j$种包装箱的件数,$l_j,w_j,a_j(j\in{1,2,\cdots,7})$分别表示第$j$种包装箱的厚度、重量和件数。
体积上多装
约束条件:
$$
\begin{cases}
\displaylines{
\displaystyle\sum_{i=1}^2x_{ij}\leqslant a_j,&j\in{1,2,\cdots,7}\\
\displaystyle\sum_{i=1}^7l_ix_{ij}\leqslant1020,&i\in{1,2}\\
\displaystyle\sum_{i=1}^7w_jx_{ij}\leqslant40000,&i\in{1,2}\\
\displaystyle\sum_{j=5}^7l_j(x_{1j}+x_{2j})\leqslant302.7,&x_{ij}\in\mathbb{N_+},i\in{1,2},j\in{1,2,\cdots,7}
}
\end{cases}
$$
目标函数:$\displaystyle\max\left{\sum_{j=1}^7l_j(x_{1j}+x_{2j})\right}$
1 | import cvxpy,numpy |
重量上多装
目标函数改为:$\displaystyle\max\left{\sum_{j=1}^7w_j(x_{1j}+x_{2j})\right}$
1 | import cvxpy,numpy |
非线性规划
问题一
$$
\min\left{\dfrac{2+x_1}{1+x_2}-3x_1+4x_3\right},x_i\in[0.1,0.9],i\in{1,2,3}
$$
1 | from scipy.optimize import minimize |
问题二
$$
\displaylines{
\max\left{x_1^2+x_2^2+3x_3^3+4x_4^2+2x_5^2-8x_1-2x_2-3x_3-x_4-2x_5\right},\\
\begin{cases}
x_1+x_2+x_3+x_4+x_5\leqslant400,\\
x_1+2x_2+2x_3+x_4+6x_5\leqslant800,\\
2x_1+x_2+6x_3\leqslant200,\\
x_3+x_4+5x_5\leqslant200\\
\end{cases},x_i\in[0,99],i\in{1,2,\cdots,5}
}
$$
1 | from scipy.optimize import minimize |