关于交通网络均衡分配的问题?
我最近最一个课程的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;
}
最后再次谢谢您的帮助!