Как создать макет, при котором все его ячейки изначально пусты и доступны для движущихся агентов (например, оборудования)? - PullRequest
1 голос
/ 04 августа 2020

В моделировании медно-никелевого рудника (облако) в агенте MinePanel есть функция, называемая setupTunnelLayout.

Исходный код в приведенной выше функции выглядит следующим образом:

// создать коридор из уже пустых комнат

     `RoomBlock emptyRoom;
for ( int j = 0; j < nColumns; j++ ) {
    
    emptyRoom = add_roomBlocks();
    emptyRoom.jumpToCell( 0, j );   
    if ( j == nColumns - 1 )
        emptyRoom.isStartBlock = true;
    emptyRoom.isTunnel = true;
}`

Но в моем сценарии все ячейки доступны изначально, поэтому все могут быть туннелями (путь для перемещения), а не только строка (0, j), как в приведенном выше примере!

Я думал, что могу изменить это следующим образом; (1) или (2); (1) // создаем коридор из уже пустых комнат

     RoomBlock emptyRoom;
for ( int j = 0; j < nColumns; j++ ) 
     for (int i = 0; i < nRows; i++){
    
    emptyRoom = add_roomBlocks();
    emptyRoom.jumpToCell( 0, j );
    emptyRoom.jumpToCell( i, 0 );   
    if ( j == nColumns - 1 )
        emptyRoom.isStartBlock = true;
    emptyRoom.isTunnel = true;
}

   

Или может быть так; (2) // создать коридор из уже пустых комнат

    `RoomBlock emptyRoom;
for ( int j = 0; j < nColumns; j++ ) 
     for (int i = 0; i < nRows; i++){
    
    emptyRoom = add_roomBlocks();
    emptyRoom.jumpToCell( i, j );   
    if ( j == nColumns - 1 )
        emptyRoom.isStartBlock = true;
    emptyRoom.isTunnel = true;
}` 

'Не могли бы вы сообщить мне, правильны ли (1) или (2)? Какой из них предпочтительнее?

Большое спасибо, Неда. '

1 Ответ

0 голосов
/ 07 августа 2020

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

В обоих случаях, хотя вам не хватает закрытия } для вашего дополнительного i l oop (и вам не хватает открывающего во втором случае).

//create corridor of already empty rooms
RoomBlock emptyRoom;
for (int j = 0; j < nColumns; j++) {
   for (int i = 0; i < nRows; i++) { 
      emptyRoom = add_roomBlocks();
      emptyRoom.jumpToCell(i, j);   
      if (j == nColumns - 1) {
        emptyRoom.isStartBlock = true;
      }
      emptyRoom.isTunnel = true;
   }
}

[Я использовал StackOverflow форматирование , чтобы отметить полный блок как код Java. Также рекомендуется (хотя AnyLogi c не делает этого во многих своих примерах моделей) всегда использовать фигурные скобки для циклов и т. Д. c. даже если их тело имеет только одну линию.]

Плюс, будет ли изменение делать то, что вы хотите, очевидно, зависит от остальной части модели и того, как она обрабатывает сетку ячеек и туннелей.

...