Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Igors от Февраль 24, 2016, 13:35



Название: Симпатичная задачка
Отправлено: Igors от Февраль 24, 2016, 13:35
Добрый день

Между пунктами A и B есть путь - рельсы по которым поезда могут ходить только в одну сторону. Т.е. напр 10 (или сколько угодно) поездов могут одновременно ехать из A в B, но движение в противоположную сторону может начаться только когда все они прибудут в B и путь освободится.

Нужно написать симулятор такого движения поездов, учитывая при этом что какое-то время возможна перегрузка. Напр новые и новые поезда прибывают в A извне и теперь все время едут в B, путь занят и поезда из В в A придется ждать хз сколько долго. Эта ситуация должна разруливаться, как - Ваше дело

[off]
Не, наверное сложновато для детей ассыстентского подземелья... Ну посмотрим..
[/off]


Название: Re: Симпатичная задачка
Отправлено: ViTech от Февраль 24, 2016, 14:36
Решение тривиальное: если на пути нет встречного поезда, то поезд может выезжать из своего пункта. Если поезда прибывают в А извне и все время едут в В, то и пускай едут. А поезда в В пускай стоят, судьба у них такая. Это если исходить из текущей постановки задачи. И не понятно, какую тут ситуацию разруливать нужно. Но подозреваю, что скоро подтянутся дополнительные требования, типа обеспечить равномерное движение поездов, не допускать застаивания поездов в В и т.п.


Название: Re: Симпатичная задачка
Отправлено: kambala от Февраль 24, 2016, 14:43
звучит как стандартная задача СМО


Название: Re: Симпатичная задачка
Отправлено: qate от Февраль 24, 2016, 15:29
а почему на такой оживленной линии только одни рельсы ? )


Название: Re: Симпатичная задачка
Отправлено: Racheengel от Февраль 24, 2016, 17:09
do{

while (!railway.isEmpty())
{
  B.trains.wait();
  A.trains.go();
}

B.trains.go();

while (!railway.isEmpty())
{
  A.trains.wait();
  B.trains.go();
}

} while (!raiway.isExploded());



Название: Re: Симпатичная задачка
Отправлено: Old от Февраль 24, 2016, 17:18
Здесь смысл как раз в том, что бы разрулить непрерывный поток поездов из одной точки в другую. Через какое то время нужно приостановить этот поток, дождаться его завершения и запустить реверсное движение.


Название: Re: Симпатичная задачка
Отправлено: Bepec от Февраль 24, 2016, 17:50
Если так посудить, то накапливание и последующий коллапс неостановим :) Ибо пропускная способность будет ниже нужной :)


Название: Re: Симпатичная задачка
Отправлено: Racheengel от Февраль 24, 2016, 19:07
Здесь смысл как раз в том, что бы разрулить непрерывный поток поездов из одной точки в другую. Через какое то время нужно приостановить этот поток, дождаться его завершения и запустить реверсное движение.

Дополнительно, если движение из А в В не закончилось, и в В еще не собралось ни одного поезда (чтоб ехать из В в А), то это время нужно будет продлить (чтоб путь зря не простаивал).

Либо же забить на время и, как только появился поезд на ожидании в пункте назначения (В), прекращать движение из А в В, а как только все поезда приедут, пускать движение из В в А. И теперь ждать, пока не появится поезда в А. И т.д.


Название: Re: Симпатичная задачка
Отправлено: ViTech от Февраль 24, 2016, 19:25
Это уже домыслы пошли, про время, очереди, переполнения и так далее :). А если в пункт А/В прибудет литерный поезд, и надо его по пути вне очереди пропустить? ;) А если диверсанты рельсы подорвали, и надо ремонтную бригаду отправлять? К исходной постановке задачи теперь много всего интересного додумать можно :).


Название: Re: Симпатичная задачка
Отправлено: Racheengel от Февраль 24, 2016, 19:49
А если в пункт А/В прибудет литерный поезд, и надо его по пути вне очереди пропустить? ;)

Литерный - это с синей мигалкой? :) Будет стоять, пока дорога не освободится. А то ишь, без очереди как всем хочется :)

А если диверсанты рельсы подорвали, и надо ремонтную бригаду отправлять?

