我们工作生活中的很多问题都是优化问题。在本文中,我们给出几个典型的例子,并尝试使用现有的求解器进行求解,作为参照。在后续文章中,我们将介绍一些启发式算法,并对本文中的问题进行求解。
问题1: 离散空间优化问题
luogu P1048 采药
题目描述
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。”
如果你是辰辰,你能完成这个任务吗?
输入格式
第一行有 $2$ 个整数 $T$($1 \le T \le 1000, \ 1 \le T \le 000$)和 $M$($1 \le M \le 100, \ 1 \le M \le 100$),用一个空格隔开,$T$ 代表总共能够用来采药的时间,$M$ 代表山洞里的草药的数目。
接下来的 $M$ 行每行包括两个在 $1$ 到 $100$ 之间(包括 $1$ 和 $100$)的整数,分别表示采摘某株草药的时间和这株草药的价值。
输出格式
输出在规定的时间内可以采到的草药的最大总价值。
输入样例
1
2
3
4 70 3
71 100
69 1
1 2输出样例
1 3说明
- 对于 30% 的数据,$M \le 10$
- 对于全部的数据,$M \le 100$
这是一个典型的0/1背包问题,我们用$x_{i}$表示第$i$种草药采集与否,用$t_{i}$表示采集第$i$种草药所需要的时间,用$m_{i}$表示第$i$种草药的价值,我们的目标是在有限的时间$T$内使采集到的草药价值最大,那么我们就会得到如下的形式化表述:
$$\begin{equation}\label{eq1}
\begin{aligned}
max \ \sum_{i = 1}^{M} x_{i}m_{i} & \\
x_{i}(x_{i}-1) = 0, i \in [1, M] \\
0 \le \sum_{i = 1}^{M}{x_{i}t_{i} \le T} \\
\end{aligned}
\end{equation}$$
上面公式中的$x_{i}(x_{i-1})=0$是为了确保$x_{i}$只能取0和1。针对这个问题,我们使用如下的程序进行求解:
1 | #!/usr/bin/python3 |
输出结果:
1 | barrier_parameter: 2.048000000000001e-09 |
可以看到使用这个求解器并没有得到正确的结果,上面提到的二值约束对这个求解器不是很友好,求解的结果也不满足约束条件。
问题2: 连续空间多变量多约束非线性规划问题
$$min \ f(x) = e^{x_{1}}(4x_{1}^{2}+2x_{2}^{2}+4x_{1}x_{2}+2x_{2}+1)$$
$$\begin{equation}\label{eq2}
\begin{aligned}
1.5 + x_{1}x_{2} -x_{1} - x_{2} &\leq 0 \\
-x_{1}x_{2} &\leq 10 \\
-10 \leq x_{1} &\leq 10 \\
-6 \leq x_{2} &\leq 6 \\
\end{aligned}
\end{equation}$$
我们先来看一下函数图像,基本上$x, y$越小,函数的值越小。
我们使用下面的程序对这个问题进行求解:
1 | #!/usr/bin/python3 |
输出结果:
1 | barrier_parameter: 2.048000000000001e-09 |
初步验证一下,这个结果应该是符合预期的。
问题3: 连续空间最值问题
$$\begin{equation}\label{eq3}
\begin{aligned}
max \ f(x) = 200&e^{-0.05x}sin(x) \\
-2 \le &x \le 2
\end{aligned}
\end{equation}$$
我们先来看一下函数图像,这个结果比较明显.
针对这个问题,我们使用如下的程序进行求解:
1 | #!/usr/bin/python3 |
输出结果:
1 | barrier_parameter: 3.200000000000001e-05 |
根据图像得知,这个求解结果是正确的。