forループ内では、車両の情報を取得して処理することにより、シミュレーションステップベースの交通シミュレータSUMOを制御しています。プログラムが「リアルタイム」(1シミュレーションステップ= 1秒)でシミュレートすることを確認するために、処理フェーズの後、次のタイムステップが始まるまでプログラムをスリープさせたいと思います。より良い結果を得るために、最初に取得した参照タイムスタンプに基づいてタイムスタンプを計算しています。
ループは次のようになります。
System.out.println("start of traffic simulation ...");
for (int i = 0; i < stepCount; i++)
{
System.out.println("step: " + i);
// set before timeStamp
beforeTimeStamp = System.currentTimeMillis();
if (firstStep)
{
// get reference timeStamp
referenceTimeStamp = beforeTimeStamp;
firstStep = false;
}
else
{
// get next vehicleVector
vehicleVector = masterControl.traCIclient.simulateStep();
}
// process vehicleVector
// set after timeStamp
afterTimeStamp = System.currentTimeMillis();
processingTime = afterTimeStamp - beforeTimeStamp;
// calculate sleepTime
sleepTime = referenceTimeStamp + ((i + 1) * 1000) - afterTimeStamp;
// sleep for sleepTime ms
Thread.sleep(sleepTime);
}
System.out.println("end of traffic simulation ...");
いくつかの変数の出力は次のとおりです。
ステップ:0 beforeTimeStamp 1252317242565 基準時間:1252317242565 処理時間:394 テスト時間:1252317243565 afterTimeStamp 1252317242959 sleepTime:606 ステップ1 beforeTimeStamp 1252317242961 処理時間:665 テスト時間:1252317244565 afterTimeStamp 1252317243626 sleepTime:939(検査済み:1000-665 = 335)
ご覧のとおり、スリープ時間は最初のシミュレーションステップでのみ正しいです。ここで何がうまくいかないのかわかりません。誰かアイデアがありますか?
BR、
マーカス