আমি স্বীকার করেছি যে আপনি সম্ভবত অন্যান্য উত্তরগুলি থেকে টুকরোটি পেয়েছেন, তবে এটি একটি মজাদার প্রশ্ন এবং আমার মনে হয়েছিল যেন অল্প অজগর কোডিং করা হচ্ছে। এটি আমার অবজেক্ট-ভিত্তিক পদ্ধতি approach ইন্ডেন্টেশন সুযোগ নির্ধারণ করে।
গ্রাফ প্রতিনিধিত্ব
গ্রাফটি সহজেই একটি কী, মান অভিধান হিসাবে সংরক্ষণ করা যেতে পারে যেখানে চাবিটি রুমের আইডি, এবং মানটি ঘরের একটি অ্যারে হয় leads
map = {
1:[5, 2],
2:[1, 3, 5],
3:[2, 4],
4:[3, 5, 6],
5:[2, 4, 1],
6:[4]
}
এজেন্ট ইন্টারফেস
প্রথমে আমাদের পরিবেশের কাছ থেকে এজেন্টের কী কী তথ্য শিখতে হবে, এবং যে ক্রিয়াকলাপগুলি সম্পাদন করতে সক্ষম হওয়া উচিত সে সম্পর্কে আমাদের চিন্তা করা উচিত। এটি অ্যালগরিদম সম্পর্কে চিন্তাভাবনাকে সহজ করবে।
এই ক্ষেত্রে এজেন্টটি যে কক্ষে রয়েছে তার আইডির জন্য পরিবেশটি জিজ্ঞাসা করতে সক্ষম হবে, এটি যে ঘরে রয়েছে তার দরজাগুলির একটি গণনা পেতে সক্ষম হওয়া উচিত ( দ্রষ্টব্য এটি কক্ষগুলির আইডি নয় দরজা বাড়ে! ) এবং তার একটি দরজা সূচক নির্দিষ্ট করে একটি দরজা দিয়ে যেতে সক্ষম হওয়া উচিত। কোনও এজেন্ট জানে অন্য যে কোনও কিছুই এজেন্ট নিজেই খুঁজে বের করতে হবে।
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
এজেন্ট জ্ঞান
যখন এজেন্ট প্রথমে মানচিত্রে প্রবেশ করে তখন কেবলমাত্র ঘরের দরজাগুলির পরিমাণটি এবং এটি বর্তমানে যে ঘরে রয়েছে তার আইডি জানে I এর মধ্য দিয়ে এবং যেখানে দরজাগুলি সেই দিকে পৌঁছেছিল।
এই শ্রেণিটি একটি একক কামরা সম্পর্কে তথ্য উপস্থাপন করে। আমি অপ্রত্যাশিত দরজাগুলিকে একটি হিসাবে set
এবং ভিজিট করা দরজাগুলিকে একটি হিসাবে সঞ্চয় করতে বেছে নিয়েছি dictionary
, যেখানে কীটি দরজার আইডি এবং মানটি তার দিকে ঘরের আইডি।
class RoomKnowledge(object):
def __init__(self, unvisited_door_count):
self.unvisited_doors = set(range(unvisited_door_count))
self.visited_doors = {}
এজেন্ট অ্যালগরিদম
প্রতিবার এজেন্ট যখন কোনও ঘরে প্রবেশ করে তখন সে রুমের তথ্যের জন্য তার জ্ঞানের অভিধানটি অনুসন্ধান করে। যদি এই কক্ষের জন্য কোনও এন্ট্রি না থাকে তবে এটি একটি নতুন তৈরি করে RoomKnowledge
এবং এর জ্ঞান অভিধানে এটি যুক্ত করে।
এটি বর্তমান কক্ষটি টার্গেট রুম কিনা তা পরীক্ষা করে দেখুন, যদি তাই হয় তবে এটি ফিরে আসে।
এই ঘরে যদি আমরা ঘুরে দেখি না এমন দরজা থাকে তবে আমরা দরজা দিয়ে store আমরা তখন লুপটি চালিয়ে যাই।
যদি কোনও অপ্রত্যাশিত দরজা না পাওয়া যায়, তবে আমরা অদর্শনিত দরজা সহ একটি সন্ধান করতে আমরা যে কক্ষগুলি পরিদর্শন করেছি সেগুলি থেকে ব্যাকট্র্যাক করি।
Agent
থেকে বর্গ উত্তরাধিকারী AgentInterface
বর্গ।
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)
সাপোর্টিং ফাংশন
আমাকে একটি ফাংশন লিখতে হয়েছিল যা একটি অভিধানে একটি কী খুঁজে পেতে পারে যার একটি মান দেওয়া হয়েছিল, যেহেতু ব্যাকট্র্যাকিংয়ের সময় আমরা যে ঘরে যাওয়ার চেষ্টা করছি তার আইডি জানি, তবে এটির জন্য কোন দরজাটি ব্যবহার করা উচিত নয়।
def find_key(dictionary, value):
for key in dictionary:
if dictionary[key]==value:
return key
পরীক্ষামূলক
আমি উপরে বর্ণিত মানচিত্রে শুরু / শেষ অবস্থানের সমস্ত সংমিশ্রণ পরীক্ষা করেছি। প্রতিটি সংমিশ্রনের জন্য এটি পরিদর্শন করা কক্ষগুলি মুদ্রণ করে।
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))
মন্তব্য
ব্যাকট্র্যাকিং খুব দক্ষ নয় - সবচেয়ে খারাপ ক্ষেত্রে এটি সংলগ্ন ঘরে যাওয়ার জন্য প্রতিটি ঘরে গিয়ে যেতে পারে, তবে ব্যাকট্র্যাকিং মোটামুটি বিরল - উপরের পরীক্ষায় এটি কেবল তিনবার ব্যাকট্রাক করে। কোডটি সংক্ষিপ্ত রাখতে আমি ব্যতিক্রম হ্যান্ডলিং এড়ানোর চেষ্টা করেছি। আমার পাইথনে কোনও মন্তব্য প্রশংসিত :)