关于交通网络均衡分配的问题?
关于这个问题,有个叫做MSA(method of successive average),能够达到近似均衡(50次循环之后)。我分析问题之后,思路就是每次用最短路径(Dijkstra)找到最短路径,然后把最短路径上所包含的link每个都加上 F/n(F表示总流量从起点到终点,n表示第几次循环,MSA算法的要求),最后循环50到100次停止. 具体实现我不是很清楚怎样每次循环或把最短路径的包含的每条link找到,然后都加上F/n. 原理就是每次的最短路径每条link上的流量V(n+1) = V(n)*(1-1/n)+F/n; V(n)表示当前这个ink上的流量,V(n+1)循环之后的流量。我写了个程序,在Dev C++下,但是每次循环都会出错。(能通过编译,我觉得逻辑上没什么问题,每次循环4,5次就停止,然后弹出对话框报错)。不知道是什么原因。希望有高受能够帮忙指点下,给出个能运行的代码。(可以直接修改我的代码,或者如果有更好的办法,也可以直接给出您的代码)。
谢谢大家了。我是个新手,没有什么积分,所以还请各位高手能够不吝赐教!
我的代码如下(实际我认为就是每次循环先shortest path,然后在改变每条link上流量;然后再进行下次循环):
#include<iostream>
using namespace std;
void Dijkstra(int n,int v,int dist[],int prev[],int **c)
{
int maxint = 65535;
bool *s = new bool[n];
for (int i = 1; i <= n; i++)
{
dist[i] = c[v][i];
s[i] = false;
if (dist[i] == maxint)
{
prev[i] = 0;
}
else
{
prev[i] = v;
}
}
dist[v] = 0;
s[v] = true;
for (int i = 1; i < n; i++)
{
int temp = maxint;
int u = v;
for (int j = 1; j <= n; j++)
{
if ((!s[j]) && (dist[j] < temp))
{
u = j;
temp = dist[j];
}
}
s[u] = true;
for (int j = 1; j <= n; j++)
{
if ((!s[j]) && (c[u][j] < maxint))
{
int newdist = dist[u] + c[u][j];
if (newdist < dist[j])
{
dist[j] = newdist;
prev[j] = u;
}
}
}
}
}
int main()
{
int f;
cout<<"Please input total flow: ";
cin>>f;
int n,v,u,;
int q = 0;
cout<<"Please input number of nodes: ";
cin>>n;
int *way = new int[n + 1];
int **c = new int *[n + 1];
int **x = new int *[n + 1];
int **a = new int *[n + 1];
int **b = new int *[n + 1];
int **g = new int *[n + 1];
for (int i = 1; i <= n; i++)
{
c[i] = new int[n + 1];
x[i] = new int[n + 1];
a[i] = new int[n + 1];
b[i] = new int[n + 1];
}
for (int j = 1; j <= n; j++)
{
for (int t = 1; t <= n; t++)
{
cout<<"Please input a"<<j<<t<<": ";
cin>>a[j][t];
cout<<"Please input b"<<j<<t<<": ";
cin>>b[j][t];
x[j][t]=0;
g[j][t]=0;
c[j][t] = (a[j][t])*(x[j][t])+(b[j][t]); //生成每条link上的费用
}
}
for(int j=1;j<=n;j++)
{
for(int t=1;t<=n;t++)
{
cout<<c[j][t]<<"\t";
}
cout<<endl;
}
cout<<"Please input start node: ";
cin>>v;
cout<<"Please input end node: ";
cin>>u;
for(int z=1; z<50;z++) //进行50次循环。实际运行时,循环无法进行完就出错!!
{
int *dist = new int [n];
int *prev = new int [n];
Dijkstra(n, v, dist, prev, c);
cout<<"Shortest Path"<<v<<" -> "<<u<<" Distance:"<<dist[u]<<endl;
int w = u;
while (w != v)
{
q++;
way[q] = prev[w];
w = prev[w];
}
cout<<"Path:";
for (int j = q; j >= 1; j--)
{
cout<<way[j]<<" ->";
}
for (int j=q; j>=1; j--)
{
g[j-1][j]=f/z; //利用找出的最短路径,决定这次循环哪几条link需要加上F/z
}
cout<<u<<endl;
for(int j=1;j<=n;j++)
{
for(int t=1;t<=n;t++)
{
x[j][t]=x[j][t]*(1-1/z)+g[j][t];
}
}
for(int j=1;j<=n;j++)
{
for(int t=1;t<=n;t++)
{
cout<<x[j][t]<<"\t";
}
cout<<endl;
}
}
system("pause");
return 0;
}
最后再次谢谢您的帮助!
相关推荐
交通分配之用户均衡分配模型之三(matlab源码).zip_交通_交通分配_交通均衡_均衡分配_用户均衡模型
在MATLAB中实现用户均衡分配模型,通常需要以下步骤:1. **构建交通网络**:首先,需要建立一个包含节点(交通节点,如交叉口、出入口等)和边(路段)的图结构,表示城市交通网络。
宏观交通流仿真软件:Cube_(7).Cube软件中的交通分析模块
交通网络建模:定义交通网络的拓扑结构和属性。交通需求建模:分析和预测交通需求。交通分配:将交通需求分配到网络上的各个路径。交通性能评估:评估交通网络的性能指标,如旅行时间、拥堵程度、服务水平等。交通策略评估:评估不同的交通策略对网络性能的影响。在Cube中,节点和链路是交通网络的基本构成元素。节点表示交通网络的交点,链路表示节点之间的连接。节点定义# 定义节点node = {"id": 1, # 节点ID"x": 100, # 节点的X坐标"y": 200, # 节点的Y坐标。
用户均衡分配模型二交通分配 matlab源码
在交通规划领域,交通分配是核心环节之一,其目的是模拟并预测交通网络中交通流的分布情况。用户均衡分配模型是交通分配理论中的一个重要模型,它基于个体最优原则,假设每个出行者都会选择行程时间最短或成本最低的
城市交通网络均衡分配的模型与算法.doc
§1.1 用户均衡分配用户均衡分配是交通分配问题中的一个关键概念,该概念假设所有出行者遵循什么样的行为准则。
交通分配之用户均衡分配模型二(matlab源码).zip_windows_交通 均衡_交通分配_交通均衡_用户均衡模型
在数学表达上,用户均衡分配问题可以转化为一个优化问题,通过求解网络上的流分布,使得所有出行者的总成本最小。MATLAB是一种强大的数值计算和数据可视化工具,适合处理这种复杂的优化问题。


