Frank-Wolfe方法

本文介绍了1956年由Frank和Wolfe提出的求解线性约束问题的算法,即Frank-Wolfe算法。该算法通过将目标函数进行线性近似,转化为一系列线性规划问题来求解非线性最优化问题。尽管收敛速度较慢,但在实际应用中仍具有效用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        1956 年,FrankWolfe提出了一种求解线性约束问题的算法,其基本思想是将目标函数作线性近似,通过求解线性规划求得可行下降方向,并沿该方向在可行域内作一维搜索.这种方法又称作近似线性化方法.

问题


原理

近似线性化和可行下降方向


假设此问题存在有限最优解yk,则由线性规划的基本知识可知,这个最优解可在某极点上达到.
结论:

确定一维搜索步长



算法步骤


全局收敛性分析




       Frank-Wolfe算法是一种可行方向法,在每次迭代内,搜索方向总是指向某个极点,并且当迭代点接近最优解时,搜索方向与目标函数的梯度趋于正交,因此算法收敛速度比较慢.但该方法把求解非线性最优化问题转化为为求解一系列线性规划问题,而且各线性规划具有相同的约束条件,因而该方法在实际应用中仍然是一种有用的算法.



求解交通流量分配模型的有效方法 #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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值