图论之随机配流02——基于LOGIT的STOCH配流法-改进的dial算法

function dialsuanfaxishujuzhen(T)

%程序说明

clc

disp(‘======================================================================================‘);

disp(‘                   《基于LOGIT的STOCH配流法——改进的dial算法》‘);

disp(‘运行环境:MATLAB 8.3.0.532 ‘);

disp(‘制 作 人:兰州交通大学   刘志祥‘);

disp(‘Q      Q:531548824‘);

fprintf(‘说    明:本程序用于进行静态配流,在经典Dial算法的基础上进行修改,重新定义了有效路径,使得在用\n户的容忍绕路范围内比原来多走h倍路(一般情况下0<h<1,针对论断T(i,j)),即最多不超过2倍的路程,若\nh=0则等同经典算法.dial算法分四大步骤:一是求最短路,二是求边权似然数,三是求路权,四是配流\n‘);

disp(‘======================================================================================‘);

disp(‘按任意键继续...‘);

pause;

%数据获取,人机交互

disp(‘    ***请按照提示输入以下参数***‘);

Q=input(‘总 需 求 量:‘);

thita=input(‘参 数 thita:‘);

h=input(‘容忍绕路倍数:‘);

r=input(‘起       点:‘);

s=input(‘终       点:‘);

n=size(T,1);

%初始化

L=zeros(n,n);

W=zeros(n,n);

X=zeros(n,n);

%求最短距离矩阵及最短路径

disp(‘step1->:求最短距离,其中‘);

disp(‘---------------------------------------------------------------------------------------‘);

disp(‘   R—起点r到其他点的最短距离‘);

disp(‘   S—其他点到终点s的最短距离‘);

disp(‘按任意键继续...‘);

pause;

for i=1:n

for j=1:n

if T(i,j)==inf

T(i,j)=0;

end

end

end

T=sparse(T);

Tmin=graphallshortestpaths(T);

[dist,path]=graphshortestpath(T,r,s);

disp(‘________________________________________________________________‘);

R=Tmin(r,:)

S=Tmin(:,s)‘%注意因为方向性,这里作转置处理

disp(‘________________________________________________________________‘);

%画出初始图及最短路,边权为阻抗值t

disp(‘初始图及最短路径(红色)如图所示:‘);

chushitu=view(biograph(T,[],‘showW‘,‘ON‘));

set(chushitu.Nodes(path),‘Color‘,[1 0 0]);

edges=getedgesbynodeid(chushitu,get(chushitu.Nodes(path),‘ID‘));

set(edges,‘Linecolor‘,[1 0 0]);

disp(‘最短路径:‘);

path

disp(‘最短路距离:‘);

dist

%找上游节点和下游节点(显然up和down互为转置——对称,因为若j是i的下游节点,则i必是j的上游节点)

for i=1:n

for j=1:n

if T(i,j)>0

down(i,j)=1;

up(j,i)=1;

else

down(i,j)=0;

up(j,i)=0;

end

end

end

down=sparse(down);

up=sparse(up);

%计算边权

disp(‘step2->:计算边权似然值(任意键继续)‘);

disp(‘---------------------------------------------------------------------------------------‘);

pause;

for i=1:n

for j=1:n

if down(i,j)

if R(i)+T(i,j)-R(j)<(1+h)*T(i,j)&&S(j)+T(i,j)-S(i)<(1+h)*T(i,j)

P=1;

else

P=0;

end

L(i,j)=P*exp(thita*(R(j)-R(i)-T(i,j)));

end

end

end

L=sparse(L)

disp(‘边权如图所示:‘);

bianquantu=view(biograph(L,[],‘showW‘,‘ON‘));

%计算路权

disp(‘step3->:计算路权(任意键继续)‘);

disp(‘---------------------------------------------------------------------------------------‘);

pause;

for i=1:n

for j=1:n

if down(i,j)~=0

if R(i)+T(i,j)-R(j)<(1+h)*T(i,j)&&S(j)+T(i,j)-S(i)<(1+h)*T(i,j)

if i==r

W(i,j)=L(i,j);

else

W(i,j)=L(i,j)*(up(i,:)*W(:,i));

%这是核心句,先找到上游节点,再写出上游节点到i的W值(若还没有,则递归直到能够算出),请仔细查阅路权的算法好好理解。

end

end

end

end

end

W=sparse(W)

disp(‘路权如图所示:‘);

luquantu=view(biograph(W,[],‘showW‘,‘ON‘));

%配流

disp(‘step4->:配流(任意键继续)‘);

disp(‘------------------------------------------------------------------------------------------‘);

pause;

for i=n:-1:1

for j=n:-1:1

if down(i,j)==1

if R(i)+T(i,j)-R(j)<(1+h)*T(i,j)&&S(j)+T(i,j)-S(i)<(1+h)*T(i,j)

