Как читать вероятностные распределения из базы данных и сохранять их в коллекциях - PullRequest
0 голосов
/ 15 ноября 2018

Я перехожу с Arena на AnyLogic и у меня есть вопрос по дистрибутивамМне нужно использовать разные дистрибутивы, основанные на некоторых параметрах агента.Я видел предложение здесь, но число распределений слишком велико, и я предпочитаю не кодировать их жестко.

Как связать распределение вероятностей с агентами - Anylogic

В Arena можно было создавать массивы выражений и связывать их с базой данных (например, Excel) и использовать эти параметры для получения распределений из массивов выражений.Я пытался использовать коллекции в AnyLogic, чтобы сделать то же самое, но не смог преобразовать строки (например, "iform (100,120) ") в распределения.

  1. Есть ли способ в AnyLogic хранить распределения в коллекциях?
  2. Есть ли способ в AnyLogic читать распределения из базы данных?

Спасибо

1 Ответ

0 голосов
/ 16 ноября 2018

Все, что вы говорите, возможно ... есть как минимум 4 способа сделать это: создать агентов с распределением, создать коллекцию классов распространения, выполнить упомянутое вами строковое выражение и прочитать и вычислить непосредственно из базы данных.В этом конкретном случае мне нравится опция с классами, и выражение one будет для вас проще, но я могу записать все остальные опции позже:

Использование ExecuteExpression

Если вам удалось создать коллекцию со строками, представляющими ваши дистрибутивы, вы можете сделать это:

executeExpression("uniform(100,200)");

или, в вашем случае, с коллекцией (какой бы вы ни выбрали «i»)

executeExpression(collection.get(i));

Но это уродливо, поэтому я сделаю сложный и крутой способ

Использование баз данных

Первое, что очевидно, это создатьБаза данных с вашей информацией.Я предполагаю, что, поскольку это именно то, что вам кажется, вы хотите иметь коллекцию распределений, которые все одинаковы.Таким образом, база данных будет выглядеть следующим образом:

database Где cum_probability - совокупная вероятность выбора этого распределения, а максимум и минимум будут представлять параметры вашей униформы (минимум, максимум) дистрибуция.

Коллекция дистрибутивов с использованием класса

Теперь мы создадим класс со всей этой информацией:

public class Distribution implements Serializable {

    public double probability;
    public double min;
    public double max;

    /**
     * Default constructor
     */
    public Distribution(double probability,double min,double max) {
        this.probability=probability;
        this.min=min;
        this.max=max;
    }

    public double getDistributionResult() {
        return uniform(this.min,this.max,new Random());

    }
}

Вы также будетесоздайте коллекцию: collection

И вы инициализируете свою коллекцию в Main - при запуске

List <Tuple> theList=selectFrom(distributions).list();
for(Tuple t : theList){
    distributionsArray.add(
        new Distribution(t.get(distributions.cum_probability),
                            t.get(distributions.minimum),
                            t.get(distributions.maximum))
    );
}

Хорошо, теперь у вас есть коллекция дистрибутивов.Отлично.Осталось только создать функцию, которая будет возвращать случайный результат распределения коллекции:

double rand=uniform();
List <Distribution> filtered=filter(distributionsArray,d->d.probability>=rand);
return top(filtered,d->-d.probability).getDistributionResult();
...