2015-03-28 6 views
0

Извините за слегка сумасшедшую формулировку этого вопроса, но я очень новичок в мышлении, ориентированном на агентов (это эти «шаблоны»?) И только немного менее новый для java, и я борюсь с тем, что кажется очень основная проблема.Java: Как объект «агент», находящийся внутри объекта «мир», получает информацию о «мире»?

Я делаю много этого «интуитивно» (т.е. слепо), а не пытаюсь понять чужой код - отчасти потому, что я изо всех сил пытаюсь понять код, который «выше моего уровня», но также потому, что я надеюсь, мой путь "поможет мне оценить правильный путь позже.

В принципе, я моделирую агент (вакуум робота) в среде (дом). Дом содержит коллекцию (HashMap) номеров. У дома есть метод getRoom(int key), который возвращает комнату, соответствующую данному ключу. Агент имеет государство, которое на этом этапе отслеживает идентификатор комнаты (который также является ключом в Доме), который является комнатой, в которой робот «находится» для целей навигации по миру; государство также описывает, является ли помещение грязным. Когда агент сконструирован, он инициализируется идентификатором (он должен быть создан «в комнате»), но ему не дается грязный/чистый статус комнаты. Я хочу, чтобы агент проверял наличие грязи - это связано с использованием метода getRoom() в Доме. Однако с Java, который я изучил до сих пор, я не знаю, как это сделать. Я знаю, что могу получить доступ к этому методу, создав House внутри java или сделав метод статическим, но это не сработает - агент должен знать о доме SPECIFIC, который находится в памяти, тот, который был инициализирован с помощью комнат ,

tl; dr: Как объект-агент может получить ссылку на объект, который хранится в HashMap внутри другого объекта среды?

PS Здесь представлена ​​моя воображаемая модель для перспективы «более высокого уровня», поддерживаемая этим подходом: Я как бы интуитивно хотел, чтобы Агент полностью отвечал за свои собственные заповеди и поведение, так что код выше выглядел бы более как:

agent.percieve()       //agent checks the room it thinks its in for dirt and exits 
 
if (agent.gotDirt()) agent.clean()   //agent activates its cleaning device if it found dirt in this room 
 
if (agent.gotDirt() == false) agent.move() //agent picks an exit and leaves the room

+0

Я понимаю, что один подход будет делать логику об обновлении состояния Агента и моделирования действий агента , в другом слое, например World или Game, который создает объект House и объект Agent и, следовательно, имеет прямой доступ к обоим. Я, вероятно, в конечном итоге сделаю это, но я искал, есть ли другой способ. – Toadfish

+0

Первый ответ работает блестяще для моего случая, но [этот вопрос] (http://stackoverflow.com/questions/40480/is- java-pass-by-reference-or-pass-by-value) многое помогли с точки зрения моего реального понимания дилеммы pass-by-reference и pass-by-value, которая здесь начинается. Один из лучших ответов на этот вопрос ссылается [эта статья] (http://javadude.com/articles/passbyvalue.htm), что помогло еще больше. Если кто-то как-то попал сюда, пытаясь решить аналогичную проблему, в которой релевантная посылка и пропускная способность важны, эти ресурсы должны оказаться неоценимыми. – Toadfish

ответ

1

пылесос (? то есть то, что вы называете «агент», но почему имя его, как это, так как это, в самом деле, пылесос) просто необходима ссылка на объект дома он принадлежит:

// a single House is constructed 
House house = new House(); 
// omitted: add rooms to the house... 

// create a first vacuum cleaner for the house. A reference to the house is given to this cleaner 
VacuumCleaner vacuumCleaner = new VacuumCleaner(house); 
System.out(vacuumCleaner.isRoomClean(2)); // prints false, because room 2 is full of dirt 
vacuumCleaner.cleanRoom(2); 
System.out(vacuumCleaner.isRoomClean(2)); // prints true, because the vacuum cleaner removed the dirt from room 2 

// now let's create a second vacuum cleaner for the same house 
VacuumCleaner vacuumCleaner2 = new VacuumCleaner(house); 
System.out(vacuumCleaner2.isRoomClean(2)); // prints true, because room 2 has no dirt: it has previously been removed from the room by the first vacuum cleaner. 

EDIT

А вот как класс пылесос будет выглядеть так:

public class VacuumCleaner 
    /** 
    * The house that this vacuum cleaner cleans 
    */ 
    private House house; 

    public VacuumCleaner(House houseToClean) { 
     this.house = houseToClean; 
    } 

    public boolean isRoomDirty(int roomId) { 
     // find the room in the house, and see if it contains dirt 
    } 

    public void cleanRoom(int roomId) { 
     // find the room in the house, and remove dirt from it 
    } 
} 
+0

Единственная проблема заключается в том, что я хотел, чтобы дом существовал независимо от вакуума, например.так что в одном доме может быть несколько пылесосов, или чтобы конкретный вакуум мог иметь неправильную информацию о доме (и соответствующие способы обнаружения и разрешения этого случая). В то же время я не хочу, чтобы поведение в вакууме отвечало за дом (например, создавая вакуум внутри объекта «Дом» и имея методы в Доме, чтобы обновить состояние вакуума и определить поведение и т. Д.). – Toadfish

+0

Итак, я пытаюсь создать (преднамеренное) избыточность: мир существует, а затем вакуум должен «исследовать» (отправлять и получать сообщения от объекта «Дом»), чтобы создать свою собственную внутреннюю модель этого мира - аналогичную как физический робот должен вести себя в реальном доме. – Toadfish

+0

Прочтите код еще раз. Дом не знает о пылесосе. Это наоборот: пылесос знает о доме. И вы можете идеально создать еще один пылесос для того же дома. –