二分法作为分治中最常见的方法,适用于单调函数,逼近求解某点的值。但当函数是凸性函数时,二分法就无法适用,这时三分法就可以“大显身手”~~
如图,类似二分的定义Left和Right,mid = (Left + Right) / 2,midmid = (mid + Right) / 2; 如果mid靠近极值点,则Right = midmid;否则(即midmid靠近极值点),则Left = mid;
程序模版如下:
double Calc(Type a)
{
/* 根据题目的意思计算 */
}
void Solve(void)
{
double Left, Right;
double mid, midmid;
double mid_value, midmid_value;
Left = MIN; Right = MAX;
while (Left + EPS < Right)
{
mid = (Left + Right) / 2;
midmid = (mid + Right) / 2;
mid_area = Calc(mid);
midmid_area = Calc(midmid);
// 假设求解最大极值.
if (mid_area >= midmid_area) Right = midmid;
else Left = mid;
}
}
现根据几道的OJ题目来分析三分法的具体实现。
buaa 1033 Easy Problem
http://acm.buaa.edu.cn/oj/problem_show.php?c=0&p=1033
题意为在一条线段上找到一点,与给定的P点距离最小。很明显的凸性函数,用三分法来解决。
Calc函数即为求某点到P点的距离。
ZOJ 3203 Light Bulb
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3203
如图,人左右走动,求影子L的最长长度。
根据图,很容易发现当灯,人的头部和墙角成一条直线时(假设此时人站在A点),此时的长度是影子全在地上的最长长度。当人再向右走时,影子开始投影到墙上,当人贴着墙,影子长度即为人的高度。所以当人从A点走到墙,函数是先递增再递减,为凸性函数,所以我们可以用三分法来求解。
下面只给出Calc函数,其他直接套模版即可。
double Calc(double x)
{
return (h * D - H * x) / (D - x) + x;
}
heru 5081 Turn the corner 08年哈尔滨regional网络赛
http://acm.hrbeu.edu.cn/index.php?act=problem&id=1280
汽车拐弯问题,给定X, Y, l, d判断是否能够拐弯。首先当X或者Y小于d,那么一定不能。
其次我们发现随着角度θ的增大,最大高度h先增长后减小,即为凸性函数,可以用三分法来求解。
这里的Calc函数需要比较繁琐的推倒公式:
s = l * cos(θ) + w * sin(θ) - x;
h = s * tan(θ) + w * cos(θ);
其中s为汽车最右边的点离拐角的水平距离, h为里拐点最高的距离, θ范围从0到90。
POJ 3301 Texas Trip
http://acm.pku.edu.cn/JudgeOnline/problem?id=3301
题意为给定n(n <= 30)个点,求出饱含这些点的面积最小的正方形。
有两种解法,一种为逼近法,就是每次m分角度,求出最符合的角度,再继续m分,如此进行times次,即可求出较为精确的解。(m 大概取10, times取30即可)
第二种解法即为三分法,首先旋转的角度只要在0到180度即可,超过180度跟前面的相同的。坐标轴旋转后,坐标变换为:
X’ = x * cosa - y * sina;
y’ = y * cosa + x * sina;
至于这题的函数是否是凸性的,为什么是凸性的,我也无法给出准确的证明,希望哪位路过的大牛指点一下~~
例题更新(2010.5.5)
hdu 3400 Line belt
http://acm.hdu.edu.cn/showproblem.php?pid=3400
典型的三分法,先三分第一条线段,找到一个点,然后根据这个点再三分第二条线段即可,想出三分的思路基本就可以过了。
对于求解一些实际问题,当公式难以推导出来时,二分、三分法可以较为精确地求解出一些临界值,且效率也是令人满意的。
转载于:
http://hi.baidu.com/czyuan_acm/item/81b21d1910ea729c99ce33db
分享到:
相关推荐
三分法是求解凸性函数的极值问题的一种方法。凸性函数是指函数在定义域内的所有点的函数值都是非负的或非正的函数。三分法是一种分治方法,适用于求解凸性函数的极值问题。 三分法的基本思想是将函数的定义域分为两...
接下来,我们将通过几个具体的实例来展示如何应用三分法求解凸函数的极值问题。 ##### 3.1 buaa1033 Easy Problem **题意概述**:题目要求在线段上找到一个点,使得该点到给定点\( P \)的距离最小。这是一个典型的...
内点法是一种用于求解约束最优化问题的算法,它的核心思想是通过构造一个能够反映约束条件的障碍函数,并将其加入到原问题的目标函数中,从而将约束优化问题转换为无约束优化问题来求解。与传统的罚函数法不同,内点...
凸性在优化问题中扮演着关键角色,例如在经济、工程等领域,凸函数常被用来建模目标函数,因为它们能保证局部最优解也是全局最优解,简化了问题的求解过程。 三、曲线的渐近线 曲线的渐近线分为水平渐近线、垂直...
三分:最基础的作用,寻找凸性函数极值 哈希:Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。...
总之,拉格朗日乘子法是一种解决约束优化问题的有效方法,结合MATLAB的`fmincon`函数,我们可以处理各种复杂的优化问题,求得问题的最优解。通过深入理解和实践,这一方法将成为解决实际问题的重要工具。
1. **单纯形法**:虽然不是专为二次规划设计,但通过线性化目标函数,可以将其转换为标准形式的线性规划问题,然后用单纯形法求解。 2. **内点法**:这种方法通过修改变量的定义,使其始终在约束区域内,逐步接近最...
遗传算法的优势在于它能处理非线性、非凸性和多模态的问题,无需了解函数的具体形式或导数信息。 遗传算法的基本步骤包括初始化种群、选择、交叉和变异。首先,随机生成一组解(也称为个体),每个解代表可能的未知...
总之,函数的单调性和凸性是解析函数性质的重要方面,它们为我们提供了解决各种数学和实际问题的有效工具。通过深入理解这些概念,我们可以更准确地分析和预测函数的行为,这对于科学研究和工程实践具有重要意义。
此外,通过等价定义和定理1至定理4,论文深入讨论了函数的凸性与导数和二阶导数的关系,以及这些性质如何帮助判断函数的极值。 接着,论文重点讨论了凸函数在经济学中的具体应用。在2.1节,凸函数被应用于经济函数...
凸性在最优化问题中有着广泛的应用,这是因为许多问题可以通过保持问题的凸性来简化求解过程。本篇文档的主题即为“***保持凸性的操作”,由凌青教授主讲,发生在2020年春季学期。 在详细讨论保持凸性的操作之前,...
在数学分析中,函数的凸性和拐点是重要的概念,它们描述了函数图像的几何特性。函数的凸性指的是在某一区间内,函数曲线相对于其切线的位置关系。如果函数曲线在某区间内始终位于切线之上,那么我们说这个函数在该...
总结以上知识点,本套试题主要涵盖了微积分中的函数极值求解、导数的性质(单调性、奇偶性)、参数的取值范围、几何优化问题、实根分布、函数的最值计算、函数的凸性等多个方面,这些都是高中数学复习的重要内容,...
凸性是判断函数优化性质的关键属性,而可微性则提供了求解优化问题的理论基础。 接着,论文阐述了模糊数值函数的方向导数和次微分的概念,并探讨了它们与可微性的联系。方向导数和次微分在理解和求解函数的局部特性...
3. 分数函数的伪凸性和准凸性:文档中提到了分数函数的两个重要概念——伪凸性和准凸性。一个在某些集合上可微的数值函数被称为在该集合上是伪凸的,如果对于任意的X1和X2,该函数满足特定条件。伪凸函数的一个重要...
8. 导数的应用:第十八题要求求解函数的单调区间和极值,这是利用导数求解函数性质的经典问题。 9. 最优化问题:第二十题和第二十二题的第一部分涉及到函数极值的最优化问题,要求找到最大值或最小值。 10. 二次型...
目标函数的三维图是理解非线性优化问题的重要工具。通过绘制目标函数在三个坐标轴上的图像,我们可以直观地看到函数的形状,识别局部极小值和极大值,以及可能存在的鞍点。这对于分析和选择合适的优化算法至关重要,...
在提供的文件中,文章标题为“求解无约束一致性优化问题的分布式拟牛顿算法”,文章内容涉及到了分布式优化方法中的一种算法——分布式拟牛顿法。这种算法旨在解决在分布式系统环境下,如何高效且准确地求解大规模无...