user-0 提问: 想了好几天了，求道路中行驶车辆平均速度的程序老是出错，有没有大神指点迷津，错在哪里了啊

回复:
user: user-0
content: 唉，其实，我这种算法正经的NS模型简化了很多，再改改吧

user: user-0
content: 这么题目是对交通流元胞自动机NS模型的简化模拟。 NS模型是模拟单车道高速公路的一个模型，该模型用一个一维点阵代表一个车道，即将所研究的单车道分为n个长度为L（一般为7.5米）的小路段（元胞），点阵中每个位置代表一个元胞，每个位置空闲或容纳一辆车。定义元胞长度L为道路阻塞时的平均车头间距；车辆速度取值范围为0～Vmax，Vmax=5个元胞每秒，时间步长可以认为是驾驶员的反应时间，通常取1秒，每个位置的状态有7中，分别是：空闲、该车速度为0、1、2、3、4、5. 所有车辆按照下面四个规则运动： （1）加速 如果V（t）<Vmax,则V（t+1）=min（Vmax，V(t)+1) （2）减速 如果V（t）>gap（gap是当前车辆与前面那辆车的距离）,则V（t+1）=gap （3）随机减速，在P概率下， V（t+1）=min（V(t+1)-1,0) （4）车辆运动，x（t+1）=x（t）+v（t+1）

user: user-1
content: 你好，请问这个问题依附的背景是什么？我纯属好奇。

user: user-2
content: 上帖第67行s/=2.0;应改为s/=20.0; 随之第84行结果33.32应为3.33

user: user-2
content: 发现 100秒内20辆的平均速度=每两车的平均速度/20.0=(每两车各自走过的总距离/100.0秒)/20.0 错了！ 应纠正为 100秒内20辆的平均速度=20辆车的平均速度之和/20.0=(20辆车“各自走过的总距离/100.0秒”之和)/20.0 //将一条道路分为1000个点格，每辆汽车占用1个格子，20辆汽车随机分布在这1000个格点内，汽车行驶速度为每秒0,1,2,3,4,5个格子，运行100秒，求这100秒内20辆车的平均速度。 //行驶规则为： //1、加速，若当前车辆车速小于该车与前车的距离，并且该车的车速小于最大车速5则该车的速度+1 ； //2、减速，若当前车辆速度大于该车与前车的距离，则该车车速=与前车的距离； //3、随机减速，有P=0.5的概率车速减1； //4、位置更新，下一秒的位置=当前位置+当前速度*1秒。 //100秒内20辆的平均速度=20辆车的平均速度之和/20.0=(20辆车“各自走过的总距离/100.0秒”之和)/20.0 #include <stdio.h> #include <stdlib.h> #include <time.h> struct CAR {     int il;//初始车位置     int l;//当前车位置     int v;//当前车速     int l1;//下一秒车位置     int v1;//下一秒车速 } cars[20],tc; int t,i,j,l; double s; int main() {     srand(time(NULL));       for (i=0;i<20;i++) {         while (1) {             l=rand()%1000;             for (j=0;j<i;j++) if (l==cars[i].il) break;             if (j>=i) break;         }         cars[i].il=l;         cars[i].l=l;     }     for (i=0;i<20-1;i++) {         for (j=i+1;j<20;j++) {             if (cars[i].l>cars[j].il) {tc=cars[i];cars[i]=cars[j];cars[j]=tc;}         }     }     for (i=0;i<20;i++) {         printf("%03d ",cars[i].l);     }     printf("\n-------------------------------\n");     for (t=0;t<100;t++) {         for (i=0;i<20-1;i++) {             if (cars[i].v<cars[i+1].l-cars[i].l && cars[i].v<5) cars[i].v1=cars[i].v+1;//若当前车辆车速小于该车与前车的距离，并且该车的车速小于最大车速5则该车的速度+1 ；             if (cars[i].v>cars[i+1].l-cars[i].l) cars[i].v1=cars[i+1].l-cars[i].l;//若当前车辆速度大于该车与前车的距离，则该车车速=与前车的距离；             if (rand()%2==1) if (cars[i].v1>0) cars[i].v1--;//有P=0.5的概率车速减1；             cars[i].l1=cars[i].l+cars[i].v1*1;//下一秒的位置=当前位置+当前速度*1秒。         }         if (rand()%2==1) if (cars[i].v1>0) cars[i].v1--;//有P=0.5的概率车速减1；         cars[i].l1=cars[i].l+cars[i].v1*1;//下一秒的位置=当前位置+当前速度*1秒。         if (cars[i].l1>999) cars[i].l1=999;          printf("t==%02d,",t);         for (i=0;i<20;i++) {             cars[i].l=cars[i].l1;             cars[i].v=cars[i].v1;             printf("%03d ",cars[i].l);         }         printf("\n");     }      printf("\n-------------------------------\n");     //100秒内20辆的平均速度=20辆车的平均速度之和/20.0=(20辆车“各自走过的总距离/100.0秒”之和)/20.0     s=0.0;     for (i=0;i<20;i++) {         s+=(cars[i].l-cars[i].il)/100.0;     }     s/=2.0;     printf("%.2lf\n",s);      return 0; } //014 039 080 094 157 170 172 180 204 225 297 370 373 479 630 652 779 853 904 920 //------------------------------- //t==00,015 040 081 094 157 170 173 180 205 226 298 370 374 479 630 652 779 854 905 920 //t==01,017 041 082 094 157 171 174 180 207 228 299 370 375 480 630 652 780 856 906 920 //t==02,020 043 083 095 157 172 176 180 209 230 301 371 376 482 630 652 782 859 908 920 //t==03,024 046 085 096 158 174 179 180 212 232 303 373 377 485 630 653 784 862 910 920 //... ... //t==97,451 459 495 509 523 543 561 591 629 650 727 778 786 908 920 920 920 920 920 920 //t==98,456 464 499 514 528 548 566 595 633 655 731 782 791 912 920 920 920 920 920 920 //t==99,461 469 504 519 532 552 570 600 638 659 736 786 795 916 920 920 920 920 920 920 // //------------------------------- //33.32 //