if j==s

X(i,j)=Q*W(i,j)/((up(j,:)*W(:,j)));

else

X(i,j)=X(j,:)*down(j,:)‘*W(i,j)/(up(j,:)*W(:,j));

%注意X(j,:)是1*n行向量,down(j,:)是1*n行向量,因此要将down向量转置为1*n的列向量才能相乘。

end

end

end

end

end

X=sparse(X)

disp(‘配流结果如图所示:‘);

peiliutu=view(biograph(X,[],‘showW‘,‘ON‘));

disp(‘======================================================================================‘);

disp(‘<程序运行完毕>‘);

例:某路网如图所示,阻抗已标注于边上(这里阻抗用距离值表示),需求为1000,起点为v1,终点为v9,θ=1,用户可容忍的绕路倍数为0.5.请用改进的ial算法进行配流。

解:(1)写权值矩阵

quanzhijuzhen=[

0     2   Inf     2   Inf   Inf   Inf   Inf   Inf

Inf     0     2   Inf     2   Inf   Inf   Inf   Inf

Inf   Inf     0   Inf   Inf     2   Inf   Inf   Inf

Inf   Inf   Inf     0     1   Inf     2   Inf   Inf

Inf   Inf   Inf   Inf     0     1   Inf     2   Inf

Inf   Inf   Inf   Inf   Inf     0   Inf   Inf     2

Inf   Inf   Inf   Inf   Inf   Inf     0     2   Inf

Inf   Inf   Inf   Inf   Inf   Inf   Inf     0     2

Inf   Inf   Inf   Inf   Inf   Inf   Inf   Inf     0];

(2)带入程序(格式整理后输出如下)

>> dialsuanfaxishujuzhen(quanzhijuzhen)

======================================================================================

《基于LOGIT的STOCH配流法——改进的dial算法》

运行环境:MATLAB 8.3.0.532

制 作 人:兰州交通大学   刘志祥

Q      Q:531548824

说    明:本程序用于进行静态配流,在经典Dial算法的基础上进行修改,重新定义了有效路径,使得在用

户的容忍绕路范围内比原来多走h倍路(一般情况下0<h<1,针对论断T(i,j)),即最多不超过2倍的路程,若

h=0则等同经典算法.dial算法分四大步骤:一是求最短路,二是求边权似然数,三是求路权,四是配流

======================================================================================

按任意键继续...

***请按照提示输入以下参数***

总 需 求 量:1000

参 数 thita:1

容忍绕路倍数:0.5

起       点:1

终       点:9

step1->:求最短距离,其中

---------------------------------------------------------------------------------------

R—起点r到其他点的最短距离

S—其他点到终点s的最短距离

按任意键继续...

________________________________________________________________

R =

0     2     4     2     3     4     4     5     6

S =

6     5     4     4     3     2     4     2     0

________________________________________________________________

初始图及最短路径(红色)如图所示:

最短路径:

path =

1     4     5     6     9

最短路距离:

dist =

6

step2->:计算边权似然值(任意键继续)

---------------------------------------------------------------------------------------

L =

(1,2)       1.0000

(2,3)       1.0000

(1,4)       1.0000

(2,5)       0.3679

(4,5)       1.0000

(3,6)       0.1353

(5,6)       1.0000

(4,7)       1.0000

(5,8)       1.0000

(7,8)       0.3679

(6,9)       1.0000

(8,9)       0.3679

边权如图所示:

step3->:计算路权(任意键继续)

---------------------------------------------------------------------------------------

W =

(1,2)       1.0000

(2,3)       1.0000

(1,4)       1.0000

(2,5)       0.3679

(4,5)       1.0000

(3,6)       0.1353

(5,6)       1.3679

(4,7)       1.0000

(5,8)       1.3679

(7,8)       0.3679

(6,9)       1.5032

(8,9)       0.6386

路权如图所示:

step4->:配流(任意键继续)

------------------------------------------------------------------------------------------

X =

(1,2)     298.1420

(2,3)      63.1887

(1,4)     701.8580

(2,5)     234.9533

(4,5)     638.6693

(3,6)      63.1887

(5,6)     638.6693

(4,7)      63.1887

(5,8)     234.9533

(7,8)      63.1887

(6,9)     701.8580

(8,9)     298.1420

配流结果如图所示:

======================================================================================

<程序运行完毕>

说明:显然改进的算法更符合实际情况,因为人们通常不会因为需要绕一点点路而长时间等待。

版权声明:博主文章可以被非商用转载,但请务必注明出处,因水平有限,难免出错,在此免责。

时间: 2024-10-31 15:21:56

图论之随机配流02——基于LOGIT的STOCH配流法-改进的dial算法的相关文章

图论之随机配流01——基于LOGIT的STOCH配流法-经典dial算法

