Frank-wolfe算法多OD对matlab实现
来源:互联网 发布:淘宝卖的lv是正品吗 编辑:程序博客网 时间:2024/05/23 14:43
Frank-wolfe算法多OD对matlab实现
- Frank-wolfe算法多OD对matlab实现
- Frank-wolfe算法原理
- Frank-wolfe算法流程
- 算例
- 将道路网络抽象为图
- 给定OD对
- 搜索每个OD对在网络上的可行径
- Frank-worlfe算法构造
- 存在的问题
Frank-wolfe算法原理
在无约束最优化问题的基础上,我们可以进一步来求解约束最优化问题。约束最优化问题的一般形式为:
先考虑
故原问题近似于
其中S为线性约束构成的可行域。去掉常量后,问题可以写为
设此问题的最优解为
更多FW算法原理相关内容,参考
- 线形约束最优化问题的Frank-Worlfe算法
- frankwolfe算法
Frank-wolfe算法流程
算例
将道路网络抽象为图
对于以下网格,给出网格上各点间的OD需求,计算网格上的交通平衡分布
给定OD对
搜索每个OD对在网络上的可行径
% 子程序:求解一个OD对间的可行径function possiablePaths = findPath(Graph, partialPath, destination, partialWeight)% findPath按深度优先搜索所有可能的从partialPath出发到destination的路径,这些路径中不包含环路% Graph: 路网图,非无穷或0表示两节点之间直接连通,矩阵值就为路网权值% partialPath: 出发的路径,如果partialPath就一个数,表示这个就是起始点% destination: 目标节点% partialWeight: partialPath的权值,当partialPath为一个数时,partialWeight为0pathLength = length(partialPath);lastNode = partialPath(pathLength); %得到最后一个节点nextNodes = find(0<Graph(lastNode,:) & Graph(lastNode,:)<inf); %根据Graph图得到最后一个节点的下一个节点GLength = length(Graph);possiablePaths = [];if lastNode == destination % 如果lastNode与目标节点相等,则说明partialPath就是从其出发到目标节点的路径,结果只有这一个,直接返回 possiablePaths = partialPath; possiablePaths(GLength + 1) = partialWeight; return;elseif length( find( partialPath == destination ) ) ~= 0 return;end%nextNodes中的数一定大于0,所以为了让nextNodes(i)去掉,先将其赋值为0for i=1:length(nextNodes) if destination == nextNodes(i) %输出路径 tmpPath = cat(2, partialPath, destination); %串接成一条完整的路径 tmpPath(GLength + 1) = partialWeight + Graph(lastNode, destination); %延长数组长度至GLength+1, 最后一个元素用于存放该路径的总路阻 possiablePaths( length(possiablePaths) + 1 , : ) = tmpPath; nextNodes(i) = 0; elseif length( find( partialPath == nextNodes(i) ) ) ~= 0 nextNodes(i) = 0; endendnextNodes = nextNodes(nextNodes ~= 0); %将nextNodes中为0的值去掉,因为下一个节点可能已经遍历过或者它就是目标节点for i=1:length(nextNodes) tmpPath = cat(2, partialPath, nextNodes(i)); tmpPsbPaths = findPath(Graph, tmpPath, destination, partialWeight + Graph(lastNode, nextNodes(i))); possiablePaths = cat(1, possiablePaths, tmpPsbPaths);end
Frank-worlfe算法构造
function [e,Xn,td] = Frank_wolfe(Q,W,Cmax,Mxf)%% 1 给定路网数据,OD需求,路段能力% 计算网络上已知OD集,初始路阻,道路容量,路径路段关系%==========================================================================% Q为OD需求,第一行为O,第二行为D,第三行为OD需求% Cmax为路段能力,是一个节点数乘节点数的矩阵% mxf为路径路段0-1关系,是一个元胞行向量,元素数量为OD数,每一个成员是一个OD对应的路径路段关系ODnum = size(Q,2);W(W == inf) = 1000000;%==========================================================================%% 2 自动求出路径和路段数量,根据路段数量定义路段名,给定初始数据%==========================================================================numf = zeros(1,ODnum);for i = 1:ODnum numf(i) = size(Mxf{1,i},1); % 计算路径数endnumx = size(Mxf{1,1},2); % 计算路段数n = sqrt(numx);syms lambda realx = sym('x',[1,numx]); % 根据路段数定义路段名cont=0;e=inf;x=x(1:numx); % 路段上的交通量X0=zeros(1,numx); % 路段上的交通量 数值解t=zeros(1,numx); % 路段走行函数%==========================================================================%% 3 构造阻抗函数并求出初始阻抗,此处用BPR函数%=======================================================t=W.*(1+0.15*(x./Cmax).^4); %路段走行时间函数tt=t;t=W.*(1+0.15*(X0./Cmax).^4);t(isnan(t)) = 1000000;for i = 1:n t((i-1)*n + i) = 0;endCkrs = cell(1,ODnum);for i = 1:ODnum Ckrs{1,i} = (Mxf{1,i} * t'); Ckrs{1,i} = Ckrs{1,i}';end%=========================================================%% 4 全有全无配流%=========================================================Min = zeros(ODnum);index = zeros(ODnum);for i = 1:ODnum [Min(i),index(i)]=min(Ckrs{1,i});endX1 = zeros(1,numx);for i = 1:ODnum tempmatrix = Mxf{1,i}; X1=tempmatrix(index(i),:).*Q(3,i) + X1; %全有全无法为最短路径上的路段分配流量end%=========================================================%% 5 数据更新%=========================================================while e>0.001 %精度判断 cont=cont+1; %迭代次数更新 t=(W).*(1+0.15*(X1./Cmax).^4); %路段时间跟新 td = t; t(isnan(t)) = 1000000; for i = 1:n t((i-1)*n + i) = 0; end for i = 1:ODnum Ckrs{1,i} = (Mxf{1,i} * t'); %路径时间更新 Ckrs{1,i} = Ckrs{1,i}'; end Min = zeros(ODnum); index = zeros(ODnum); for i = 1:ODnum [Min(i),index(i)]=min(Ckrs{1,i}); end %全有全无法求辅助流量 Y1 = zeros(1,numx); for i = 1:ODnum tempmatrix = Mxf{1,i}; Y1=tempmatrix(index(i),:).*Q(3,i) + Y1; %全有全无法为最短路径上的路段分配流量 end %Y1=Mxf(index,:).*Q; S=Y1-X1; %搜索方向 if sum(S) < 0 break; end X2=X1+lambda*S; %先将X2用X1和lambda进行表达 t=(W).*(1+0.15*(X2./Cmax).^4); %含lambda的阻抗表达 t(isnan(t)) = 1000000; f=sum(S.*t,2); %2表示按行求和 lambda1 = 0; lambda1=double(solve(f)); %求解方程,确定步长。 k=length(lambda1); %如步长lambda1的解不唯一,取实数,且大于0小于1; for m=1:k if lambda1(m,1)>=0&&lam bda1(m,1)<=1 lambda2=lambda1(m,1); end end X2=X1+lambda2*S; %得到下一步的流量值,且进行下一次迭代 e=sqrt(sum((X2-X1).^2))/sum(X1); %精度计算 X1=X2; %流量更新 disp(['迭代次数',num2str(cont),'精度',num2str(e)]);end%==========================================================================Xn = X1;
存在的问题
当网络中的交通量不大时,在迭代计算中利用sovle函数求解
进一步完善,敬请期待。
参考博文:配流07—基于BPR函数的Frank Wolfe算法
阅读全文
0 0
- Frank-wolfe算法多OD对matlab实现
- 配流07—基于BPR函数的Frank Wolfe算法
- Frank-Wolfe方法
- 线性约束最优化问题的Frank-Wolfe方法
- wolfe 算法_最优化课课后作业笔记
- LMS算法MatLab实现
- Matlab HS算法实现
- MP 算法 matlab实现
- knn算法matlab实现
- MP 算法 matlab实现
- matlab实现fbp算法
- matlab实现prim算法
- matlab实现kmeans算法
- Apriori算法Matlab实现
- Matlab实现遗传算法
- SURF算法matlab实现
- matlab实现分水岭算法
- matlab实现神经网络算法
- 推荐系统
- Android图文混排功能(文字后面追加图片)
- Spring官网下载dist.zip的几种方法
- 开脑洞!哪项黑科技可以让牛郎织女天天过七夕?
- 安信可A6模块短信模式的配置
- Frank-wolfe算法多OD对matlab实现
- 选择排序
- git 发布本地工程到github
- IDEA 代码统计插件 --- Statistic
- 金额和利率正则表达式
- IDEA 常用快捷键
- maven编译错误:Failed to execute goal org.apache.maven.plugins:maven-clean-plugin:2.5:clean
- 利用阿里云服务器windows server 2012 搭建vpn
- jquery获取select/checkbox/radio的值