Wolfram-Math-in-Logistics: Маятниковые маршруты

от автора

LogoКак и обещал в своём прошлом посте (тут), что в случае если он будет «принят», я продолжаю цикл статей об использовании Wolfram Mathematica для решения небольших прикладных задач в логистике. Жаль только читатели поскупились на комментарии.
Сегодня мы рассмотрим маятниковые маршруты. Мы будем преследовать две цели: с одной стороны рассмотрим три вида маятниковых маршрутов, а именно маятниковый маршрут с холостым обратным пробегом, с не полностью груженым обратным пробегом, с полностью груженым обратным пробегом, и их технико-эксплуатационные показатели, с другой рассмотрим как можно автоматизировать расчёт этих показателей, дабы избавить себя от излишнего вбивания чисел в калькулятор. Трудно сказать насколько такая автоматизация эффективна и полезна, но работать над этим было по крайней мере интересно.
Под катом много картинок, но не бойтесь, их общий вес около 640 КБ. Как говорил один советский летчик-космонавт «Поехали!».

Думаю все понимают что такое маршруты и почему они называются маятниковыми. Всем будут понятны показатели этих маршрутов: длина маршрута, груженный пробег, холостой пробег и тп. Единственное, что может вызвать непонимание это определения оборота и ездки, где:

  • оборот автомобиля — законченный цикл движения, т.е. движение от начального до конечного пункта и обратно;
  • ездка — цикл транспортного процесса, т.е. движение от начального до конечного пункта.

Маятниковый маршрут с обратным холостым пробегом

Первым делом необходимо взглянуть на схематическое изображение подобного маршрута, чтобы иметь представление о том, с чем имеем дело. Для этого построим граф. Граф, он же Graph в Mathematica, идеально подходит для такого рода задачи, когда нужно отобразить несколько грузопунктов и соединить их линиями, длина которых нам сейчас не важна.

Хорошо, но совершенно не ясно где какой грузопункт и не ясно что значат эти стрелки. При помощи EdgeLabels и VertexLabels, названия которых говорят сами за себя, добавим текст в наш граф.

Уже лучше, но внешне выглядит не похоже на маятниковый маршрут, пора изменить это. Параметр GraphLayout с значением CircularEmbedding позволяет нам «закрутить» граф.

ImagePadding необходим для того, что бы весь текст помещался в рамки отображения графа. Отлично, остаётся только добавить красок и навести марафет.

Теперь, когда у нас перед глазами образец, рассчитаем показатели данного вида маршрута.

Дано

Решение

1. Определяем время оборота автомобиля на маршруте, ч:

2. Определяем количество оборотов за время работы автомобиля на маршруте:

3. Определяем возможную массу груза, перевозимую автомобилем за день, т:

4. Определяем необходимое количество автомобилей для перевозки 320т. груза:

5. Определяем коэффициент использования пробега:

Маятниковый маршрут с не полностью груженым обратным пробегом

Попробуем нарисовать граф. Почему попробуем? Потому что мне так и не удалось довести его до такого состояния, когда автоматически выводится граф в готовом виде. И только при помощи рук возможно отобразить его в необходимом виде. Что имеем:

Надеюсь что более продвинутые в Wolfram Mathematica пользователи помогут мне получить необходимый результат.

Дано

Решение

1. Определяем время оборота автомобиля, ч:

2. Определяем количество оборотов:

3. Определяем количество ездок:

4. Определяем производительность автомобиля, т:

5. Определяем необходимое количество автомобилей:

6. Определяем коэффициент использования пробега за 1 оборот:

Маятниковый маршрут с полностью груженым обратным пробегом

С построением этого графа проблем не возникло:

Дано

Решение

1. Определяем время оборота автомобиля, ч:

2. Определяем количество оборотов и ездок:

3. Объём перевозки груза, т:

4. Необходимое количество автомобилей для перевозки грузов:

5. Определяем коэффициент использования пробега за один день:

Автоматизация расчёта показателей маятниковых маршрутов

Проделано не мало работы, но какой в ней смысл, если большая часть формул считается на калькуляторе за полминуты? Поэтому мы не остановимся на достигнутом и пойдём дальше. Мы создадим интерфейс, который будет за нас считать все показатели, наше дело только «скормить» ему исходные данные.
Начнём с простого, а именно с поля ввода (оно же и поле вывода результата):

Отлично, но непонятно что следует вводить или что выводится в этом поле. При помощи Row создаём строку, состоящую уже из нескольких элементов:

Поле вывода будет соответственно содержать в себе некую расчётную формулу, например:

Скомпонуем несколько таких полей для ввода и вывода:

Я думаю в структуре компоновки легко разобраться. Множество Row выстраиваются в колонки Column. Сами строки чередуются с описанием для них, простые строки. Style позволяет присвоить тексту какой-нибудь цвет, вроде Brown, Gray и тп. Результат выглядит так:

Упакуем всю структуру сначала в Panel, чтобы получить рамку, а затем ещё и в Style, чтобы получить возможность изменять оформление полей, а точнее их размер:

Но и это не всё. Всю полученную структуру помещаем в DynamicModule[{Локальные переменные}, Deploy[]]. Очевидно, что это позволит нам создать набор локальных переменных, полностью изолировать структуру от любых расчётов вне её. Такая структура будет легко переносима или легко импортируется из одного блокнота в другой. Результат:

Окончательный внешний вид

Автопоказатели для маятникового маршрута с обратным холостым пробегом

Исходный код

Внешний вид

Автопоказатели для маятникового маршрута с не полностью груженым обратным пробегом

Исходный код

Внешний вид

Автопоказатели для маятникового маршрута с полностью груженым обратным пробегом

Исходный код

Внешний вид

Используемая литература

Неруш Ю. М. Логистика: учеб. — 4-е изд., перераб. и доп. — М.: ТК Велби, H54 Изд-во Проспект, 2008 — 520 с.
ISBN 978-5-482-01995-5
Рекомендую купить, например, здесь: OZON.ru

Исходники

Проект в виде репы на GitHub — Wolfram-Math-in-Logistics
Буду очень рад видеть ваши вопросы, рекомендации и возможно форки.

Подборка ссылок

ссылка на оригинал статьи http://habrahabr.ru/post/182830/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *