события, происходящие одновременно в симуляторе, управляемом событиями

Я пытался разработать простой событийный симулятор и начал здесь

http://stdcxx.apache.org/doc/stdlibug/11-3.html

Когда я играл с примером с некоторыми модификациями, я столкнулся с условием, когда два события (прибытие, отъезд) происходят одновременно (скажем, во временном блоке 5), тогда симулятор просто выскакивает, что находится в верхней части очередь событий, как видно из приведенного ниже фрагмента кода.

void simulation::run () {

while (! eventQueue.empty ()) {

event * nextEvent = eventQueue.top ();
eventQueue.pop ();
time = nextEvent->time;
nextEvent->processEvent ();
delete nextEvent;
}
}

Если оба события происходят в одно и то же время, как я могу применить условие, которое всегда выдает определенное событие (событие прибытия сначала) перед событием отправления.

Буду признателен за любую оказанную помощь.

2

Решение

Я предполагаю что eventQueue имеет описанный тип Вот (потому что это то, на что ссылается ссылка в вашем вопросе). Оттуда вы можете прочитать, что top()

Возвращает постоянную ссылку на элемент в очереди с наивысшим приоритетом

… и это pop()

Удаляет элемент с наивысшим приоритетом из очереди.

Итак, взяв код из ваших вопросов, наиболее очевидный подход — вывести все события из очереди, которые имеют одинаковое время, и только затем обрабатывать их:

while (! eventQueue.empty ()) {
event * ev = eventQueue.top (); // WHY do you have pointers here ?!?!?
time = ev->time;
some_container<event *> arrivals, departures;
// Take out all events that happen "now" from the queue
while (time == ev->time) {
eventQueue->pop();
if (ev->type == ARRIVAL) {
arrivals.push_back(ev);
} else {
departures.push_back(ev);
}
ev = eventQueue->top();
}
// Process arrivals
for (event * e : arrivals) {
e->processEvent();
delete e; // Again: WTF pointers? raw? NOT a good idea!
}
// Process departures
for (event * e : departures) {
e->processEvent();
delete e;
}
}

… это не идиоматический способ справиться с этим в C ++. Контейнеры (по крайней мере, упорядоченные) в C ++ обычно имеют параметр шаблона, определяющий порядок упорядочения элементов. И так же std::priority_queue:

namespace std {
template <class T,
class Container = vector<T>,
class Compare = less<Container::value_type> >
class priority_queue;
}

Таким образом, лучший подход здесь заключается в создании Всего упорядочить среди всех событий, используя пользовательский объект функции сравнения:

// sigh ... pointers ... raw pointers ... just WHY???!?
template<typename Event>
struct less_event_ptr {
std::less<time_type> time_compare; // time_type hopefully is self-describing ...
bool operator()(Event * lhs, Event * rhs) const {
if (time_compare(lhs->time, rhs>-time)) {
return true;
}
if (time_compare(rhs->time, lhs->time)) {
return false;
}
if (lhs->type == ARRIVAL && rhs->type == DEPARTURE) {
return true;
}
return false;
}
};

Обратите внимание, что для этого Всего Для заказа необходимо быть уверенным, что не будет нескольких прибытий (или отправлений) одновременно. Если будут (возможно) такие обстоятельства, то вам следует (если вы хотите детерминированное моделирование) найти другие свойства (имя? Источник?) Событий, чтобы привести их в порядок.

Ваш eventQueue будет объявлен как

std::priority_queue<event *, std::vector<event *>, less_event_ptr<event>> eventQueue;
5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]