三分法求解凸函数的最值!!!
来源:互联网 发布:楚留香传奇java游戏 编辑:程序博客网 时间:2024/04/29 15:39
二分法作为分治中最常见的方法,适用于单调函数,逼近求解某点的值。但当函数是凸性函数时,二分法就无法适用,这时三分法就可以“大显身手”~~
如图,类似二分的定义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题目来分析三分法的具体实现。
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;
}
POJ 3301 Texas Trip 例题更新(2010.5.5) 对于求解一些实际问题,当公式难以推导出来时,二分、三分法可以较为精确地求解出一些临界值,且效率也是令人满意 czyuan原创,转载请注明出处。*/
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;
至于这题的函数是否是凸性的,为什么是凸性的,我也无法给出准确的证明,希望哪位路过的大牛指点一下~~
hdu 3400 Line belt
http://acm.hdu.edu.cn/showproblem.php?pid=3400
典型的三分法,先三分第一条线段,找到一个点,然后根据这个点再三分第二条线段即可,想出三分的思路基本就可以过了。
- 三分法求解凸函数的最值!!!
- 三分法求解凸函数的最值
- 三分法——求解凸性函数的极值问题
- 三分法——求解凸性函数的极值问题
- 三分法——求解凸性函数的极值问题
- 三分法——求解凸性函数的极值问题
- 三分法——求解凸性函数的极值问题
- 三分法——求解凸性函数的极值问题
- zju 3421 Error Curves(凸函数最值,三分法)
- 三分法求单峰函数最值
- 【转】三分法——求解凸性函数的极值问题
- 【转】 三分法——求解凸性函数的极值问题——czyuan原创
- 三分法(Ternary Search)求解凸(凹)函数的极值问题<方法篇>
- 三分法(Ternary Search)求解凸(凹)函数的极值问题<方法篇>
- 三分法(Ternary Search)求解凸(凹)函数的极值问题<题目篇>
- 【转】三分法——求解凸性函数的极值问题——czyuan原创
- 三分法——求解凸性函数的极值问题(转载自czyuan)
- 三分法——求解凸性函数的极值问题——czyuan原创
- 关于oralce 数据库中两个时间的比较
- 为ASP.NET MVC应用程序创建单元测试
- 11.9-11.13宁阳东平五日
- 将 Session 放入 SQLServer 保存
- 读取oracle表结构3
- 三分法求解凸函数的最值!!!
- 读取oracle表结构4
- 我看360和腾讯
- C++ 十进制、二进制互相转换
- Socket 编程中 close() 和 shutdown() 有什么区别?
- zoj 3421
- Shell常用收藏
- WebBrowser和AxWebBrowser屏蔽网页脚本错误
- 在完成端口中使用GetAcceptExSockaddrs