0 / 0 / 0
Регистрация: 27.12.2016
Сообщений: 17
1

Работа с несколькими индивидуальными агентами (как сократить кол-во кода)

27.12.2016, 10:50. Показов 1196. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Очень интересует вопрос, как избавиться от прописывания условий для каждого из 10 агентов (заводов). Они все довольно индивидуальны (уровень запасов готовой продукции, мощности склада и т.п.) и приходится прописывать все индивидуально (отдельная переменная для каждого завода под уровень стока, отдельный параметр для каждого завода по мощности склада).
Примеры:
1. Тут пишу условие в Event, для индикатора о заполнении склада.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if(plant1Stock/plant1whCapacity<0.8)
{plants.get(0).oval.setFillColor(green);}
else {
    if(plant1Stock/plant1whCapacity<0.9 && plant1Stock/plant1whCapacity>0.8)
    {plants.get(0).oval.setFillColor(yellow);}
    else {plants.get(0).oval.setFillColor(red);
    }
}
 
if(plant2Stock/plant2whCapacity<0.8)
{plants.get(1).oval.setFillColor(green);}
else {
    if(plant2Stock/plant2whCapacity<0.9 && plant2Stock/plant2whCapacity>0.8)
    {plants.get(1).oval.setFillColor(yellow);}
    else {plants.get(1).oval.setFillColor(red);}
    }
и т.д. для каждого завода.
Таких примеров куча.
Как избежать этого всего и писать обобщенно для группы агентов?
Или это норма?

Добавлено через 27 минут
И еще вопрос: как, допустим в диаграмме действий, сослаться не на конкретного агента (plants.get(3)), а чтобы действие происходило со всеми агентами, в зависимости от того, какой агент.
Возможно что-то вроде: plants.get(), или как-то по-другому, объясните, пожалуйста.

Добавлено через 4 минуты
И туда же, чтобы не писать формулу для каждого завода:
plant1Stock/plant1whCapacity<0.9
Как-то ведь можно создать одну переменную (наприме Stock и WarehouseCapacity в классе Plant), и чтобы они использовалась в зависимости от завода?
Stock/whCapacity<0.9 и т.д.

Добавлено через 1 час 42 минуты
Нашел ответ.

Все решается циклами.

Пример:
Вводим переменную plantStock
Тип: другой = int[]
Начальное значение:
new int[] {сток1, сток2, и т.д.}

Дальше, где нам необходимо применить переменную используем индикатор i, как индикатор завода.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.12.2016, 10:50
Ответы с готовыми решениями:

Как можно сократить кол-во исходного кода
Вот мне дали задание по курсовой работе написать психологический тест. Кратко его можно изложить...

Как сократить кол-во почти одинаковых строчек кода?
Можно ли это как-нибудь упростить? Выглядит достаточно громоздко. Спасибо. btnQ.Enabled:=True; ...

Как сократить строку с несколькими div, которым необходимо присвоить одинаковый стиль через JS
Добрый день. Имеется 3 дива. Через JS собираюсь изменить их стили. Необходимо прописывать, как уже...

Работа с агентами.
Доброго всем времени суток. Начал пробывать работать с агентами. Сразу же возник вопрос. Возможно...

1
1816 / 1030 / 285
Регистрация: 13.02.2012
Сообщений: 3,339
27.12.2016, 15:02 2
Добрый день.

Что такое plants у вас в примере?
Походу это и есть ваш массив объектов -завод.

Цитата Сообщение от headbanger Посмотреть сообщение
И туда же, чтобы не писать формулу для каждого завода:
plant1Stock/plant1whCapacity<0.9
Как-то ведь можно создать одну переменную (например Stock и WarehouseCapacity в классе Plant), и чтобы они использовалась в зависимости от завода?
Stock/whCapacity<0.9 и т.д.
В этом и смысл, что у вас есть коллекция заводов (10) штук - структура у всех одинаковая, а значения свойств объектов разные, что придаёт им индивидуальность.

Далее все ваши условия сводятся к единому циклу с проверкой, в рамках которого проходит последовательная проверка всех объектов по заданному условию

Код
for (Plant p: plants){ // эргономичный цикл по массиву plants, p - конкретный объект
     int plantStock = p.plantStock;   // Получаем 1 раз значение переменной объекта, а не 100 раз обращаемся к объекту
     int plantwhCapacity = p.plantwhCapacity;
     double divide = plantStock/plantwhCapacity*1.0 ; // Делим 1 раз, а не 100 как у вас в каждом условии
     if(divide<0.8){
          p.oval.setFillColor(green);
     } else {
         if(divide<0.9 && divide>0.8) { // Проверка divide>0.8 лишняя, т.к. > в 100% случаев
              p.oval.setFillColor(yellow);
         } else {
              p.oval.setFillColor(red);
         }
     }
}
Первоначальное значение индивидуальных параметров агентов можно заполнить абсолютно по разному.
Можно и из встроенной базы данных, можно из Excel файла, можно и в самом AnyLogic.

Откройте класс завода и напишите действие при создании экземпляра данного класса (т.е. конкретного завода), там можно прописать код, где в зависимости от значения индекса завода в массиве можно знадать значения параметров, например
Код
switch (this.getIndex()){
0: plantStock = 100; break;
1: ... break;
default: .... break;
}
0
27.12.2016, 15:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.12.2016, 15:02
Помогаю со студенческими работами здесь

Работа с агентами и их копиями
Здравствуйте форумчане. Есть задача: Вычислительная система включает три ЭВМ. В систему в...

Как сократить размер кода?
понимаю код ужас. Помогите его правильно уменьшить, а то я одно и тоже могу писать километрами ...

Как сократить объём кода?
var list1 = new List&lt;SelectListItem&gt;(); var listAP = uow.GetRepository&lt;Subject&gt;().All().Where(x...

Как сократить повторяющиеся строки кода?
Добрый день. Совсем зеленый новичок. Есть след. задача. Есть html таблица со столбцами &quot;услуга&quot;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru