Pages: 1
Hold не выпускает ресурсы даже по recalculateConditions()
Приветствую, коллеги!
Сначала расскажу предпосылки:
Есть задача создать очередь заявок, максимальный размер данной очереди нужно уметь менять во время работы модели. Задачу эту решил использовав Hold (соответствующее обсуждение http://www.anylogic.ru/forum?PAGE_NAME=read&FID=2&TID=121)

Если ничего не менять, то всё работает как часы, но вот ни задача при определённых условиях Hold перестаёт освобождать ресурсы.
Такая история:
  1. В модели идёт Hold с названием queueCondition, который моделирует очередь с переменной вместимостью, за ним следует Service по имени analysis (см. картинку)
  2. у Hold стоит Режим = "Условие"
    Условие блокировки: queueOccupiedSlots >= queueSize.getIntValue(),
    Где queueOccupiedSlots счётчик обновляемый в сервисе analysis (далее описано как)
    queueSize - текстовое поле, задающее максимальный размер очереди
  3. В Service следующие свойства:
    Максимальная вместимость: true
    Задать выбор ресурса: true
    Условие выбора ресурса: (analysisOccupiedSlots < analysisLimit.getIntValue()) && (analysisInterchangeability || (!analysisInterchangeability && unit instanceof Analyst)),
    где analysisOccupiedSlots счётчик увеличивающийся при захвате ресурса этим сервисом, и уменьшающийся при захвате следующим ресурсом.
    analysisLimit - текстовое поле, задающее максимальное суммарное число ресурсов, которые могут находится на обработке в этом сервисе и в очереди следующего сервиса
    analysisInterchangeability - для простоты скажем, что этот константа, которая может быть true или false.
    При входе:
    Code
    queueOccupiedSlots++;
    
    При захвате ресурса:
    Code
    analysisOccupiedSlots++;
    queueOccupiedSlots--;
    queueCondition.recalculateConditions();
    

  4. Так вот проблема возникает только в том случае, если:
    - analysisInterchangeability = false
    - Hold блокирует поступление новых заявок
    - Уменьшаем значение текстового поля analysisLimit
    Не воспроизводится, если хотя бы одно из этих условий не выполнено (например analysisLimit увеличен, а не уменьшен)
Симптомы: После уменьшения значения в поле analysisLimit сервис analysis постепенно покидают все заявки, а новые в него больше не поступают

Вероятно, я что-то делаю не так, но документация не даёт мне понять, что именно. Подскажите, пожалуйста, как исправить или переделать эту модель, чтобы работало, как мне нужно.
Edited: Денис Тучин - 21.09.2015 14:13:34
Похоже, вот в чём проблема: в документации про Условие выбора ресурса написано "Если нет доступных ресурсов, подходящих под условие (условие возвращает false), блок Service будет ожидать первый доступный ресурс, для которого выполняется условие."
Т.е. уже "забракованные" ресурсы не проверяются вновь
Получается задавать ограничение на суммарное число задач в анализе и готовых к разработке с помощью "Условие выбора ресурса" некорректно. Поставил дополнительные Hold-ы чтобы контролировать этот лимит, а в Условие выбора ресурса оставил то что действительно относится к ресурсу
Edited: Денис Тучин - 22.09.2015 12:30:23
Денис, такие задачи довольно сложно анализировать без модели, поскольку описания может быть недостаточно, да и сложно представить работу в голове. Нужно строить модель по описанию, воспроизводить и т.д. Добавляйте ссылку на модель, так будет быстрее и проще отвечать.
Pages: 1
Users browsing this topic (1 guests, 0 registered, 0 hidden)