Как найти пункт назначения MoveTo, заполненный базой данных?

Мне может понадобиться помощь с моделью Anylogic.

Модель (краткая): Сценарий производства с перемещением заказов по индивидуальному маршруту. Рабочие места (WP) динамически создаются при запуске моделирования. Их названия, количество и другие параметры хранятся в базе данных (Excel Import). Также заказы создаются по импорту. «Порядок» пополнения агентов имеет коллекцию routing, которая содержит рабочие места, которые он должен остановить в определенном порядке.

Цель: мне нужен блок moveTo в main, который находит следующий пункт назначения агента order. Проблемы и пути решения:

  1. Я установил Тип назначения для агента и в поле Агент я ввел функцию agent.getDestination(). Эта функция находится в порядке, который возвращает следующую запись коллекции WP destinationName = routing.get(i). При этом я получаю ошибку Datatype (при запуске без компиляции). Я сомневаюсь, что это потому, что база данных не сохраняет записи как WP Type, а только String. Есть ли возможность создать коллекцию с агентами из Excel?

  2. После этого я попытался использовать тот же getDestination в качестве String, поэтому с помощью findFirst найдите WP, соответствующий возвращенному имени, и верните его как WP. WP targetWP = findFirst(wps, w->w.name == destinationName); Corse wps (население Рабочих мест) не найдено. Как я могу искать население? Может быть, с помощью Agentlink?

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


person Mona Kenz    schedule 09.01.2020    source источник


Ответы (2)


Есть ли возможность создать коллекцию с агентами из Excel?

Не использовать напрямую свойства коллекции и, как вы видели, у вас не может быть типов столбцов базы данных (БД), которые являются типами агентов. 1

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

После этого я попытался использовать тот же getDestination, что и String, поэтому найдите с помощью findFirst WP, соответствующий возвращаемому имени, и верните его как WP

Да, это один подход. Если детали вашего заказа находятся в Excel / базе данных, они предположительно относятся к рабочим местам через некоторый String ID (который будет параметром агентов рабочего места, которые вы создали из отдельного рабочего листа Excel / таблицы базы данных). Однако для сравнения строк необходимо использовать метод Java equals, а не == (который предназначен для сравнения чисел или того, являются ли два объекта одним и тем же объектом).

Мне нужен блок moveTo в основном, который находит следующий пункт назначения заказа агента

Итак, общее общее решение

  • Создайте совокупность Workplace агентов (скажем, называемых workplaces в Main) из БД, каждый из которых имеет строковый параметр id или аналогичный, отображаемый из столбца БД.

  • Создайте совокупность Order агентов (скажем, называемых orders в Main) из БД, а затем, в их действии при запуске, настройте их коллекцию идентификаторов рабочих мест (тип ArrayList, класс элемента String; скажем, названный workplaceIDsList) с использованием данных из другой таблицы БД.

  • Order, вероятно, также нужна рабочая переменная, хранящая следующий индекс в списке, к которому она должна перейти (так, скажем, int переменная nextWorkplaceIndex, которая начинается с 0).

  • Напишите в Main функцию с именем getWorkplaceByID, которая имеет единственный String аргумент id и возвращает Workplace. Это получает рабочее место от населения, которое соответствует идентификатору; однострочный способ, похожий на ваш - findFirst(workplaces, w -> w.id.equals(id)).

  • Блок MoveTo (который, как я полагаю, находится в Main) должен переместить Order агенту, определенному getWorkplaceByID(agent.workplaceIDsList.get(nextWorkplaceIndex++)). (Бит ++ увеличивает индекс после оценки выражения, чтобы оно было готово для перехода к следующему рабочему месту.)

Для заполнения коллекции у вас будет две таблицы, примерно такие, как показано ниже (при условии использования строк в качестве идентификаторов для рабочих мест и заказов):

  • orders таблица: столбцы для параметров ваших заказов (включая столбец String id) другие, кроме списка рабочих мест. (Создайте по одному Order агенту в каждой строке.)

  • order_workplaces таблица: столбцы order_id, sequence_num и workplace_id (то есть с несколькими строками, указывающими последовательность идентификаторов рабочих мест для идентификатора заказа).

В действии При запуске для Order настройте скелетный код запроса с помощью мастера Вставить запрос к базе данных, как показано ниже (где мы хотим перебрать все строки для идентификатора этого заказа и сделайте что-нибудь --- мы изменим код скелета, чтобы добавить записи в коллекцию, вместо того, чтобы просто печатать материал через traceln, как это делает код скелета).

Вставить настройку запроса к базе данных

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

List<Tuple> rows = selectFrom(order_workplaces)
    .where(order_workplaces.order_id.eq(id))
    .orderBy(order_workplaces.sequence_num.asc())
    .list();

for (Tuple row : rows) {
    workplaceIDsList.add(row.get(order_workplaces.workplace_id));
}

1 База данных AnyLogic - это обычная реляционная база данных --- фактически HSQLDB --- а базы данных понимают только свои собственные специфические типы данных, такие как VARCHAR, а AnyLogic и библиотеки, которые он использует, переводят их в типы Java, такие как String. В пользовательском интерфейсе AnyLogic создает вид, что вы устанавливаете типы столбцов как int, String и т. Д., Но на самом деле это типы Java, в которые в конечном итоге будет переведено содержимое столбцов.

AnyLogic поддерживает столбцы с типами список параметров (и столбец специального типа Code для столбцов, содержащих исполняемый код Java), но это особые случаи, использующие скрытую под крышкой специальную логику для перевода данные столбца (которые в конечном итоге все еще представляют собой строку символов) в соответствующий экземпляр списка опций или (для Code столбцов) в скомпилированную на лету и затем выполняемую Java).

person Stuart Rossiter    schedule 10.01.2020

Добро пожаловать в Stack Overflow :) Чтобы создать популяцию с помощью импорта из Excel, вы должны создать метод и вызвать такой код. Вам также понадобится пустое Население.
int n = excelFile.getLastRowNum(YOUR_SHEET_NAME); for(int i = FIRST_ROW; i <= n; i++){ String name = excelFile.getCellStringValue(YOUR_SHEET_NAME, i, 1); double SEC_PARAMETER_TO_READ= excelFile.getCellNumericValue(YOUR_SHEET_NAME, i, 2); WP workplace = add_wps(name, SEC_PARAMETER_TO_READ); }

Теперь, если вы хотите получить рабочее место по имени, вам нужно создать метод, аналогичный вашей попытке.
Функциональный блок:
WP workplaceToFind = wps.findFirst(w -> w.name.equals(destinationName)); if(workplaceToFind != null){ //do what ever you want }

person DrMetzGer    schedule 10.01.2020
comment
Это старый способ (до AnyLogic 7.2) прямого доступа к Excel. В настоящее время, со встроенной базой данных AnyLogic, обычно всегда лучше / проще импортировать Excel во встроенную базу данных, а затем использовать запросы к ней (где многие блоки AnyLogic включают способы визуальной настройки свойств для чтения из базы данных , а также способы автоматического создания популяций и определений типов агентов из структур / содержимого базы данных). - person Stuart Rossiter; 10.01.2020