Muhtemelen diğer cevaplardan aldığınızın farkındayım, ama eğlenceli bir soruydu ve küçük bir Python kodlaması yapmak gibi hissettim. Nesneye yönelik yaklaşımım bu. Girinti kapsamı tanımlar.
Grafik Gösterimi
Grafik, anahtarın oda kimliği olduğu bir değer, değer sözlüğü olarak kolayca kaydedilebilir ve değer, yönlendirdiği odaların bir dizisidir.
map = {
1:[5, 2],
2:[1, 3, 5],
3:[2, 4],
4:[3, 5, 6],
5:[2, 4, 1],
6:[4]
}
Aracı Arayüzü
İlk olarak, temsilcinin çevreden hangi bilgileri öğrenebilmesi gerektiğini ve gerçekleştirebileceği işlemleri düşünmeliyiz. Bu algoritma hakkında düşünmeyi kolaylaştıracaktır.
Bu durumda ajan içinde bulunduğu odanın kimliği için ortam sorgulamak gerekir, kapıların sayısını almak mümkün olmalıdır içinde bulunduğu odada ( bu kimliği odalarının değildir notu kapılar ortaya çıkar! ) ve bir kapı endeksi belirleyerek kapıdan geçebilmelidir. Bir ajanın bildiği her şey ajanın kendisi tarafından çözülmelidir.
class AgentInterface(object):
def __init__(self, map, starting_room):
self.map = map
self.current_room = starting_room
def get_door_count(self):
return len(self.map[self.current_room])
def go_through_door(self, door):
result = self.current_room = self.map[self.current_room][door]
return result
Temsilci Bilgisi
Temsilci haritaya ilk girdiğinde, sadece odadaki kapı miktarını ve o anda bulunduğu odanın kimliğini bilir. Ajanın hangi kapılar olmadığı gibi öğrendiği bilgileri depolayacak bir yapı oluşturmam gerekiyordu. ve kapıların nereye götürdüğü burada olmuştu.
Bu sınıf tek bir oda hakkındaki bilgileri temsil eder. Görünmeyen kapıları a set
ve ziyaret edilen kapıları a olarak saklamayı seçtim dictionary
, burada anahtar kapı kimliği ve değeri yol açtığı odanın kimliği.
class RoomKnowledge(object):
def __init__(self, unvisited_door_count):
self.unvisited_doors = set(range(unvisited_door_count))
self.visited_doors = {}
Aracı algoritması
Temsilci bir odaya her girdiğinde, oda hakkında bilgi için bilgi sözlüğünü arar. Bu oda için herhangi bir giriş yoksa, yeni bir RoomKnowledge
bilgi oluşturur ve bunu bilgi sözlüğüne ekler.
Mevcut odanın hedef oda olup olmadığını kontrol eder, eğer öyleyse geri döner.
Ziyaret etmediğimiz bu odada kapılar varsa, kapıdan geçiyoruz ve nereye götürüyoruz? Daha sonra döngüye devam ediyoruz.
Herhangi bir ziyaret edilmemiş kapı olmasaydı, ziyaret etmediğimiz odalara geri dönerek ziyaret edilmemiş kapıları buluyoruz.
Agent
Sınıf devralır AgentInterface
sınıfında.
class Agent(AgentInterface):
def find_exit(self, exit_room_id):
knowledge = { }
room_history = [] # For display purposes only
history_stack = [] # Used when we need to backtrack if we've visited all the doors in the room
while True:
room_knowledge = knowledge.setdefault(self.current_room, RoomKnowledge(self.get_door_count()))
room_history.append(self.current_room)
if self.current_room==exit_room_id:
return room_history
if len(room_knowledge.unvisited_doors)==0:
# I have destination room id. I need door id:
door = find_key(room_knowledge.visited_doors, history_stack.pop())
self.go_through_door(door)
else:
history_stack.append(self.current_room)
# Enter the first unopened door:
opened_door = room_knowledge.unvisited_doors.pop()
room_knowledge.visited_doors[opened_door]=self.go_through_door(opened_door)
Destekleyici fonksiyonlar
Bir değerde verilen bir sözlükte bir anahtar bulabilecek bir işlev yazmak zorunda kaldım, çünkü geri izleme yaparken odanın kimliğini biliyoruz, ancak almak için hangi kapıyı kullanacağımızı bilmiyoruz.
def find_key(dictionary, value):
for key in dictionary:
if dictionary[key]==value:
return key
Test yapmak
Yukarıda verilen haritadaki tüm başlangıç / bitiş konumu kombinasyonlarını test ettim. Her kombinasyon için ziyaret edilen odaları basar.
for start in range(1, 7):
for exit in range(1, 7):
print("start room: %d target room: %d"%(start,exit))
james_bond = Agent(map, start)
print(james_bond.find_exit(exit))
notlar
Geri izleme çok verimli değildir - en kötü senaryoda, bitişik bir odaya ulaşmak için her odadan geçebilir, ancak geri izleme oldukça nadirdir - yukarıdaki testlerde sadece üç kez geri gider. Kod özlü tutmak için istisna işleme koyarak kaçındım. Benim Python hakkında herhangi bir yorum takdir :)