【发布时间】:2015-01-02 02:14:38
【问题描述】:
我正在尝试构建一个包含三个主要事件的交通模拟器:
- 光线变化
- 一辆车进入十字路口
- 一辆车离开路口
程序应根据用户输入输出事件组合...但由于某种原因,它无法正常工作。输出会重复输出一个事件(例如arriveeast),或者只输出两个事件,而不是像这样根据用户输入组合几个事件;
arriveeast
arriveeast
arrivenorth
lighteast
等等……
我想知道是否有人会这么好心地指出我忽略了什么?我对此比较陌生,而且我很难找到能从中汲取灵感的人。我认为循环失败了,但我看不到如何/在哪里,也没有收到错误消息...
using System;
using System.Collections;
namespace sim
{
public static class Simulation
{
public static void Main()
{
double average; // average of all trials
double interArrivalEast, interArrivalNorth; // Arrival times between cars coming from East and North
double onTimeEast, onTimeNorth, onTimeBoth; // Green light on times for East and North lights as well as both lights
double lastLeaveEast, lastLeaveNorth; // Last time a car left from the East and North
double totalTime; // Total time for all events to occur
double sum = 0;
double u; // Uniformly distributed random variable
int numEvents; // Total number of events possible
Event temp = new Event("", 0);
Random rand1; // Random seed
PriorityQueue<Event> events; // Priority queue of events
Queue east, north; // Queue of cars approaching from the East and North
bool eastLight, northLight;
east = new Queue();
north = new Queue();
rand1 = new Random();
Console.Write("Please enter the inter-arrival time for cars approaching from the East: ");
interArrivalEast = -(Convert.ToDouble(Console.ReadLine()) * Math.Log(u = rand1.NextDouble()));
Console.Write("Please enter the inter-arrival time for cars approaching from the North: ");
interArrivalNorth = -(Convert.ToDouble(Console.ReadLine()) * Math.Log(u));
Console.Write("Please enter the green light on time for cars approaching from the East: ");
onTimeEast = Convert.ToDouble(Console.ReadLine());
Console.Write("Please enter the green light on time for cars approaching from the North: ");
onTimeNorth = Convert.ToDouble(Console.ReadLine());
onTimeBoth = onTimeEast + onTimeNorth;
numEvents = Convert.ToInt32((interArrivalEast * 50 / onTimeEast) + (interArrivalNorth * 50 / onTimeNorth) + (onTimeEast * 50 / 3) + (onTimeNorth * 50 / 3) + 100);
events = new PriorityQueue<Event>(numEvents);
totalTime = ((50 * onTimeEast) + (50 * onTimeNorth));
for (double i = 0; i < totalTime; i += interArrivalEast)
{
events.Add(new Event("arriveeast", i));
}
for (double j = 0; j < totalTime; j += interArrivalNorth)
{
events.Add(new Event("arrivenorth", j));
}
for (double k = 0; k < totalTime; k += onTimeBoth)
{
events.Add(new Event("lighteast", k));
for (double l = k; l < k + onTimeBoth; l += 3)
events.Add(new Event("leaveeast", l));
}
for (double m = onTimeEast; m < totalTime; m += onTimeBoth)
{
events.Add(new Event("lightnorth", m));
for (double n = m; n < m + onTimeBoth; n += 3)
events.Add(new Event("leavenorth", n));
}
for (int o = 0; o < 1000; o++)
{
while (!events.Empty())
{
temp = events.Front();
switch (temp.EType)
{
case "arriveeast":
east.Enqueue(temp.Time);
break;
case "arrivenorth":
north.Enqueue(temp.Time);
break;
case "leaveeast":
east.Dequeue();
break;
case "leavenorth":
north.Dequeue();
break;
case "lighteast":
eastLight = true;
northLight = false;
break;
case "lightnorth":
northLight = true;
eastLight = false;
break;
}
Console.WriteLine("{0} {1}", Convert.ToString(o), temp.EType);
events.Remove();
}
sum += temp.Time;
}
average = sum / 1000;
Console.WriteLine(Convert.ToString(average));
Console.ReadKey();
【问题讨论】:
-
Too.. much.. code...请将代码缩小到损坏的部分并准确描述什么“不起作用”。
-
哎呀。对不起,试图缩小它。害怕没有提供足够的信息。
-
我可以理解这一点,但我通常不想阅读整个程序来找到一个函数中的错误:)。
-
缩小规模是好的,但仍然需要一个完整的、可调试的代码示例。见stackoverflow.com/help/mcve
-
进一步缩小范围的方法是不要试图保留你的程序打算做的事情——用存根替换不是问题的部分(例如:用常量替换用户输入)所以你有一个更短的程序,但仍然证明了问题,即使它对任何事情都没有用。这样做也可以帮助您自己理解问题。