function dialsuanfa(T) %程序说明 clc disp('========================================================================================'); disp('                   <基于LOGIT的STOCH配流法--dial算法>'); disp('运行环境:MATLAB 8.3.0.532 '); disp('作者信息:兰州交通大学  刘志祥   QQ:531

Python网络编程02/基于TCP协议的socket简单的通信

目录 Python网络编程02/基于TCP协议的socket简单的通信 1.昨日内容回顾 2.socket 2.1 socket套接字 2.2 基于TCP协议的socket简单通信 Python网络编程02/基于TCP协议的socket简单的通信 1.昨日内容回顾 1.单播:单独联系某一个人 2.广播:给所有人发送消息(群发) 3.比特流:bit就是0101跟水流一样的源源不断的发送01010101 4.以太网协议:将数据进行分组:一组称之为一帧,数据报 head|data head:18字节:

驱动开发读书笔记. 0.02 基于EASYARM-IMX283 烧写uboot和linux系统

驱动开发读书笔记. 0.02 基于EASYARM-IMX283 怎么烧写自己裁剪的linux内核?(非所有arm9通用) 手上有一块tq2440,但是不知道什么原因,没有办法烧boot进norflash或者nandflash:只好用另一块arm9(i.mx283a)来继续学习: 从开发教程上面可知,烧写uboot和Linux是通过各种批处理脚本和exe程序来执行的,称之为固件烧写,然而并没有需要我们选择uboot路径.Linux内核和文件系统的地方.这样的话是不是意味着只能烧写官方默认提供的文件

基于Redis实现分布式应用限流--转

原文地址:https://my.oschina.net/giegie/blog/1525931 摘要: 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务. 限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务. 前几天在DD的公众号,看了一篇关于使用 瓜娃 实现单应用限流的方案 -->原文,参考<redis in action> 实现了一个jedis版本的,

基于JavaSE阶段的IO流详解

1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有输入流类都是抽象类,是InputStream或者抽象类Reader的子类:而所有输出流都是抽象类,是OutputStream或者Writer的子类.输入输出流的定义是根据流向所决定的,我们可以是本地为一个实体物质,从外界往本地输入,按照本地的状态就是读取,反之,从本地向外写入就是输出.IO流是最基本

文献综述十一:基于商品的商业超市管理系统的改进

一.基本信息 标题:基于商品的商业超市管理系统的改进 时间:2017 出版源:潍坊学院学报 文件分类:对商品系统的研究 二.研究背景 根据超市实际需求进行扩展 ,由重结果向行为转为重过程控制 ,实现超市系统的自动管理和优化. 三.具体内容 大部分超市系统的商品管理着重点在于数据库管理.供应链管理等理论性研究,而国外的先进品类管理软件水土不服,不适合国内的超市管理特点.本文献主要从调研 .采购 .订单 .收货 .库存 .销售到回款等各个环节实施全程计算机控制 ,实现系统的自动判断和优化.文献的主要

PES,TS,PS,RTP等流的打包格式解析之PES流

PES,TS,PS,RTP等流的打包格式解析之PES流 版权声明:本文为博主原创文章,未经博主允许不得转载. 因为工作接触到了各种不同的音视频封装格式,常见的国标PS流,onvif的RTP流和TS流等,都说好记性不如烂笔头,抽空总结下,也好在以后能随时查阅,因水平问题,可能会有地方有疏漏和问题,还请指教 一.PES流 PES流是对原始ES流进行的第一层封装,PES流的基本单位是PES包,由包头和payload组成,ES流即音视频裸流,是从编码器里面出来的原始视频音频流:ES流只包含一种内容,里面

基于Hama平台的并行Finding a Maximal Independent Set 算法的设计与实现

作者:白松 西工大研究生.转载请注明出处:http://blog.csdn.net/xin_jmail/article/details/32101483. 本文参加了2014年CSDN博文大赛,如果您觉得此文对您有所帮助,就请为我投上您宝贵的一票,不胜感激.投票地址:http://vote.blog.csdn.net/Article/Details?articleid=32101483 . 本文目的:讲解并行Finding a Maximal Independent Set(寻找最大独立集问题)

什么是流,.NET中有哪些常见的流

分析问题 流是一种对于字节流的直接操作.例如在处理一个文件时,本质上需要通过操作系统提供的API来进行文件打开,读取文件中的字节流,再关闭文件等操作,而读取文件的过程就可以看作字节流的一个过程.常见的流类型有文件流.终端操作流.网络Socket等. 在.NET中,System.IO.Stream类型被设计为所有流类型的虚基类,所有常见的流类型都继承自System.IO.Stream类型,当程序员需要自定义一种流类型时,也应该直接或者间接继承自Stream类型..NET提供了丰富的内建的流类型,其