关于交通网络均衡分配的问题?

yangtaotai 2009-10-04 04:56:31
我最近最一个课程的project.要求用C或者C++写一个网络流量均衡的。要求就是任意输入一个n个node的网络,每个link上都是一个线性的函数,如4X+1表示该边上的流量。总问题是人们选择道路,当道路的花费变高时,就选择别的花费较低路径。(4X+1, 无车流时费用为1,X为流量,当x=3是,费用为13).假设有一对起点终点,随着时间推移,网络最后会达到近似均衡,即选择任意一条路从起点到终点的花费差别不大。

关于这个问题,有个叫做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;
}




最后再次谢谢您的帮助!

...全文
210 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangtaotai 2009-10-04
  • 打赏
  • 举报
回复
试了下,每次到循环的时候就好像不行了。但是能通过编译,不知道是什么问题?
delphiwcdj 2009-10-04
  • 打赏
  • 举报
回复
你先单步调试一下,看是哪里报错

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