Создание цилиндрического пространства в Repast Simphony? - PullRequest
0 голосов
/ 22 октября 2018

Я пытаюсь смоделировать внутреннюю часть эпителиального пространства и застреваю при движении по внутренним краям цилиндрического пространства.По сути, я пытаюсь реализовать StickyBorders и держать агентов на тех границах в цилиндрическом пространстве, которое я создаю.

Есть ли способ использовать цилиндрические координаты в Repast Simphony?Я нашел этот пример (https://www.researchgate.net/publication/259695792_An_Agent-Based_Model_of_Vascular_Disease_Remodeling_in_Pulmonary_Arterial_Hypertension), где они, кажется, сделали что-то похожее, но в статье не объясняются методы очень подробно, и я не верю, что это пример в моделях repast Simphony.

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

GridPoint intendedpt = new GridPoint((int)Math.rint(alongX),(int)Math.rint(alongY),(int)Math.rint(alongZ));
        GridCellNgh<EpithelialCell> nearEpithelium = new GridCellNgh<EpithelialCell>(mac_grid, intendedpt, EpithelialCell.class, 1,1,1);    
        List<GridCell<EpithelialCell>> EpiCells = nearEpithelium.getNeighborhood(false);
        int nearbyEpiCellsCount=0;
        for (GridCell<EpithelialCell> cell: EpiCells) {
            nearbyEpiCellsCount++;
        }
        if (nearbyEpiCellsCount<2) {
            System.out.println(this + " leaving epithelial wall /r");
            RunEnvironment.getInstance().pauseRun();

            //TODO: where to go if false
        }

Мне интересно, есть ли способ установить границы пространства для цилиндра или проверить, какая сторона агента находится у стены и ограничить его движение вэто направление.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Подход, который мы использовали в этой модели, заключался в использовании трехмерного пространства сетки с пользовательскими границами и методами запросов.Само пространство было все еще декартовым - мы просто визуализировали его как цилиндр, используя пользовательский код дисплея.Использование декартовой сетки было разумным приближением для этого приложения, поскольку размеры ячеек были значительно меньше радиуса сосуда, поэтому эффектом кривизны пренебрегали.Граничные условия на пространстве сосуда были обернуты в угловом измерении, так что ячейки могли непрерывно перемещаться по окружности сосуда, а осевые граничные условия также были обернуты, так как мы предполагали достаточно большую длину сосуда, чтобы это было разумно,Измерение толщины стенки имело жесткие границы на базальной мембране (y = 0) и на границе раздела текучей среды (y = толщина стенки).

В зависимости от того, какой тип пространства вы используете, вам потребуется реализоватьPointTranslator или GridPointTranslator, который выполняет граничные функции.Если вам нужны конкретные примеры кода, я предлагаю вам обратиться непосредственно к автору.

0 голосов
/ 24 октября 2018

Код закрепленной границы ( StickyBorders.java ), по сути, просто проверяет, находится ли точка, в которую перемещается агент, за пределами какого-либо из измерений пространства, и если это так, точка привязана к этому измерению.Так, например, если пространство составляет 3х4, а движение агента увеличит его до 4,2, то эта точка станет 3,2, и агент будет размещен там.Можете ли вы сделать что-то подобное в этом случае?Если нет, то можете ли вы отредактировать свой вопрос, чтобы объяснить, почему нет, и, возможно, это поможет нам лучше понять.

...