先日と同じシミュレーションでの別分野での質問です。
以下シミュレーションのcarのルールです。
Agt_Init{
dim e as integer ; dim b as double ; dim c as integer ; dim d as double
//--------希望速度分布ここから-------------------------------
b=rnd()
for e=0 to my.ID
my.startTime= getCountStep()/10 // 現在のステップを記録
my.speed= norminv(b,(Universe.d2speed)/360, (universe.sspeed)/360)
my.dspeed=my.speed
my.bure= norminv(rnd(),0, 12)
if my.x == 0.1 then
my.bspeed = my.speed;
end if
next e
//---------------初期設定-------------------------------------------------------
my.X= 0
my.direction=0
my.t1a =100 ; my.t1b=100 ; my.t2a=100 ; my.t2b=100 ; my.t2c=100 ; my.t2d=100 ; my.t2e=100 ; my.t2e=100
}
Agt_Step{
//変数宣言
dim crowd as agtset
dim S1 as agt
dim s4 as agt
dim C1 as integer
dim C2 as integer
dim C3 as integer
dim C4 as integer
dim C5 as integer
dim f1 as integer
dim f2 as integer
dim f3 as integer
dim f4 as integer
dim f5 as integer
dim zensya as agtset
dim oimae as agtset
dim oiusiro as agtset
C1 = 0 ; C2 = 0 ; C3 = 0 ; C4 = 0 ; c5 = 0
f1 = 1 ; f2 = 1 ; f3 = 1 ; f4 = 1 ; f5 = 1
dim zenR as agtset
dim atoR as agtset
my.color=color_white
dim Va as double
dim Vb as double
dim Ea as double
dim Ga as double
dim GB as double
dim GC2 as agt
dim GC3 as agt
dim faiA as double
dim faiB as double
Va=0 ; Vb=0 ; Ea=0
//-----------------追従ここから-----------------------------
dim a as Double ; dim S as Double ; dim P as integer ; dim zen as agtset ; dim V as Long
dim fv as integer ; dim at1 as Double ; dim koubai as double ; dim at2 as Double ; dim koubaipar as double
V=0
S=1
P=0
//-------------------矢板ic付近の勾配入力-------------
if my.X>=22.8 and my.X<=63.5 then
koubai = 0.019221772
koubaipar=-0.557
elseif my.X>=100.6 and my.X<=130.2 then
koubai = -0.10348
koubaipar=3
elseif my.X>=167.2 and my.X<=193.2 then
koubai = 0.08073
koubaipar=-2.34
elseif my.X>=239.5 and my.X<=267.2 then
koubai = 0.0303
koubaipar=-0.878
elseif my.X>=293.2 and my.X<=300.6 then
koubai = 0.05624
koubaipar=-1.63
elseif my.X>=330.2 and my.X<=331.3 then
koubai = -0.08625
koubaipar=2.5
elseif my.X>=419.1 and my.X<=430.2 then
koubai = 0.05003
koubaipar=-1.45
elseif my.X>=463.5 and my.X<=496.9 then
koubai =-0.031575328
koubaipar=0.915
elseif my.X>=522.8 and my.X<=537.6 then
koubai =-0.014148981
koubaipar=0.41
elseif my.X>=578.4 and my.X<=663.5 then
koubai = -0.014148981
koubaipar= 0.41
else
koubai=0
koubaipar=0
end if
//--------------勾配入力ここまで------------------
//---------------前方車両の情報キャッチ
Do Until P >= 1 or S >= 18
forward(S)
makeallAgtSetAroundOwn(zen,1,false)
P=countagtset(zen)
forward(-S)
S= S + 1
Loop
//---------------前方車両の情報キャッチ ここまで
//-----------------追従 フローチャートここから
if P>=1 then//前に車がいる場合
for each S1 in zen//前方車両をs1とする。
if (S1.speed - my.speed) <= 100/360 then //相対速度を求めるための適当な条件
V=( S1.speed - my.speed)*360 //前車との相対速度(aritsocスケール)
end if
S = (S1.X - my.X)*10
fv = 5.373+(0.525*my.speed*360) - ((5.9)*(10^(-3)))* ((my.speed*360)^2) +(6.3*(10^(-5))*((my.speed*360)^3))
fv= fv+ my.bure
//--------------相対距離 相対速度ここまで------------------------------------
//時間遅れを考慮した計算ここから
//----------------時間遅れ 0.2s
if ((S)/(my.speed*100))>6 then
if my.t1a ==100 then // 越論文t1の項
if my.t1b==100 then //初回のみ
at1=0
my.t1b=0.4
else //偶数ターン
at1 = my.t1b
my.t1b=100
my.t1a=0.4
end if
else //奇数ターン
at1=my.t1a
my.t1a=100
my.t1b=0.4
end if
//----------------時間遅れ 0.6s------------------
if my.t2a==100 and my.t2b==100 and my.t2c==100 and my.t2d==100 and my.t2e==100 and my.t2e==100 then
my.t2a=100
my.t2b=0
my.t2c=0
my.t2d=0
my.t2e=0
my.t2f=0
end if
if my.t2a==100 then
at2=my.t2b
my.t2b=100
my.t2a= 0
elseif my.t2b==100 then
at2=my.t2c
my.t2c=100
my.t2b=0
elseif my.t2c==100 then
at2=my.t2d
my.t2d=100
my.t2c=0
elseif my.t2d==100 then
at2=my.t2e
my.t2e=100
my.t2d=0
elseif my.t2e==100 then
at2=my.t2f
my.t2f=100
my.t2e= 0
elseif my.t2f==100 then
at2=my.t2a
my.t2a=100
my.t2f=0
end if
fv=0
V=0
else
if my.t1a ==100 then // 越論文t1の項
if my.t1b==100 then //初回のみ
at1=0
my.t1b=(v)*(universe.arufa) + koubai
else //偶数ターン
at1 = my.t1b
my.t1b=100
my.t1a=(v)*(universe.arufa) + koubai
end if
else //奇数ターン
at1=my.t1a
my.t1a=100
my.t1b=(v)*(universe.arufa) + koubai
end if
if my.t2a==100 and my.t2b==100 and my.t2c==100 and my.t2d==100 and my.t2e==100 and my.t2e==100 then
my.t2a=100
my.t2b=(universe.beta)*(s - fv)
my.t2c=(universe.beta)*(s - fv)
my.t2d=(universe.beta)*(s - fv)
my.t2e=(universe.beta)*(s - fv)
my.t2f=(universe.beta)*(s - fv)
end if
if my.t2a==100 then
at2=my.t2b
my.t2b=100
my.t2a= (universe.beta)*(s - fv)
elseif my.t2b==100 then
at2=my.t2c
my.t2c=100
my.t2b=(universe.beta)*(s - fv)
elseif my.t2c==100 then
at2=my.t2d
my.t2d=100
my.t2c= (universe.beta)*(s - fv)
elseif my.t2d==100 then
at2=my.t2e
my.t2e=100
my.t2d=(universe.beta)*(s - fv)
elseif my.t2e==100 then
at2=my.t2f
my.t2f=100
my.t2e= (universe.beta)*(s - fv)
elseif my.t2f==100 then
at2=my.t2a
my.t2a=100
my.t2f=(universe.beta)*(s - fv)
end if
end if
break
next S1
else //前に車がいない場合
if my.t1a ==100 then // 越論文t1の項
if my.t1b==100 then //初回のみ
at1=0
my.t1b=0.4
else //偶数ターン
at1 = my.t1b
my.t1b=100
my.t1a=0.4
end if
else //奇数ターン
at1=my.t1a
my.t1a=100
my.t1b=0.4
end if
if my.t2a==100 and my.t2b==100 and my.t2c==100 and my.t2d==100 and my.t2e==100 and my.t2e==100 then
my.t2a=100
my.t2b=0
my.t2c=0
my.t2d=0
my.t2e=0
my.t2f=0
end if
if my.t2a==100 then
at2=my.t2b
my.t2b=100
my.t2a= 0
elseif my.t2b==100 then
at2=my.t2c
my.t2c=100
my.t2b=0
elseif my.t2c==100 then
at2=my.t2d
my.t2d=100
my.t2c=0
elseif my.t2d==100 then
at2=my.t2e
my.t2e=100
my.t2d=0
elseif my.t2e==100 then
at2=my.t2f
my.t2f=100
my.t2e= 0
elseif my.t2f==100 then
at2=my.t2a
my.t2a=100
my.t2f=0
end if
fv=0
s=0
end if
//ここまで--------------------------------------
a= at1+at2 //m/ss
if a<= -4.5 then //最低加速度=-4.5m/ss
a=-4.5
end if
if a>= 3.0 then //最高加速度=3m/ss
a=3.0
end if
my.speed = a*0.1 + my.speed*100 // m/s
my.speed=my.speed/100//(単位 artisoc
if my.speed>=my.dspeed then //希望速度をオーバーした場合、希望速度に戻る。
my.speed=my.dspeed
end if
if (My.Speed <= 0) then//速度がマイナスになるのを防止
My.Speed = 0
end if
if my.Y==1 then // 設定した加速度で前に進むよう指示
forward(my.speed)
else
forward(my.speed)
end if
//-----------------追従ここまで-----------------
//走→追モデルここから----------------------------------------------------------------------
if my.Y>=3 and my.X>10 then //走行車線にいる場合
my.Y=3
my.Direction=0
//前方調査
Do Until C1 >= 1 or f1 >= 8
forward(f1)
makeallAgtSetAroundOwn(zensya,1,false)
C1=countagtset(zensya)
forward(-f1)
f1 = f1 + 1
Loop
Turn(-90)
forward(2)
Turn(90)
Do Until C2 >= 1 or f2 > 7//追・前方調査
forward(f2)
makeallAgtSetAroundOwn(oimae,1,false)
C2=countagtset(oimae)
forward(-f2)
f2 = f2 + 1
Loop
Do Until C3 >= 1 or f3 > 25 //追・後方調査
forward(-f3)
makeallAgtSetAroundOwn(oiusiro,1,false)
C3=countagtset(oiusiro)
forward(f3)
f3 = f3 + 1
Loop
Turn(-90)
forward(-2)
Turn(90)
if c2==0 then
GA=1000
faiA=0
end if
if c3==0 then
GB=1000
faiB=0
end if
for each Gc2 in oimae
GA= (Gc2.x-my.X)*10
faiA = ((Gc2.speed*100) - (my.speed*100))/Ga
break
next Gc2
for each Gc3 in oiusiro
GB=(my.X - Gc3.x)*10
faiB=((my.speed*100) - (Gc3.speed*100))/GB
break
next Gc3
if C1 >= 1 and c2==0 and c3==0 then //-------------------------------------------------------------------
for each s1 in zensya
Va = -5.89*((10^(-2))*(S1.x-my.X)*10) - 0.31*(my.speed*100 -my.dspeed*100 )+ (0.767*koubaipar)
Vb = -0.227
Ea = (Exp(Va)) / (Exp(Va) + Exp(Vb))
if rnd() <= Ea and (my.speed*360 - my.dspeed*360) <= -5 then
my.Direction = -10
else
end if
break
next s1
elseif c1>=1 and Ga>50 and Gb>100 then //---------
for each s1 in zensya
Va = -5.89*((10^(-2))*(S1.x-my.X)*10) - 0.31*(my.speed*100 -my.dspeed*100) + (0.767*koubaipar)
Vb = -0.227
Ea = (Exp(Va)) / (Exp(Va) + Exp(Vb))
if rnd() <= Ea and (my.speed*360 - my.dspeed*360) <= -5 and (faiA + faiB) >0 then
my.Direction = -10
else
end if
break
next s1
else
end if
//追→走 モデルここから----------------------------------
elseif my.Y<=1 and my.X>10 then
my.Y=1
my.direction=0
//横調査
Turn(90)
forward(2)
Turn(-90)
//走・前方調査
Do Until C4 >= 1 or f4 > 20
forward(f4)
makeallAgtSetAroundOwn(zenR,1,false)
C4=countagtset(zenR)
forward(-f4)
f4 = f4 + 1
Loop
//走・後方調査
Do Until C5 >= 1 or f5 > 20
forward(-f5)
makeallAgtSetAroundOwn(atoR,1,false)
C5=countagtset(atoR)
forward(f5)
f5 = f5 + 1
Loop
Turn(90)
forward(-2)
Turn(-90)
if c4==0 then
GA=1000
faiA=0
end if
if c5==0 then
GB=1000
faiB=0
end if
for each Gc2 in zenR
GA= (Gc2.x-my.X)*10
faiA = ((Gc2.speed*100) - (my.speed*100))/Ga
break
next Gc2
for each Gc3 in atoR
GB=(my.X - Gc3.x)*10
faiB=((my.speed*100) - (Gc3.speed*100))/GB
break
next Gc3
//場合分け
if (my.dspeed - my.speed) <= 3/360 then
if GA>200 and GB>81 then
my.Direction = 5
elseif GA>100 and GB>81 and (faiB) >=0 then
my.Direction = 5
else
my.Direction=0
end if
else
my.Direction=0
end if
else //追と走の間にいる場合
end if
//--------------6kmカウンターここから-----------------------------
if (getCountStep())>6000 then //カウント開始時刻
if my.X<300 and my.X>50 then
if my.passcard>=1 then
else
my.passcard=1
end if
elseif my.X>=399 and my.passcard>=1 then
my.passcard=0
universe.flowRate=universe.flowRate+1
if my.Y>2 then
universe.flowRateL=universe.flowRateL+1
openfilecsv("outputL.csv",2,3)
writefilecsv(2, my.startTime, false) // シミュレーション開始時刻を出力
writefilecsv(2,getcountstep()/10,false)
writefilecsv(2,1,false)
writefilecsv(2,(my.bspeed)*360,false)
writefilecsv(2,(my.speed)*360,false)
writefilecsv(2,(my.dspeed)*360,true)
closefilecsv(2)
else
universe.flowRater=universe.flowRateR+1
openfilecsv("outputR.csv",2,3)
writefilecsv(2, my.startTime, false) // シミュレーション開始時刻を出力
writefilecsv(2,getcountstep()/10,false)
writefilecsv(2,1,false)
writefilecsv(2,(my.bspeed)*360,false)
writefilecsv(2,(my.speed)*360,false)
writefilecsv(2,(my.dspeed)*360,true)
closefilecsv(2)
end if
else
end if
else
end if
my.d3speed=(my.speed)*360//シミュレーション実行用画面のエージェントに記載する速度 d3speed
if my.X>=690 then//6.9km地点でエージェントを消す
delAgt(my)
end if
if a<-0.1 then //減速すると、エージェントの色が赤に変化
my.color=color_red
end if
}
の部分で出発直後の速度(X=1m地点)での速度を出力したいのですが、値が0で出力されてしまいます。X=0にした場合はmy.dspeedと同じ値が出力されますが、Xを指定してその時点での速度を出力するにはどのように修正すればよろしいでしょうか?
おわかりいただければ、回答お願い致します。
xが実数であれば、ぴったりX=1m地点にならないので、幅を持った判定にするなり、整数で変換して反映するなりすればよいと思います。
なお、モデルを送付する場合は、zipにまとめて添付いただけると幸いです。