А это я уже предусмотрел :)

while (!raiway.isExploded());


Название: Re: Симпатичная задачка
Отправлено: Igors от Февраль 25, 2016, 04:53
Ну давайте начнем писать симулятор
Код
C++ (Qt)
void MyThread::run( void )
{
 while (true) {
   int direction = (qrand() % 2) ? 0 : 1;   // напр-е движения: поезд из A в B или наоборот
   RunTrain(direction);
   QThread::msleep(qrand() % 100);   // случайная задержка, потом новый поезд
 }
}
И запускаем напр 50 таких ниток. И вот они должны ходить и не пересекаться. Можно заводить любые переменные и примитивы синхронизации. Ну вот, осталось только написать RunTrain :)

Решение тривиальное: если на пути нет встречного поезда, то поезд может выезжать из своего пункта. Если поезда прибывают в А извне и все время едут в В, то и пускай едут. А поезда в В пускай стоят, судьба у них такая. Это если исходить из текущей постановки задачи.
Ну если "тривиальное" - милости просим с реализацией :)
И не понятно, какую тут ситуацию разруливать нужно.
Вот эту самую
учитывая при этом что какое-то время возможна перегрузка. Напр новые и новые поезда прибывают в A извне и теперь все время едут в B, путь занят и поезда из В в A придется ждать хз сколько долго.
Здесь смысл как раз в том, что бы разрулить непрерывный поток поездов из одной точки в другую. Через какое то время нужно приостановить этот поток, дождаться его завершения и запустить реверсное движение.
Да, совершенно верно. Только точнее "в какой-то момент" или "при каких-то условиях". Через какое-то время можно понять как "раз в час"


Название: Re: Симпатичная задачка
Отправлено: Igors от Февраль 26, 2016, 07:12
Ну вот, я так и знал - пошумели маленько, и тишина... Готовых классов нет - и сразу приплыли  :)

Ладно, чуть копнем. На первый взгляд может показаться что "если поезда прибывают чаще чем успевают пройти" - то через некоторое время крах системы неизбежен, не хватает пропускной способности. В действительности это не так - ведь N поездов (в одном напр-и) проходят за то же время что и один.


Название: Re: Симпатичная задачка
Отправлено: Авварон от Февраль 26, 2016, 13:01
Как же ты заебал с "готовыми классами"


Название: Re: Симпатичная задачка
Отправлено: Old от Февраль 26, 2016, 13:24
Как же ты заебал с "готовыми классами"
Не мешайте человеку тешить свое самолюбие. Он для этого такие темы и создает - "по-финдреплейсить". :)

Вы ему лучше предложите сделать что-то посложней (хотя-бы со строками поработать без QString) - спесь (как и человек) тут-же исчезнут из темы. :)


Название: Re: Симпатичная задачка
Отправлено: Авварон от Февраль 26, 2016, 13:33
Не мешайте человеку тешить свое самолюбие. Он для этого такие темы и создает - "по-финдреплейсить". :)

Вы ему лучше предложите сделать что-то посложней (хотя-бы со строками поработать без QString) - спесь (как и человек) тут-же исчезнут из темы. :)

К сожалению, мне не платят за придумывание псевдоакадемических задачек:) А те, что решаются с "готовыми классами" по работе плохо абстрагируются для форума.


Название: Re: Симпатичная задачка
Отправлено: Igors от Февраль 26, 2016, 14:46
Как же ты заебал с "готовыми классами"
Не мешайте человеку тешить свое самолюбие.
Ну и чего бьемся в бессильной злобе? :) Неужели у таких "сеньоров" трудности со студенческой лабой? Не может быть, ведь они знают так много классов  :)


Название: Re: Симпатичная задачка
Отправлено: Old от Февраль 26, 2016, 14:52
Неужели у таких "сеньоров" трудности со студенческой лабой?
У нас нет. А у вас? :)

Не может быть, ведь они знают так много классов  :)
Зависть плохое чувство. :)


Название: Re: Симпатичная задачка
Отправлено: Авварон от Февраль 26, 2016, 17:00
Неужели у таких "сеньоров" трудности со студенческой лабой?
Даже не читал. Если у меня появится свободное время, я пойду займусь своим проектом. Или на гитаре поиграю.