user: user-0
content: 谢谢大神，看到您的回复思路终于理顺了

user: user-2
content: 非环形道路，不超车： //将一条道路分为1000个点格，每辆汽车占用1个格子，20辆汽车随机分布在这1000个格点内，汽车行驶速度为每秒0,1,2,3,4,5个格子，运行100秒，求这100秒内20辆车的平均速度。 //行驶规则为： //1、加速，若当前车辆车速小于该车与前车的距离，并且该车的车速小于最大车速5则该车的速度+1 ； //2、减速，若当前车辆速度大于该车与前车的距离，则该车车速=与前车的距离； //3、随机减速，有P=0.5的概率车速减1； //4、位置更新，下一秒的位置=当前位置+当前速度*1秒。 //100秒内20辆的平均速度=每两车的平均速度/20.0=(每两车各自走过的总距离/100.0秒)/20.0 #include <stdio.h> #include <stdlib.h> #include <time.h> struct CAR {     int il;//初始车位置     int l;//当前车位置     int v;//当前车速     int l1;//下一秒车位置     int v1;//下一秒车速 } cars[20],tc; int t,i,j,l,s; int main() {     srand(time(NULL));      for (i=0;i<20;i++) {         while (1) {             l=rand()%1000;             for (j=0;j<i;j++) if (l==cars[i].il) break;             if (j>=i) break;         }         cars[i].il=l;         cars[i].l=l;     }     for (i=0;i<20-1;i++) {         for (j=i+1;j<20;j++) {             if (cars[i].l>cars[j].il) {tc=cars[i];cars[i]=cars[j];cars[j]=tc;}         }     }     for (i=0;i<20;i++) {         printf("%03d ",cars[i].l);     }     printf("\n-------------------------------\n");     for (t=0;t<100;t++) {         for (i=0;i<20-1;i++) {             if (cars[i].v<cars[i+1].l-cars[i].l && cars[i].v<5) cars[i].v1=cars[i].v+1;//若当前车辆车速小于该车与前车的距离，并且该车的车速小于最大车速5则该车的速度+1 ；             if (cars[i].v>cars[i+1].l-cars[i].l) cars[i].v1=cars[i+1].l-cars[i].l;//若当前车辆速度大于该车与前车的距离，则该车车速=与前车的距离；             if (rand()%2==1) if (cars[i].v1>0) cars[i].v1--;//有P=0.5的概率车速减1；             cars[i].l1=cars[i].l+cars[i].v1*1;//下一秒的位置=当前位置+当前速度*1秒。         }         if (rand()%2==1) if (cars[i].v1>0) cars[i].v1--;//有P=0.5的概率车速减1；         cars[i].l1=cars[i].l+cars[i].v1*1;//下一秒的位置=当前位置+当前速度*1秒。         if (cars[i].l1>999) cars[i].l1=999;          printf("t==%02d,",t);         for (i=0;i<20;i++) {             cars[i].l=cars[i].l1;             cars[i].v=cars[i].v1;             printf("%03d ",cars[i].l);         }         printf("\n");     }      printf("\n-------------------------------\n");     //100秒内20辆的平均速度=每两车的平均速度/20.0=(每两车各自走过的总距离/100.0秒)/20.0     s=0;     for (i=0;i<20;i++) s+=cars[i].l-cars[i].il;     printf("%.2lf\n",s/100.0/20.0);      return 0; } //043 067 127 187 237 354 407 522 599 638 681 701 759 780 820 881 905 913 934 948 //------------------------------- //t==00,043 067 128 188 238 355 408 523 600 638 682 701 759 781 820 881 906 914 934 948 //t==01,044 067 130 189 240 356 409 524 601 638 684 702 760 783 820 882 907 915 934 948 //t==02,045 068 133 190 243 358 411 525 602 638 686 703 761 786 820 883 908 916 934 948 //t==03,046 070 137 191 247 361 414 527 604 639 688 705 763 790 820 885 910 918 935 948 …… //t==97,449 489 560 596 666 788 831 940 948 948 948 948 948 948 948 948 948 948 948 948 //t==98,453 494 565 601 670 792 836 944 948 948 948 948 948 948 948 948 948 948 948 948 //t==99,458 499 570 605 675 796 840 947 948 948 948 948 948 948 948 948 948 948 948 948 // //------------------------------- //2.63 //

