约束优化方法_2_——Frank-Wolfe方法

  Frank-Wolfe方法属于约束优化可行方向法的一种。上一篇博文对同类型的Zoutendijk可行性方法进行了介绍,这一部分着重关注Frank-Wolfe方法。Frank-Wolfe方法的基本思想是:每次迭代中使用一阶泰勒展开式将目标函数线性化,通过解线性规划得到可行方向,进而沿此方向在可行域内作一维搜索。

一、Frank-Wolfe所针对的优化问题

  首先要明确这个算法的提出是针对哪一种问题。之前的Zoutendijk可行性方法可以解 等式线性约束+不等式线性约束,而Frank-Wolfe方法只能解等式线性约束下的非线性规化问题,形式如下 m i n f ( x )     s . t .     A x = b     &     x ⩾ 0 min f(x) \ \ \ \\ s.t. \ \ \ Ax=b \ \ \ \& \ \ \ x\geqslant 0 minf(x)   s.t.   Ax=b   &   x0

二、确定可行方向

  首先在初始可行点 x ( k ) x^{(k)} x(k)处进行考察,将 f ( x ) f(x) f(x) x ( k ) x^{(k)} x(k)处进行一阶Taylor多项式进行展开: f ( x ) = f ( x ( k ) ) + ▽ f ( x ( k ) ) T ( x − x ( k ) ) = ▽ f ( x ( k ) ) T x + [ f ( x ( k ) ) − f ( x ( k ) ) T x ( k ) ] f(x)=f(x^{(k)})+\triangledown f(x^{(k)})^T(x-x^{(k)})=\triangledown f(x^{(k)})^T x+[f(x^{(k)})-f(x^{(k)})^Tx^{(k)}] f(x)=f(x(k))+f(x(k))T(xx(k))=f(x(k))Tx+[f(x(k))f(x(k))Tx(k)]  问题转化为在可行域 S S S内最小化这个一阶展开式: m i n     ▽ f ( x ( k ) ) T x + [ f ( x ( k ) ) − f ( x ( k ) ) T x ( k ) ] s . t .     x ∈ S min \ \ \ \triangledown f(x^{(k)})^T x+[f(x^{(k)})-f(x^{(k)})^Tx^{(k)}] \\ s.t. \ \ \ x\in S min   f(x(k))Tx+[f(x(k))f(x(k))Tx(k)]s.t.   xS  考虑到方括号内为常数,去掉之后变为: m i n     ▽ f ( x ( k ) ) T x s . t .     x ∈ S min \ \ \ \triangledown f(x^{(k)})^T x \\ s.t. \ \ \ x\in S min   f(x(k))Txs.t.   xS  求解这个线性规划可以得到最优解 y ( k ) y^{(k)} y(k),由线性规划知识可以知道一定在 S S S的极点达到。
  现在研究变动后的 y ( k ) y^{(k)} y(k)对函数值的影响,也就是运动方向 d d d和函数梯度的乘积 ▽ f ( x ( k ) ) T ( y ( k ) − x ( k ) ) \triangledown f(x^{(k)})^T(y^{(k)}-x^{(k)}) f(x(k))T(y(k)x(k))。此时共有两种情况:

**1.**若乘积为0,则方向无法和梯度构成钝角,x^{(k)}是原问题KT点。
**2.**若乘积小于0,则方向可以和梯度构成钝角,使得函数值继续下降。
(注: y ( k ) y^{(k)} y(k)是用于确定方向,而不是下一步迭代点,更像一个“导航点”)

三、确定移动步长

  连接初始点 x ( k ) x^{(k)} x(k)和导航点 y ( k ) y^{(k)} y(k),在此直线上进行一维搜索,则步长区[0,1]: m i n     f ( x ( k ) + λ ( y ( k ) − x ( k ) ) ) s . t .     λ ∈ [ 0 , 1 ] min \ \ \ f(x^{(k)}+\lambda (y^{(k)}-x^{(k)})) \\ s.t. \ \ \ \lambda \in[0,1] min   f(x(k)+λ(y(k)x(k)))s.t.   λ[0,1]  得到 λ \lambda λ之后即可得到下一个可行点: x ( k + 1 ) = x ( k ) + λ ( y ( k ) − x ( k ) ) x^{(k+1)}=x^{(k)}+\lambda (y^{(k)}-x^{(k)}) x(k+1)=x(k)+λ(y(k)x(k))

四、算法分析

  Frank-Wolfe方法每次迭代时,搜索方向总时指向某个极点,当接近最优解时,搜索方向和函数梯度趋于正交,并不是最好的搜索方向。但是由于它将非线性规化问题转化为了一系列线性规划问题,有时可以达到好的计算效果。
在这里插入图片描述

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
求解交通流量分配模型的有效方法 #include "stdafx.h" #include #include #include "os.h" #include "my_types.h" #include "md_alloc.h" #include "my_util.h" #include "message.h" #include "tui.h" #include "meta.h" #include "link_functions.h" #include "od_table.h" #include "od_flow.h" #include "mincostroutes.h" #include "ls_bisect.h" #include "fw_status.h" extern int no_zones, no_nodes, no_links; /* Gloabal variables */ my_float **ODflow, TotalODflow; /* Local Declarations */ /* void FW(void); Should there be a function for fw, or should it be included in main? */ static void Init(char *tuiFileName); static void Close(char *tuiFileName); static void InitODflow(void); static void CloseODflow(void); /* End of local declarations. */ void main(int argc, char **argv ) { my_float *MainVolume, *SubVolume, *SDVolume, Lambda; int **MinPathPredLink; struct fw_status_struct fw_status; char *tuiFileName; StatusMessage("General", "Ready, set, go..."); switch(argc){ case 2: tuiFileName=argv[1]; break; case 1: tuiFileName="control.tui"; break; default: ExitMessage("Wrong number of command line arguments (%d). \n" "Syntax: fw .", argc-1); } Init(tuiFileName); MainVolume = (my_float*)Alloc_1D(no_links, sizeof(my_float) ); SDVolume = SubVolume = (my_float*)Alloc_1D(no_links, sizeof(my_float) ); /* Compute search direction and sub-volume in the same place. */ MinPathPredLink = (int**)Alloc_2D(no_zones,no_nodes, sizeof(int)); InitFWstatus(&fw_status); FindMinCostRoutes (MinPathPredLink, NULL); Assign (ODflow,MinPathPredLink,MainVolume); FirstFWstatus(MainVolume, &fw_status); UpdateLinkCost(MainVolume); for ( fw_status.Iteration = 1; ContinueFW(fw_status); fw_status.Iteration++) { FindMinCostRoutes (MinPathPredLink, NULL); Assign (ODflow,MinPathPredLink,SubVolume); VolumeDifference( SubVolume, MainVolume, SDVolume); /* Which yields the search direction. */ Lambda = LinksSDLineSearch ( MainVolume, SDVolum
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值