配流06—frank_wolfe配流算法

%说明:本程序为frankwolfe算法,通过输入总流量、在路网情况已知时配流并求出费用值。
clear all
clc
disp('========================================================================');
disp('                           《frankwolfe算法》');
disp('运行环境:MATLAB 8.3.0.532 ');
disp('制 作 人:兰州交通大学   刘志祥');
disp('Q      Q:531548824');
disp('=========================================================================');
%% 定义变量及常数
syms x1 x2 x3 x4 x5 x6 x7 x8 x9 lambda real
%%以下9行为通用模块
% Q=input('总流量=');%总流量
% numf=input('路径总数=');
% numx=input('路段总数=');
% fid=fopen('E:\MATLAB\编程书源代码\自己的算法\FW算法计算过程.txt','w');%设置运行结果输出文件
% x=[x1,x2,x3,x4,x5,x6,x7,x8,x9];
% x=x(1,1:numx)
% W=input('自由阻抗矩阵=');
% cap=input('走行流量系数=');
% Mxf=input('路径构成矩阵=');


Q=200                                   %总流量
numf=3;
numx=3;
fid=fopen('E:\MATLAB\编程书源代码\自己的算法\FW算法计算过程.txt','w');%设置运行结果输出文件
x=[x1,x2,x3,x4,x5,x6,x7,x8,x9];
x=x(1,1:numx);
W=[5 10 15];
cap=[0.1 0.025 0.025];
Mxf=[1 0 0;0 1 0;0 0 1];
%% step_初始化
X0=zeros(1,numx);
t=zeros(1,numx);
t=W+cap.*x;                             %路段走行时间函数
tt=t;
disp('路径阻抗函数:');
disp(t');
t0=subs(t,x,X0);
ft=(Mxf*t0')';                           %路径的走行时间初值
N=30;                                   %最大迭代次数
cont=0;
[Min,index]=min(t0);
X1=Mxf(index,:).*Q;                     %全有全无法为最短路径上的路段分配流量
fprintf(fid,'\r\n=============================================\r\n');
for i=1:N
    cont=cont+1;
    Y1=zeros(numx);                 %辅助路段流
    t=W+cap.*X1;                           %路段时间
    ft=(Mxf*t')';                           %路径时间
    fprintf(fid,'              <第%d次的计算结果>\r\n',i);
    %% step2_更新阻抗
    fprintf(fid,'阻 抗 值:');
    for(j=1:numf)
        fprintf(fid,'%7.2f ',ft(1,j));
    end
    fprintf(fid,'\r\n');
    %% step3_确定迭代方向
    [Min,index]=min(ft);
    fprintf(fid,'辅助流量:');
    Y1=Mxf(index,:).*Q;             %全有全无法求辅助流量
    for(k=1:numx)
        fprintf(fid,'%7.2f ',Y1(1,k));
    end
    fprintf(fid,'\r\n');
    S=Y1-X1;                                 %搜索方向 <
  • 6
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
求解交通流量分配模型的有效方法 #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
Frank-Wolfe算法(也称为条件渐进算法)是一种用于求解线性SVM(支持向量机)问题的优化算法。该算法是一种迭代优化算法,通过迭代逐步优化线性模型的参数。下面详细介绍Frank-Wolfe算法在SVM中的应用。 在SVM中,我们的目标是找到一个超平面,将类别分开得最好,同时最小化分类错误。这可以通过最小化损失函数来实现。而线性SVM的损失函数是一个凸函数,可以通过梯度下降法来求解最小值。Frank-Wolfe算法就是一种梯度下降法的变体。 具体来说,Frank-Wolfe算法在每次迭代中,首先计算当前模型在样本中的梯度。然后,在线性模型参数空间中,找到梯度方向上的最优点,并计算对应的步长。接着,更新线性模型的参数,得到下一轮迭代的模型。循环迭代至满足收敛条件。 Frank-Wolfe算法具有一些优点,比如在每次迭代中,不需要计算整个梯度,而是只计算梯度方向的一个极值点,这大大减少了计算量。此外,由于SVM是凸优化问题,因此算法可以保证收敛到全局最优解。 然而,Frank-Wolfe算法也存在一些缺点。首先,它的收敛速度相对较慢,特别是在高维数据集上。其次,算法对参数的初始值敏感,不同的初始值会导致不同的收敛结果。此外,算法对噪声敏感,当输入数据含有较多噪声时,算法可能会产生较差的结果。 总结来说,Frank-Wolfe算法是一种用于求解线性SVM问题的优化算法,它通过迭代优化模型参数来最小化损失函数。算法具有计算量小、收敛到全局最优解等优点,但是收敛速度相对较慢,对参数初始值敏感,并对噪声敏感。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值