-
Notifications
You must be signed in to change notification settings - Fork 1
/
main.c
1501 lines (1181 loc) · 42 KB
/
main.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
#include<stdio.h>
#define _USE_MATH_DEFINES//VisualStudio用
#include<math.h>
#include<time.h>
#include<stdlib.h>
enum methods {WALK, BIKE, CAR, CAR_H, TRAIN};
enum goals {STATION_A, STATION_B, COMPANY, HIGHWAY_S, HIGHWAY_E, PARKING, BIKELOT, STATION_LOT};
enum routs {W_STATION_A, W_COMPANY, B_STATION_A, B_COMPANY, B_BIKELOT, C_COMPANY, C_HIGHWAY_S, C_PARKING, C_HIGHWAY_E, T_STATION_B, B_STATION_LOT,END = 100};
enum methods method;
enum goals goal;
enum routs routs;
#define NUM_AGENT 1000 //エージェント数
#define NUM_HOME 1000 //家の数
#define NUM_COMPANY 1000 //会社の数
#define NUM_PARKING 1000 //駐車場の数(初期値)
#define NUM_BIKELOT 1000 //駐輪場の数
#define NUM_ROUTE_TYPE 8 //トリップの種類数
#define MAX_ROUTE_DEPTH 10 //手段トリップの最大数(実際に使ってるのは4つまで)
#define Xl -6000 //仮想空間のX軸最低値-6000
#define Xh 6000 // 最大値6000
#define Yl -4000 //仮想空間のY軸最低値-4000
#define Yh 4000 // 最大値4000
/////////////////////////////////////////////////////////////////////////////
#define MM 0 //モビリティマネジメントの割合(0-1)
double charge_g = 0.1; //0.01 ; //ガソリン代(円/m)
/////////////////////////////////////////////////////////////////////////////
double L = 4000; //2駅間の距離(m)
double Vw = 66; //歩く速度(m/分)(4km/h)
double Vb = 267;//160; //自転車の速度(m/分)(9.6km/h)
double Vc = 450; //自動車の速度(m/分)(27km/h)
double Vch = 833; //自動車の幹線道路の速度(m/分)(50km/h)
double Vt; //電車の速度
double Lb= 3200; //businesszoneの半径
double Lh= 3200; //homezoneの半径
int route[NUM_ROUTE_TYPE][MAX_ROUTE_DEPTH]; //ルート
int car_dencity[(Yh-Yl)/100][(Xh-Xl)/100]; //区画ごとの車密度
int home_dencity[(Yh-Yl)/100][(Xh-Xl)/100]; //区画ごとの自宅密度
int com_dencity[(Yh-Yl)/100][(Xh-Xl)/100]; //区画ごとの会社密度
double E = 0.7; //変異確率の初期値
double G = 0.94; //変異確率に掛ける定数
double B = 0.5; //学習係数
double P_remove = 0.5; //自転車撤去確率
double charge_rm = 3000; //撤去返還代
double charge_t; //電車代
//double count_CAR_H = 0;
//double count_CAR = 0;
int count_par =0; //倒産した駐車場の数
//変換変数
double change_f = 20; //疲れ
double change_t = 30; //時間
int route[NUM_ROUTE_TYPE][MAX_ROUTE_DEPTH]; //ルート
int check; //エージェント到着確認のための変数
//移動手段と目的地
struct unit_trip{
int method; //方法
int goal_id; //現在の目的地
};
struct trip{
int unit[10]; //トリップの[]番目の手段トリップ
int unit_state; //エージェントは選択したトリップのunit_state番目の手段トリップを使っている
int route_num; //エージェントが選択したトリップ番号
};
//エージェント
struct agent{
double x[2]; //エージェントの位置
double W[3]; //エージェントの偏向(しんどさ,金,時間)
double route_cost[NUM_ROUTE_TYPE]; //各トリップにかかるコスト
struct trip t; //トリップ
double v; //現在の速度
double time; //移動時間
double distance_c; //移動距離(車)
double distance_w; //移動距離(徒歩)
double distance_b; //移動距離(自転車)
double distance_t; //移動距離(電車)
double money; //費用
double fatigue; //疲れ
int company; //目的地ナンバー
int parking; //利用している駐車場のナンバー
int bikelot; // 駐輪場のナンバー
int d_num[2]; //現在地ゾーンナンバー(エージェントの今いる区画)
};
//住宅
struct home{
double x[2]; //家の座標
double price; //地代
};
//仮転居先
struct home_temp{
double x[2]; //仮転居先の座標
double price; //地代
//double cost;
};
//会社
struct company{
double x[2]; //会社の座標
};
//区画ごとの密度
struct density{
double car; //車密度
double home; //自宅密度
double com; //会社密度
double Hprice; //区画ごとの地代
};
//駐車場
struct parking{
double x[2]; //駐車場の座標
int capacity; //容量
int charge; //駐車代
int num_park; //駐車台数
};
//駐輪場
struct bikelot{
double x[2]; //駐輪場の座標
int capacity; //容量
int charge; //駐輪代
int num_lot; //駐輪台数
};
//駅の駐輪場
struct stationlot{
double x[2]; //駅駐輪場の座標
int capacity; //容量
int charge; //駐輪代
int num_lot; //駐輪台数
};
//駅
double station_a[2]; //駅Aの座標
double station_b[2]; //駅Bの座標
//struct density den[500][500];
//関数
//エージェント,住宅,会社などの初期設定
//初期自宅座標初期化
void setup_home(struct home h[]);
//仮転居先(自宅)初期化
void reset_home(struct home h[],struct home_temp ht[]);
//地代計算
void home_price(struct home h[],struct home_temp ht[],struct company c[]);
//転居先決定
void select_home(struct home h[],struct home_temp ht[],int counter,FILE *fp8);
//モビリティマネジメント
void mobility_management(struct agent a[]);
//会社座標初期化
void setup_company(struct company c[]);
//各トリップ内の手段トリップ初期化
void setup_trip(struct unit_trip u[]);
//エージェントの初期化
void setup_agent(struct agent a[], struct home h[]);
//駐車場・駐輪場座標初期化
void setup_park_lot(struct parking p[], struct bikelot l[], struct stationlot sl);
//エージェントすべて移動終了までループ
void MoveToDestination(struct agent a[],struct unit_trip u[],struct company c[],struct parking p[],struct bikelot bl[],double next[]);
//エージェントのルート選択
void select_rute(struct agent a[]);
//double select_trip(); //移動手段の決定
//エージェントの再初期化
void reset_agent(struct agent a[], struct home h[]);
// エージェントの現在の速度の計算
double speed(int trip);
//エージェントの移動
void movement(struct agent a[],double next[], struct unit_trip u[], int i);
//次の目的地の決定
void next_spot(struct agent a[], struct company c[], struct parking par[], struct bikelot bl[], struct unit_trip u[], double next[], int i);
//到着確認
int check_arrival(struct agent a[], double next[], int i);
//移動にかかった疲れ算出
void tired(struct agent a[], struct unit_trip u[], int i);
//移動にかかった料金算出
void money(struct agent a[], struct parking p[], struct bikelot l[], struct stationlot sl, int i);
//移動総コスト算出
void cost(struct agent a[], int i);
//仮転居先での移動総コスト算出
double cost_home(struct agent a[], int i);
//車密度の計算
void calc_dencity(struct agent a[], struct unit_trip u[]);
//渋滞による速度減少・疲れの加算
void congestion(struct agent a[], struct unit_trip u[], int i);
//駐輪場選択
int selectbiklot(struct company c[], struct agent a[], struct bikelot bl[], int i);
//駐車場選択
int selectparking(struct company c[], struct agent a[], struct parking p[], int i);
main()
{
//宣言初期化
struct unit_trip unit[20]; //トリップ
struct agent age[NUM_AGENT]; //エージェント
struct home hom[NUM_HOME]; //ホーム
struct home_temp homt[1000]; //仮転居先
struct company com[NUM_COMPANY]; //目的地
struct parking park[NUM_PARKING]; //駐輪場
struct bikelot lot[NUM_BIKELOT]; //駐車場
struct stationlot s_lot; //駅駐輪場
int i , h,j,k,l,n,q; //ループ
int counter;
int x; //試行回数
double next[2]; //エージェントの現在の目標座標
int count[NUM_ROUTE_TYPE] = {0}; //各トリップを選択したエージェント数
//int counter2[101][101]={0};
//int counter_m = 0;
//int car_dencity[][1000]={0};//車密度[Lh*2/100][L+Lh+Lb]
//int distance_a[NUM_ROUTE_TYPE] = {0};//平均距離(自宅-駅A)
//int distance_b[NUM_ROUTE_TYPE] = {0};//平均距離(自宅-目的地)
FILE *fp1;
FILE *fp2;
FILE *fp3;
FILE *fp4;
FILE *fp7;
FILE *fp8;
FILE *fp9;
FILE *fp10;
FILE *fp11;
FILE *fp12;
charge_t = L * 0.04;//電車代
station_a[0] = -L/2; station_a[1] = 0;//駅座標
station_b[0] = L/2; station_b[1] = 0;
//printf("%f\n",station_b);
s_lot.x[0]=s_lot.x[1]=0;
s_lot.capacity=0;
s_lot.charge=0;
s_lot.num_lot=0;
/*
if((fp1 = fopen("data1000.csv", "w")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE);
}
*/
if((fp2 = fopen("L500.csv", "w")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE);
}
/*
if((fp3 = fopen("route.csv", "w")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE);
}
*/
if((fp4 = fopen("trip_change.csv", "w")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE);
}
//分布図
if((fp7 = fopen("home1.csv", "w")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE);
}
if((fp8 = fopen("Move_Cost.csv", "w")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE);
}
if((fp9 = fopen("price_routecost.csv", "w")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE);
}
if((fp10 = fopen("all_cost.csv", "w")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE);
}
if((fp11 = fopen("co2.csv", "w")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE);
}
if((fp12 = fopen("need_place.csv", "w")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE);
}
srand((unsigned)time(NULL)); /* 乱数の初期化 */
//初期化
setup_trip(unit);
setup_home(hom);
setup_company(com);
setup_agent(age, hom);
setup_park_lot(park,lot,s_lot);
//電車速度算出
// L=5000 とすると Vt =1100m/min = 66km/h くらいか.
Vt = L/7 +350;
if(Vt>1100)
Vt=1100;
//交通行動選択
printf("交通行動試行回数:");
scanf("%d",&x);
//試行回数ループ
for(h=0;h<x;h++){
//再度初期化必要な物初期化
reset_agent(age, hom);
//駐車場の仮想容量設定
for(i=0;i<NUM_PARKING;i++){
park[i].capacity = 4;
}
printf("-------------%d日目--------------\n",h);
//エージェントすべて移動終了までループ
MoveToDestination(age,unit,com,park,lot,next);
//移動総コストの算出
for(k=0;k<NUM_AGENT;k++){
money(age, park, lot, s_lot, k);
cost(age, k);
}
//駐車数が0な駐車場倒産.倒産時はcapacity=0
for(i=0;i<NUM_PARKING;i++){
if(park[i].num_park == 0)
park[i].capacity = 0;
}
//エージェントのトリップ選択
if(h != (x-1))
select_rute(age);
//10エージェントの1日ごとのトリップ選択変化
for(i=0;i<10;i++){
fprintf(fp4,"%d %d ",i,age[i].t.route_num+1);
}
fprintf(fp4,"\n");
}
for(i=0;i<NUM_AGENT;i++){
// printf("%d x=%f y=%f time %f tired %f route = %d cost = %f\n",i, age[i].x[0], age[i].x[1], age[i].time, age[i].fatigue, age[i].t.route_num, age[i].route_cost[age[i].t.route_num]);
count[age[i].t.route_num]++;
}
//各トリップごとのエージェント数を出力
for(i=0;i<NUM_ROUTE_TYPE;i++){
fprintf(fp2,"%d %d\n",i+1, count[i]);
}
/*
for(i=0;i<NUM_PARKING;i++){//駐車場ごとの駐車台数
if(park[i].capacity != 0){
fprintf(fp1,"%4d %3d %.0lf\n",i,park[i].num_park,(double)(park[i].num_park/park[i].capacity)*100);
count_par++;
}
}
fprintf(fp1,"\n%d/%d %.0lf",(NUM_PARKING-count_par),NUM_PARKING,(double)(NUM_PARKING-count_par)/NUM_PARKING*100);//残った駐車場の数
*/
//居住地選択
//モビリティマネジメント
mobility_management(age);
for(i=0;i<NUM_ROUTE_TYPE;i++){
count[i]=0;
}
for(i=0;i<NUM_AGENT;i++){
count[age[i].t.route_num]++;
}
fprintf(fp2,"\n");
//各トリップごとのエージェント数
for(i=0;i<NUM_ROUTE_TYPE;i++){
fprintf(fp2,"%d %d\n",i+1, count[i]);
}
//転居回数
printf("転居試行回数:");
scanf("%d",&x);
fprintf(fp9,"i homt_price,cost_home time money fatigue\n");
//100エージェントずつ転居,候補先はそれぞれ10箇所
for(h=0;h<x;h++){
for(counter=0;counter<NUM_AGENT;counter+=100){
printf("\n%dcycle%d~%dエージェント転居\n",h,counter,counter+100);
//転居候補選択
reset_home(hom,homt);
//地代計算
home_price(hom,homt,com);
//交通移動
for(k=0;k<1000;k+=100){
//再度初期化必要な物初期化
reset_agent(age, hom);
//100エージェントが仮転居
for(j=counter;j<counter+100;j++){
age[j].x[0]=homt[(j-counter)+k].x[0];
age[j].x[1]=homt[(j-counter)+k].x[1];
//printf("%d %lf %lf\n",j,age[j].x[0],age[j].x[1]);
}
//仮転居先から目的地への移動
MoveToDestination(age,unit,com,park,lot,next);
//コストの算出
for(j=counter;j<counter+100;j++){
money(age, park, lot, s_lot, j);
fprintf(fp9,"%d %.0lf %.0lf %.0lf %.0lf %.0lf\n",(j-counter)+k,homt[j].price,cost_home(age,j),age[j].time* change_t,age[j].money,age[j].fatigue*change_f);
//転居コスト=地代+移動コスト
homt[(j-counter)+k].price = homt[(j-counter)+k].price/360 + cost_home(age,j);
}
}
//転居先選択+転居
select_home(hom,homt,counter,fp8);
fprintf(fp7,"\n%dcycle%d~%dエージェント転居\n",h,counter,counter+100);
fprintf(fp9,"\n%dcycle%d~%dエージェント転居\n",h,counter,counter+100);
fprintf(fp8,"\n%dcycle%d~%dエージェント転居\n",h,counter,counter+100);
for(i=0;i<NUM_HOME;i++){
fprintf(fp7,"%d %.0lf %.0lf\n",i,hom[i].x[0],hom[i].x[1]);
}
}
}
//全エージェント転居終了後の総コスト+CO2算出
//地代計算
home_price(hom,homt,com);
//再度初期化必要な物初期化 reset_agent(age, hom);
//転居先から目的地への移動
MoveToDestination(age,unit,com,park,lot,next);
//コストの算出
for(i=0;i<NUM_AGENT;i++){
money(age, park, lot, s_lot, i);
fprintf(fp10,"%d, %.0lf, %.0lf, %.0lf, %.0lf, %.0lf, %.0lf\n",i,hom[i].price,cost_home(age,i),age[i].time*change_t,age[i].money,age[i].fatigue*change_f,hom[i].price/360+cost_home(age,i));
fprintf(fp11,"%d, %.2lf, %.2lf, %.2lf, %.2lf\n",i,age[i].distance_c/1000*100,age[i].distance_w/1000*0,age[i].distance_b/1000*0,age[i].distance_t/1000*30);//co2=移動距離×A walkとbikeは0
fprintf(fp12,"%d, %.2lf, %.2lf, %.2lf, %.2lf\n",i,age[i].distance_c/1000*100,age[i].distance_w/1000*2,age[i].distance_b/1000*8,age[i].distance_t/1000*6);//必要空間=移動距離×A
//homt[(j-counter)+k].price = homt[(j-counter)+k].price/360 + cost_home(age,j);// *50/365 移動費から削る/1000
}
/*
//交通行動選択2回目
fprintf(fp2,"\n--2--\n\n");
//初期化
E=0.7;
for(i=0;i<NUM_AGENT;i++){
for(k=0;k<NUM_ROUTE_TYPE;k++){
age[i].route_cost[k] = 0;
}
}
printf("交通行動試行回数:");
scanf("%d",&x);
//試行回数ループ
for(h=0;h<x;h++){
//再度初期化必要な物初期化
reset_agent(age, hom);
//駐車場の仮想容量設定
for(i=0;i<NUM_PARKING;i++){
park[i].capacity = 4;
}
printf("-------------%d日目--------------\n",h);
//エージェントすべて移動終了までループ
MoveToDestination(age,unit,com,park,lot,next);
//移動総コストの算出
for(k=0;k<NUM_AGENT;k++){
money(age, park, lot, s_lot, k);
cost(age, k);
}
//駐車数が0な駐車場倒産.倒産時はcapacity=0
for(i=0;i<NUM_PARKING;i++){
if(park[i].num_park == 0)
park[i].capacity = 0;
}
//エージェントのトリップ選択
if(h != (x-1))
select_rute(age);
//10エージェントの1日ごとのトリップ選択変化
for(i=0;i<10;i++){
fprintf(fp4,"%d %d ",i,age[i].t.route_num+1);
}
fprintf(fp4,"\n");
}
for(i=0;i<NUM_ROUTE_TYPE;i++){
count[i]=0;
}
for(i=0;i<NUM_AGENT;i++){
// printf("%d x=%f y=%f time %f tired %f route = %d cost = %f\n",i, age[i].x[0], age[i].x[1], age[i].time, age[i].fatigue, age[i].t.route_num, age[i].route_cost[age[i].t.route_num]);
count[age[i].t.route_num]++;
}
//各トリップごとのエージェント数を出力
for(i=0;i<NUM_ROUTE_TYPE;i++){
fprintf(fp2,"%d %d\n",i+1, count[i]);
}
*/
return 0;
}
//エージェント初期化
void setup_agent(struct agent a[], struct home h[]){
int x, y, z;
int p, q;
int i, j, k; //ループ
for(i=0;i<NUM_AGENT;i++){
a[i].x[0] = h[i].x[0];
a[i].x[1] = h[i].x[1];
a[i].time = 0;
a[i].money = 0;
a[i].fatigue = 0;
a[i].distance_c = 0;
a[i].distance_w = 0;
a[i].distance_b = 0;
a[i].distance_t = 0;
a[i].parking = 0;
a[i].bikelot = 0;
a[i].company = rand()%NUM_COMPANY;
//乱数で偏向を設定
x = 20 + rand() % 30;
y = 20 + rand() % 30;
z = 100 - x - y;
a[i].W[0] = (double)x/100;
a[i].W[1] = (double)y/100;
a[i].W[2] = (double)z/100;
p = rand() % NUM_ROUTE_TYPE;
q = 0;
j = 0;
for(k=0;k<NUM_ROUTE_TYPE;k++)
a[i].route_cost[k] = 0;
//トリップの割り当て
while(q != 100){
a[i].t.route_num = p;
q = route[p][j];
a[i].t.unit[j] = q;
j++;
}
a[i].t.unit_state = 0;
}
check = 0;
}
//自宅初期化
void setup_home(struct home h[]){//(-3600~-400)
int i,j,k,l,n;
double m=-L/2.0; // 平均m=Lh
double sigma=Lh/5.0; // 標準偏差σ=2*Lh/10
double r1,r2;
//double limit,limit1,limit2;
double x_sum=0,y_sum=0,sum2_x=0,sum2_y=0;
//int counter[101][101]={0};
FILE *fp6;
//srand((unsigned)time(NULL)); /* 乱数の初期化 */
for(i=0;i<NUM_HOME;i+=2){
//x座標
r1 = (double)rand()/RAND_MAX;
r2 = (double)rand()/RAND_MAX;
//printf("%lf %lf\n",r1,r2);
h[i].x[0] = (int)(sigma*sqrt(-2.0*log(r1))*cos(2.0*M_PI*r2)+m);
h[i+1].x[0] = (int)(sigma*sqrt(-2.0*log(r1))*sin(2.0*M_PI*r2)+m);
//y座標
r1 = (double)rand()/RAND_MAX;
r2 = (double)rand()/RAND_MAX;
h[i].x[1] = (int)(sigma*sqrt(-2.0*log(r1))*cos(2.0*M_PI*r2));
h[i+1].x[1] = (int)(sigma*sqrt(-2.0*log(r1))*sin(2.0*M_PI*r2));
x_sum+=h[i].x[0]+h[i+1].x[0];//平均
y_sum+=h[i].x[1]+h[i+1].x[1];
sum2_x=(h[i].x[0]+L/2)*(h[i].x[0]+L/2)+(h[i+1].x[0]+L/2)*(h[i+1].x[0]+L/2);//標準偏差
sum2_y=h[i].x[1]*h[i].x[1]+h[i+1].x[1]*h[i+1].x[1];
}
/*
for(i=0;i<NUM_HOME;i+=2){
h[i].x[0] = h[i].x[0] - Lh - L/2;
h[i+1].x[0] = h[i+1].x[0] - Lh - L/2;
x_sum+=h[i].x[0]+h[i+1].x[0];//平均
}
*/
for(i=0;i<NUM_HOME;i++){
if(h[i].x[0]<-10000 || h[i].x[1]<-10000 || 10000 < h[i].x[0] || 10000 < h[i].x[1]){
printf("error!!%d %f %f \n",i,h[i].x[0], h[i].x[1]);
}
}
printf("x_average=%lf\ny_average=%lf\n",x_sum/NUM_HOME,y_sum/NUM_HOME);//平均
printf("x_deviation=%lf\ny_debiation=%lf\n",sqrt(sum2_x/NUM_HOME),sqrt(sum2_y/NUM_HOME));//標準偏差
//分布図
if((fp6 = fopen("home0.csv", "w")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE);
}
for(i=0;i<NUM_HOME;i++){
fprintf(fp6,"%d %.0lf %.0lf\n",i,h[i].x[0],h[i].x[1]);
}
}
//仮転居先(自宅)初期化
void reset_home(struct home h[],struct home_temp ht[]){
int i,j,k,l,n;
double sum_x=0,sum_y=0;
double sum2_x=0,sum2_y=0;
double average_x=0,average_y=0;
double deviation_x=0,deviation_y=0;
double r1,r2;
//現在の平均・分散算出
for(i=0;i<NUM_HOME;i++){
sum_x+=h[i].x[0];
sum_y+=h[i].x[1];
}
average_x = sum_x/NUM_HOME;
average_y = sum_y/NUM_HOME;
for(i=0;i<NUM_HOME;i++){
sum2_x+=(h[i].x[0]-average_x)*(h[i].x[0]-average_x);
sum2_y+=(h[i].x[1]-average_y)*(h[i].x[1]-average_y);
}
deviation_x = sqrt(sum2_x/NUM_HOME);
deviation_y = sqrt(sum2_y/NUM_HOME);
printf("x_average=%lf\ny_average=%lf\n",average_x,average_y);//平均
printf("x_deviation=%lf\ny_debiation=%lf\n\n",deviation_x,deviation_y);//標準偏差
sum_x=0;
sum_y=0;
sum2_x=0;
sum2_y=0;
//仮転居先(10箇所*100エージェント)決定
for(i=0;i<1000;i+=2){
//x座標
r1 = (double)rand()/RAND_MAX;
r2 = (double)rand()/RAND_MAX;
ht[i].x[0] = (int)(deviation_x*sqrt(-2.0*log(r1))*cos(2.0*M_PI*r2)+average_x);
ht[i+1].x[0] = (int)(deviation_x*sqrt(-2.0*log(r1))*sin(2.0*M_PI*r2)+average_x);
//y座標
r1 = (double)rand()/RAND_MAX;
r2 = (double)rand()/RAND_MAX;
ht[i].x[1] = (int)(deviation_y*sqrt(-2.0*log(r1))*cos(2.0*M_PI*r2)+average_y);
ht[i+1].x[1] = (int)(deviation_y*sqrt(-2.0*log(r1))*sin(2.0*M_PI*r2)+average_y);
sum_x+=ht[i].x[0]+ht[i+1].x[0];//平均
sum_y+=ht[i].x[1]+ht[i+1].x[1];
sum2_x=(ht[i].x[0]-average_x)*(ht[i].x[0]-average_x)+(ht[i+1].x[0]-average_x)*(ht[i+1].x[0]-average_x);//標準偏差
sum2_y=(ht[i].x[1]-average_y)*(ht[i].x[1]-average_y)+(ht[i+1].x[1]-average_y)*(ht[i+1].x[1]-average_y);
}
/*
for(i=0;i<1000;i+=2){
ht[i].x[0] = ht[i].x[0] - Lh - L/2;
ht[i+1].x[0] = ht[i+1].x[0] - Lh - L/2;
sum_x+=ht[i].x[0]+ht[i+1].x[0];//平均
}
*/
/*
for(i=0;i<1000;i++){
printf("%d %.lf %.lf\n",i,ht[i].x[0],ht[i].x[1]);
}
*/
/*
printf("x_average=%lf\ny_average=%lf\n",sum_x/1000,sum_y/1000);//平均
printf("x_deviation=%lf\ny_debiation=%lf\n",sqrt(sum2_x/1000),sqrt(sum2_y/1000));//標準偏差
*/
}
//地代計算
void home_price(struct home h[],struct home_temp ht[],struct company c[]){
int x,y,i,j,k;
double A=30000*140*100;//地代係数η*1世帯面積50(*100先行研究と実際数の差×)(代わりに移動費+*1000or先行研究と今の設定面積の差)
double H=100; //会社地代の重み=2
for(j=0;j<(Yh-Yl)/100;j++){
for(k=0;k<(Xh-Xl)/100;k++){
home_dencity[j][k]=0;
com_dencity[j][k]=0;
}
}
//homeの密度計算
for(i=0;i<NUM_HOME;i++){
for(j=0,y=Yl ; y<=Yh ; j++,y+=100){
if(y<=h[i].x[1] && h[i].x[1]<y+100){
for(k=0,x=Xl ; x<=Xh ; k++,x+=100){
if(x<=h[i].x[0] && h[i].x[0]<x+100){
home_dencity[j][k]++;
//printf("%d %d h%d \n",j,k,home_dencity[j][k]);
}
}
}
}
}
//comの密度計算
for(i=0;i<NUM_COMPANY;i++){
for(j=0,y=Yl ; y<=Yh ; j++,y+=100){
if(y<=c[i].x[1] && c[i].x[1]<y+100){
//printf("%d %d com%d \n",j,k,com_dencity[j][k]);
for(k=0,x=Xl ; x<=Xh ; k++,x+=100){
if(x<=c[i].x[0] && c[i].x[0]<x+100){
com_dencity[j][k]++;
//printf("%d %d com%d \n",j,k,com_dencity[j][k]);
}
}
}
}
}
//転居候補の地代算出
for(i=0;i<1000;i++){ //i= 100エージェント*10箇所
for(j=0,y=Yl ; y<=Yh ; j++,y+=100){
if(y<=ht[i].x[1] && ht[i].x[1]<y+100){
for(k=0,x=Xl ; x<=Xh ; k++,x+=100){
if(x<=ht[i].x[0] && ht[i].x[0]<x+100){
ht[i].price = A*(home_dencity[j][k]+H*com_dencity[j][k])/10000;//地代(仮転居先)
//fprintf(fp8,"%d %lf \n",i,ht[i].price);
}
}
}
}
}
//自宅位置の地代算出
for(i=0;i<NUM_HOME;i++){
for(j=0,y=Yl ; y<=Yh ; j++,y+=100){
if(y<=h[i].x[1] && h[i].x[1]<y+100){
for(k=0,x=Xl ; x<=Xh ; k++,x+=100){
if(x<=h[i].x[0] && h[i].x[0]<x+100){
h[i].price = A*(home_dencity[j][k]+H*com_dencity[j][k])/10000;//地代(自宅)
//fprintf(fp8,"%d %lf \n",i,ht[i].price);
}
}
}
}
}
}
//転居先選択
void select_home(struct home h[],struct home_temp ht[],int counter,FILE *fp8){
int i,j;
double best=99999999;
int best_num;
for(i=counter;i<counter+100;i++){//h[]:エージェント番号,ht[]:一の位・十の位
best=99999999;
for(j=0;j<1000;j+=100){//百の位
if(ht[(i-counter)+j].price<best){
h[i].x[0]=ht[(i-counter)+j].x[0];
h[i].x[1]=ht[(i-counter)+j].x[1];
best=ht[(i-counter)+j].price;
best_num=(i-counter)+j;
}
}
fprintf(fp8,"%d %.0lf %d\n",i,best,best_num);//エージェント番号 転居コスト
}
//fprintf(fp8,"\ncycle\n");
}
//モビリティマネジメント
void mobility_management(struct agent a[]){
int i,j;
int counter=0;
int q;
for(i=0;i<NUM_AGENT;i++){
if(a[i].t.route_num==3 || a[i].t.route_num==5){
counter++;
}
}
//○%を自動車利用から電車利用へ
counter *= MM;
for(i=0;i<NUM_AGENT;i++){
if(a[i].t.route_num==3 || a[i].t.route_num==5){
if(counter > 0){
counter--;
a[i].t.route_num = 0;
j=0;
q=0;
while(q != 100){
q = route[a[i].t.route_num][j];
a[i].t.unit[j] = q;
j++;
}
}
}
}
}
//会社(目的地)初期化
void setup_company(struct company c[]){
int i,j,k,l,n;
double m=L/2; // 平均m=Lb
double sigma=Lb/5.0; // 標準偏差σ=2*Lb/10
double r1,r2;
double limit;
double x_sum=0,y_sum=0,sum2_x=0,sum2_y=0;
FILE *fp5;
for(i=0;i<NUM_COMPANY;i+=2){
//x座標
r1 = (double)rand()/RAND_MAX;
r2 = (double)rand()/RAND_MAX;
c[i].x[0] = (int)(sigma*sqrt(-2.0*log(r1))*cos(2.0*M_PI*r2)+m);
c[i+1].x[0] = (int)(sigma*sqrt(-2.0*log(r1))*sin(2.0*M_PI*r2)+m);
//y座標
r1 = (double)rand()/RAND_MAX;
r2 = (double)rand()/RAND_MAX;
c[i].x[1] = (int)(sigma*sqrt(-2.0*log(r1))*cos(2.0*M_PI*r2));
c[i+1].x[1] = (int)(sigma*sqrt(-2.0*log(r1))*sin(2.0*M_PI*r2));
x_sum+=c[i].x[0]+c[i+1].x[0];//平均
y_sum+=c[i].x[1]+c[i+1].x[1];
sum2_x=(c[i].x[0]+2000)*(c[i].x[0]+2000)+(c[i+1].x[0]+2000)*(c[i+1].x[0]+2000);//標準偏差
sum2_y=c[i].x[1]*c[i].x[1]+c[i+1].x[1]*c[i+1].x[1];
}
/*
for(i=0;i<NUM_COMPANY;i+=2){
c[i].x[0] = c[i].x[0] - Lb + L/2;
c[i+1].x[0] = c[i+1].x[0] - Lb + L/2;
x_sum+=c[i].x[0]+c[i+1].x[0];//平均
}
*/
/*
for(i=0;i<NUM_COMPANY;i++){
printf("%d %f %f \n",i,c[i].x[0], c[i].x[1]);
}
printf("x_average=%lf\ny_average=%lf\n",x_sum/NUM_COMPANY,y_sum/NUM_COMPANY);//平均
printf("x_deviation=%lf\ny_debiation=%lf\n",sqrt(sum2_x/NUM_COMPANY),sqrt(sum2_y/NUM_COMPANY));//標準偏差
*/
//分布図
if((fp5 = fopen("business.csv", "w")) == NULL) {
printf("file open error!!\n");
exit(EXIT_FAILURE);
}
for(i=0;i<NUM_COMPANY;i++){
fprintf(fp5,"%d %.0lf %.0lf\n",i,c[i].x[0],c[i].x[1]);
}
}
//駐輪場,駐車場初期化
void setup_park_lot(struct parking p[], struct bikelot l[], struct stationlot sl){
int i,j,k,o,n;
double m=L/2; // 平均m=Lb
double sigma=Lb/5.0; // 標準偏差σ=2*Lb/10
double r1,r2;
double limit;
double x_sum=0,y_sum=0,sum2_x=0,sum2_y=0;
for(i=0;i<NUM_PARKING;i+=2){
//x座標
r1 = (double)rand()/RAND_MAX;
r2 = (double)rand()/RAND_MAX;
p[i].x[0] = (int)(sigma*sqrt(-2.0*log(r1))*cos(2.0*M_PI*r2)+m);
p[i+1].x[0] = (int)(sigma*sqrt(-2.0*log(r1))*sin(2.0*M_PI*r2)+m);
//y座標
r1 = (double)rand()/RAND_MAX;
r2 = (double)rand()/RAND_MAX;
p[i].x[1] = (int)(sigma*sqrt(-2.0*log(r1))*cos(2.0*M_PI*r2));
p[i+1].x[1] = (int)(sigma*sqrt(-2.0*log(r1))*sin(2.0*M_PI*r2));
x_sum+=p[i].x[0]+p[i+1].x[0];//平均
y_sum+=p[i].x[1]+p[i+1].x[1];
sum2_x=(p[i].x[0]+2000)*(p[i].x[0]+2000)+(p[i+1].x[0]+2000)*(p[i+1].x[0]+2000);//標準偏差
sum2_y=p[i].x[1]*p[i].x[1]+p[i+1].x[1]*p[i+1].x[1];
x_sum+=l[i].x[0]+l[i+1].x[0];//平均
y_sum+=l[i].x[1]+l[i+1].x[1];//平均
sum2_x=(l[i].x[0]+2000)*(l[i].x[0]+2000)+(l[i+1].x[0]+2000)*(l[i+1].x[0]+2000);//標準偏差
sum2_y=l[i].x[1]*l[i].x[1]+l[i+1].x[1]*l[i+1].x[1];
}
for(i=0;i<NUM_BIKELOT;i+=2){
//x座標
r1 = (double)rand()/RAND_MAX;
r2 = (double)rand()/RAND_MAX;
l[i].x[0] = (int)(sigma*sqrt(-2.0*log(r1))*cos(2.0*M_PI*r2)+m);