Repast Java: проблема создания нескольких типов пользовательских Edge - PullRequest
2 голосов
/ 22 октября 2019

Исходное решение для создания только одного настраиваемого ребра находится здесь: Repast Java: создание настраиваемого агента ребра для планирования определенных действий

1). Теперь у меня есть потребность в создании нескольких типов настраиваемых ребер, которые будут выступать в качестве уникальных агентов (например, в моей модели у меня есть агент маршрутизации, агент снабжения, агент связи). Должен ли я повторить вышеописанный процесс, описанный в ссылке? (т.е. добавить другой выделенный класс CustomEdgeCreator и класс CustomEdge с другим именем), или есть более эффективный метод?

2). Учитывая приведенный выше пример в модели Zombie, я заметил, что создание собственного ребра с помощью метода CustomEdgeCreator не делает класс агента ребра видимым в графическом интерфейсе, что неудобно для отслеживания связанных свойств, связанных с агентом ребра.

enter image description here

Также не работает сбор данных от пограничного агента. Я установил вес каждого ребра равным 2, но их сумма, отображаемая на графике, равна 0.

enter image description here

enter image description here

Вышеперечисленные проблемы приводят к важному вопросу: чем класс ребер отличается от класса обычных агентов?

1 Ответ

3 голосов
/ 22 октября 2019

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

Добавление запрошенного примера здесь:

package jzombies;

import repast.simphony.space.graph.EdgeCreator;
import repast.simphony.space.graph.RepastEdge;

public class CustomEdgeCreator<E extends RepastEdge<T>, T> implements EdgeCreator<E, T> {

    private Class<E> e;

    public CustomEdgeCreator(Class<E> e) {
        this.e = e;
    }

    @Override
    public Class<E> getEdgeType() {
        return e;
    }

    @Override
    public E createEdge(T source, T target, boolean isDirected, double weight) {
        try {
            return e.getDeclaredConstructor(new Class[]{Object.class, Object.class, boolean.class, double.class}).newInstance(source, target, isDirected, weight);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

Относительно вашего второго пункта: если вы не добавите созданный край в контекст, он выиграет 'не показывайся как настоящий агент. Таким образом, при создании сетевой ссылки вы можете добавить ее в контекст, и она должна отображаться как в таблице агентов, так и для целей сбора данных.

...