user: user-2
content: 引用 7 楼 u012256872 的回复:因为小车是周期性的，也就是说从右边边界出去了，就要从左边进来，所以车子重新遍一个号 环形道路啊！

user: user-0
content: 是啊，单向单车道

user: user-3
content: 单向单车道么?

user: user-0

user: user-0
content: 因为小车是周期性的，也就是说从右边边界出去了，就要从左边进来，所以车子重新遍一个号

user: user-0
content: 谢谢顶贴啊啊

user: user-2
content: 100秒内20辆的平均速度=每两车的平均速度/20.0=(每两车各自走过的总距离/100.0秒)/20.0

user: user-2
content: 我觉得这些车的前后顺序不会变。

user: user-2
content: 记录每辆车的当前位置，当前车速，下一秒位置，下一秒车速 随机分布参考#include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }  if (rand()%2==0) //0.5概率

user: user-0
content: 菜鸟求指点

user: user-0
content: #include<stdio.h> #include<time.h> #include<stdlib.h> #include<conio.h>   //定义结构体，记录车子的位置，速度，与前一辆车的距离 struct cars { 	int x; 	int v; 	int gap; }car[1000];   //随机数发生器,产生0到1的数 double rnd() {	 	     double j;     j=(double) rand() / (RAND_MAX);     return j; }   //初始化小车位置和速度 void initialize(struct cars *car ) { 	int i,j,tmp1,tmp2; 	 	//产生小车，随机分布在道路上 	for(i=1;i<21;i++) 		{loop:tmp1=car[i].x=rand()%999+1; 			for(j=1;j<i;j++) 				{if(tmp1==car[j].x) 					goto loop; 				} 		} 	//排序，使car[1].x为头车位置，car[2].x为第二辆车位置，.... 	for(i=1;i<21;i++) 		for(j=i+2;j<21;j++) 			if(car[i].x<car[j].x) 			{	 				tmp2=car[i].x; 				car[i].x=car[j].x; 				car[j].x=tmp2; 			} 	 	//小车速度赋初值 	for(i=1;i<21;i++) 		car[i].v=rand()%6;  	}  //小车按规则运动100秒，并计算这10秒钟20辆小车的平均速度	 void movecar(struct cars *car) { 	int t=0,i,j,sum1=0,v[100],tmp2=0,tmp3=0;  	while(t<100) 	{	 		//位置更新 		for(i=1;i<21;i++) 			{	 			 if(car[i].x+car[i].v<=1000) 				car[i].x=car[i].x+car[i].v; 			 else 				{car[i].x=car[i].x+car[i].v-1000; 				 			     //重新排序，头车变尾车..... 				 for(i=1;i<21;i++) 				 for(j=i+2;j<21;j++) 					if(car[i].x<car[j].x) 					 {	 						tmp2=car[i].x; 						car[i].x=car[j].x; 						car[j].x=tmp2; 						tmp3=car[i].v; 						car[i].v=car[j].v; 						car[j].v=tmp3; 					 } 					} 			} 		 		 		//重新计算与前车的距离 		car[1].gap=1000-car[1].x; 		for(i=2;i<21;i++) 			car[i].gap=car[i].x-car[i+1].x; 		 		//按照加速减速和随机慢化的规则改变速度的大小 		for(i=1;i<21;i++) 		{	 			if(car[i].v<car[i].gap&&car[i].v<6) 				car[i].v=car[i].v+1; 			else 				car[i].v=car[i].gap; 			if(rnd()<0.5) 				car[i].v=car[i].v-1; 			sum1+=car[i].v; 			 		}  		v[t]=sum1/20; 		t++; 	} 	for(i=0;i<100;i++) 		printf("%d ",v[i]);  }  void main() { 	srand((unsigned)time(NULL)); 	 	initialize(car); 	movecar(car); 	getch(); }