#include <iostream>
#include <cstdlib>
#include <time.h>
#include <fstream>
using namespace std;
#define M 20000
#define N 1000
#define V 5
#define K 1000
struct Data
{
int v[N];
int d[N];
int x[N];
int fl;
} T[M];
struct Picda
{
float k;
} D[K];
class Random
{
public:
Random(float p = 0.5)
{
cout << "以概率p输出1" << endl;
}
~Random()
{
cout << "正在析构Random......" << endl;
}
int Outp(float p = 0.5) //以概率p输出1,车辆进入道路和随机慢化使用Random::Outp(p)
{
int a = rand() % 10;
if (a < p * 10)
return(1);
else
return(0);
}
int Vol() //随机给出一个速度,数值为1-5
{
int v = 0;
for (int i = -1; i<rand() / 100; i++)
{
v = rand() % V + 1;
}
return(v);
}
};
class Ready
{
public:
Random tr;
Ready()
{
cout << "正在进行NaSch模型的数值分配,请稍等......" << endl;
}
~Ready()
{
cout << "数值分配结束!正在析构函数......" << endl;
}
void Default(int num) //初始化第1个时间步的车辆位置
{
num_ = num;
for (int i = 0; i < num; i++)
{
flag[i] = rand() % N;
for (int j = 0; j < i; j++)
{
if (flag[j] == flag[i])
{
i--;
break;
}
}
//cout << "值:" << flag[i] << " ";
}
/*for(int i=0;i<num-1;i++)
for (int j = 0; j < num - i-1; j++)
{
if (flag[j] < flag[j+1])
{
int t = flag[j];
flag[j] = flag[j+1];
flag[j+1] = t;
}
}
for (int i = 0; i < num; i++)
cout << flag[i] << "/ ";*/
//cout << endl;
/*for (int i = 0; i < num_; i++) //用于测试,输出初始化车辆的位置数据,正式运行时隐去
{
cout << "flag[" << i << "]=" << flag[i] << " ";
}
cout << endl;*/
}
void TransV(int n) //得到第1时间步有车的位置车辆的速度
{
for (int i = 0; i < N; i++)
{
T[n].x[i] = 0;
T[n].d[i] = 0;
T[n].v[i] = 0;
}
for (int i = 0; i < num_; i++)
{
T[n].x[flag[i]] = 1;
T[n].v[flag[i]] = tr.Vol();
}
/*cout << "输出初始化车辆位置和速度:" << endl; //测试用输出值,正式运行时隐去
for (int i = 0; i < num_; i++)
cout << "T.x[" << flag[i] << "]:" << T[n].x[flag[i]] << "; ";
cout << endl;
for (int i = 0; i < num_; i++)
cout << "T.v[" << flag[i] << "]:" << T[n].v[flag[i]] << "; ";
cout << endl;*/
//cout << num_ << endl;
}
void TransD(int n) //得到第1时间步有车的位置的前车距离
{
int a, b = 0;
for (int i = 0; i < N; i++)
if (T[n].x[i] == 1)
{
a = i; b = i; break;
}
for (int i = a + 1; i < N; i++)
{
if (T[n].x[i] == 1)
{
T[n].d[b] = i - b - 1;
b = i;
}
}
T[n].d[b] = 999 - b + a;
/*cout << "第"<<n+1<<"时间步车速和前车距离:" << endl;
for (int i = 0; i < N;i++) //测试用,输出第一时间步的车辆速度和前车距离,正式运行时隐去
{
if (T[n].x[i] == 1)
{
cout << "T.v[" << i << "]:" << T[n].v[i] << "; ";
}
}
cout << endl;
for (int i = 0; i < N; i++) //测试用,输出第一时间步的车辆速度和前车距离,正式运行时隐去
{
if (T[n].x[i] == 1)
{
cout << "T.d[" << i << "]:" << T[n].d[i] << "; ";
}
}
cout << endl;*/
}
private:
int flag[N];
int num_;
};
class NaSch
{
public:
Random use1;
Ready use2;
NaSch()
{
cout << "正在进行模型运算,请稍等......" << endl;
}
~NaSch()
{
cout << "模型计算结束,正在析构模型......" << endl;
}
void Acce(int n) //模拟第n个时间步的加速
{
for (int i = 0; i < N; i++)
{
if (T[n - 1].x[i])
T[n - 1].v[i] = Min((T[n - 1].v[i] + 1), V);
}
}
void Bra(int n) //模拟第n个时间步的减速
{
for (int i = 0; i < N; i++)
{
if (T[n - 1].x[i])
T[n - 1].v[i] = Min(T[n - 1].v[i], T[n - 1].d[i]);
}
}
void Ramiz(int n) //模拟第n个时间步的随机慢化
{
for (int i = 0; i < N; i++)
{
if (T[n - 1].x[i])
if (use1.Outp(0.3)) //以概率p=0.3随机慢化
T[n - 1].v[i] = Max((T[n - 1].v[i] - 1), 0);
}
}
void Flash(int n) //更新第n时间步的位置,速度和前车距离数据
{
T[n].fl = 0;
for (int i = 0; i < N; i++)
{
T[n].x[i] = 0;
T[n].d[i] = 0;
T[n].v[i] = 0;
}
for (int i = 0; i<N; i++)
if (T[n - 1].x[i])
{
int re = i + T[n - 1].v[i];
if (re >= N)
{
re = re - N;
T[n].fl = 1;
}
T[n].x[re] = 1;
T[n].v[re] = T[n - 1].v[i];
}
use2.TransD(n);
}
int Min(int a, int b)
{
int min = a < b ? a : b;
return min;
}
int Max(int a, int b)
{
int max = a > b ? a : b;
return max;
}
};
class Picout
{
public:
Picout()
{
cout << "正在生成标准图和时空图......" << endl;
}
~Picout()
{
cout << "图形生成成功,正在析构函数......" << endl;
}
void XTout(int n) //用于输出时空图
{
for (int i = 0; i < N; i++)
{
if (T[n].x[i])
cout << T[n].v[i];
else cout << ".";
}
cout << endl;
ofstream ofs("a.txt",ios::app);
for (int i = 0; i < N; i++)
{
if (T[n].x[i])
ofs << n-19499 << "," << i << "," << T[n].v[i] << endl;
}
}
float PKout() //用于输出某密度下的对应流量,探针法
{
float count, num = 0, av;
float a1 = 0, a2 = 0;
for (int i = 0; i < N; i++)
{
if (T[M-10000].x[i])
if (i <= 500)
a1++;
}
for (int i = M-9999; i < M; i++)
{
for (int j = 0; j < N; j++)
{
if (T[i].x[j])
if (j <= 500)
a2++;
}
//cout << a1 << "/" << a2 << endl;
if (T[i].fl)
count = a1 - a2+1;
else
count = a1 - a2;
num = num + count;
a1 = a2; a2 = 0;
}
av = num / (M - 1);
//cout << av;
return av;
}
/*float PKrev(int n) //用速度与密度的乘积计算流量,用于检查数据准确性,正式运算时隐去
{
float count = 0;
float av;
for (int i = M-10000; i < M; i++)
for (int j = 0; j < N; j++)
count += (float)T[i].v[j];
//cout << count << endl;
av = count / (n*M);
//cout << av;
return(av);
}*/
};
void main()
{
srand((int)time(NULL));
Random a;
Ready b;
NaSch c;
Picout d;
for (int bs = 1; bs < 1000; bs++)
{
b.Default(bs);
b.TransV(0);
b.TransD(0);
for (int i = 1; i < M; i++)
{
c.Acce(i);
c.Bra(i);
c.Ramiz(i);
c.Flash(i);
}
ofstream ofs("b.txt", ios::app);
ofs << bs << "," << d.PKout() << endl;
if(bs==200)
for (int i = M - 500; i < M; i++)
{
d.XTout(i);
}
cout << "结束第" << bs << "轮运算......" << endl;
}
//cout << d.PKout() << endl;
//d.PKrev();
system("pause");
}
NaSch.zip_nasch_交通_元胞_用C++编辑的Nasch单车道模拟模型
版权申诉
183 浏览量
2022-07-14
23:59:23
上传
评论
收藏 2KB ZIP 举报
周楷雯
- 粉丝: 80
- 资源: 1万+