রিটার্ন ক্ষমতা ছাড়াই গোলকধাঁধা সমাধান করা


11

আমার এমন একটি প্রোগ্রাম লিখতে হবে যা ধাঁধাঁ সমাধান করবে। ম্যাজেজে গ্রাফের কাঠামো রয়েছে, যেখানে প্রতিটি নোড - কিছু ঘর এবং প্রান্তগুলি - অন্যান্য কক্ষে প্রস্থান করে:

এখানে চিত্র বর্ণনা লিখুন

স্পেসিফিকেশন:

  • আমরা একটি এলোমেলো ঘর থেকে শুরু করি।
  • গোলকধাঁধার মৃতপ্রান্ত রয়েছে, 0 বা কয়েকটি প্রস্থান।
  • আমরা সমস্ত গোলকধাঁধা সম্পর্কে কিছুই জানি না , কেবলমাত্র বর্তমান কক্ষের সংখ্যা এবং এটি থেকে দরজাগুলির তালিকা।
  • যখন আমরা নতুন ঘরে প্রবেশ করি আমরা জানি না আমরা কোথা থেকে এসেছি (বর্তমান ঘর থেকে দরজাটি আমাদের আগের ঘরে ফিরে যায়)।
  • আমরা যখন প্রস্থান করতে পৌঁছাতে পারি তখন আমরা চিনতে পারি।
  • প্রতিটি পদক্ষেপ আমরা বর্তমান ঘর থেকে এটি থেকে কিছু উপলব্ধ দরজার দিকে চলে যাই move
  • উদাহরণস্বরূপ আমরা যদি 6 ঘরে থাকি তবে আমরা কেবল শুরু করতে লাফ দিতে পারি না। এটি রোবোট চলাচলের মতো।
  • আমরা ঠিক বর্তমান কক্ষের আইডি জানি। আমরা বর্তমান ঘরে প্রতিটি দরজার আইডি জানি (সমস্ত গোলকধাঁধায় নয়)।
  • আমরা রোবট নিয়ন্ত্রণ করি।

আমি সমস্ত পরিচিত অ্যালগরিদমগুলি দেখেছিলাম তবে সেগুলির জন্য পূর্ববর্তী ঘরে ফিরে আসার জন্য কমপক্ষে অতিরিক্ত ক্ষমতা প্রয়োজন। নির্দিষ্টকরণ অনুসারে আমরা সংক্ষিপ্ততম পথের সন্ধান করে এমন কোনও অ্যালগরিদম ব্যবহার করতে পারি না (আসলে, আমার সবচেয়ে ছোটের প্রয়োজন নেই), কারণ আমরা কেবলমাত্র বর্তমান কক্ষটি সম্পর্কে জানি। আমরা বামে (ডান-) হাতটি অনুসরণ করে অ্যালগোরিদম অনুসরণ করতে পারি না, কারণ প্রস্থানের দিকটি জানেন না। সম্ভবত, একমাত্র সমাধান যা স্পেসিফিকেশনটির সাথে মিলিত হ'ল প্রতিটি ঘরে এলোমেলো প্রস্থানটি বেছে নেওয়াই এই আশায় যে কিছু সময়ের প্রস্থান পাওয়া যাবে ...

আরও স্মার্ট উপায়ে কীভাবে এই ধাঁধাটি সমাধান করবেন?


2
এই হোমওয়ার্ক হয়?
MichaelHouse

2
এটি হোম ওয়ার্কের একটি অংশ। (আমি কি এটি কোনওভাবে চিহ্নিত করব?)। সমস্ত কক্ষের অনন্য আইডি রয়েছে।
কিরিলো এম

2
অঙ্কন কক্ষগুলি যেমন গণনা করা হয়? উচ্চতর সংখ্যার দিকে এগিয়ে যাওয়ার বিষয়ে কিছু হতে পারে? (বা আপনি কোথায় শুরু করেছেন তার উপর নির্ভর করে কম)
মাইকেলহাউস

2
প্রস্থানগুলির তালিকা কি সর্বদা একই ক্রমে থাকে? হিসাবে, আমরা কি যেতে যেতে একটি মানচিত্র তৈরি করতে পারি? আমি কক্ষ 5 তে আছি এবং আমি কক্ষগুলির তালিকার 2 য় কক্ষে যাই, আমি ঘর 4 পাই So সুতরাং এখন আমি সেই ঘরটি 5-> 2 (ঘর 4) জানি।
MichaelHouse

4
@ আরচার, ডাবল-পোস্ট করার সময় আপনাকে আরও উত্তর পেতে পারে - এখন, অন্য কেউ যিনি প্রশ্নের উত্তর চান, তাকে বিভিন্ন সেট উত্তর সহ দুটি পৃথক সাইট সন্ধান করতে হবে । এই কারণেই নিয়মগুলি একক প্রশ্ন চায়, যাতে অন্যান্য লোকের পক্ষে সহায়তা পাওয়া সহজ হয়।
সাইক্লোপস

উত্তর:


3

হুম, আপনি আসল ঘরের সংখ্যা জানেন। সুতরাং আপনি একটি ডেটা কাঠামো তৈরি করতে পারেন। আমি অনুমান করি প্রস্থানগুলির তালিকার সাথে রুম নম্বর সংযুক্ত নেই। তবে এলোমেলোভাবে একটি চয়ন করার পরে, আপনি কমপক্ষে জানেন যে একটি সংযোগ রয়েছে।

বলুন যে আপনি রুম 4 এ আছেন এবং তিনটি র্যান্ডম প্রস্থান থেকে একটি বেছে নিন। এখন সিস্টেম আপনাকে বলে, আপনি 6 ঘরে রয়েছেন এবং কেবলমাত্র একটি প্রস্থান বাকি আছে। আপনি এটি চয়ন করেন এবং ঘরে ফিরে এসেছেন this এই মুহুর্তে আপনি গোলকধাঁটির কাঠামো সম্পর্কে কিছু তথ্য সংগ্রহ করেছেন। আপনি এখন অন্য প্রস্থানটি বেছে নিন এবং রুমে 5 টি সমাপ্তি নির্বাচন করুন room কক্ষ 4 সম্পর্কে মো তথ্য (এক প্রস্থান 6 এ, এক প্রস্থান 5 এ)

আপনি একটি নির্দিষ্ট প্রস্থান চয়ন করতে পারেন? তারা কি নম্বরযুক্ত, বলুন 4 কক্ষে আপনি যদি সর্বদা 6 এ শেষ করেন তবে আপনি প্রস্থান করতে চান? অন্যথায় আপনি কমপক্ষে সম্ভাব্য রুটগুলি সম্পর্কে সন্ধান করতে পারেন।

ঠিক আছে, আপনি মন্তব্য পড়ুন। সুতরাং যদি প্রস্থানগুলিতে আইডি থাকে এবং সেগুলি কোনও কক্ষের সাথে স্থিরভাবে লিঙ্কযুক্ত থাকে (এমনকি শুরুতে কোনটি আপনি জানেন না) আপনি কেবল একটি নতুন চয়ন করেন এবং প্রস্থান / ঘরের সংযোগগুলি মনে রাখবেন এবং কোন প্রস্থানটি ইতিমধ্যে চেষ্টা করা হয়েছিল তা মনে রাখবেন। যতক্ষণ না আপনি প্রতিটি একক কক্ষ অনুসন্ধান করেছেন ততক্ষণ অবিরত প্রস্থানের চেষ্টা করুন।

এই উপায় এটি আসলে সহজ। কয়েকটি পদক্ষেপের পরে আপনার সংযোগগুলির কম-বেশি সম্পূর্ণ তালিকা থাকা উচিত। আপনি যখন কোনও নতুন ঘরে প্রবেশ করেন কেবল তখনই আপনি (কয়েক ধাপের জন্য) এলোমেলোভাবে দৌড়াতে পারেন। তবে প্রতিটি পদক্ষেপের সাহায্যে আপনি আরও তথ্য পান এবং যখনই আপনি এর আগে দেখা কোনও ঘরে প্রবেশ করেন, আপনি একটি স্মার্ট সিদ্ধান্ত নিতে পারেন (উদাহরণস্বরূপ যখন আপনি 4 এ ফিরে পাবেন তখন এটি পুনরায় পরীক্ষা না করা, যেহেতু এটির অনির্ধারিত কোনও প্রস্থান নেই)।

সম্পাদনা ধারণাটি হ'ল প্রথমে এলোমেলো পদক্ষেপ নেওয়া এবং আমি বর্ণিত হিসাবে আপনি যে তথ্য খুঁজে পান তা লগ করা (ড্যানের বিবরণটি আরও সংক্ষিপ্ত)। যদি আপনি কোনও অজানা প্রস্থান না করে এমন কোনও ঘরে নিজেকে খুঁজে পান তবে আপনি যে ঘরটি এখনও সন্ধান করেননি সেখান থেকে বেরিয়ে আসা ঘরে সবচেয়ে সংক্ষিপ্ততম উপায়টি খুঁজে পেতে আপনি কোনও পরিচিত পাথফাইন্ডার ব্যবহার করতে পারেন।

100% নিশ্চিত নয়, তবে আমার কাছে মনে হয় পিটার নরভিগ তাঁর "কৃত্রিম বুদ্ধিমত্তা: একটি আধুনিক পদ্ধতির" বইটিতে একটি অনুরূপ সমস্যা (দ্য উইম্পাস ধাঁধা) সম্পর্কে লিখেছেন। যদিও আমি সঠিক মনে রাখছি, এটি পথের সন্ধান সম্পর্কে কম ছিল এবং প্রতিবেশী কক্ষগুলি সম্পর্কে সিস্টেমটি পেতে পারে এমন কিছু তথ্য সম্পর্কে সিদ্ধান্ত গ্রহণের বিষয়ে বেশি ছিল।

সম্পাদনা:

না, এটি কেবল এলোমেলো নয়। ইতিমধ্যে চেষ্টা করা প্রস্থানগুলি ট্র্যাক করে আপনি অপ্রয়োজনীয় অপ্রয়োজনীয়তা অপসারণ করেন। আসলে আপনার এলোমেলোভাবে পছন্দ করার দরকার নেই।

ধরুন আপনি ঘরে in শুরু করেছেন 4. তথ্য আপনি পাবেন: 3, এ, বি, সি প্রস্থান করে আপনি সর্বদা এখন অব্যবহৃত প্রস্থান করে প্রথমটি পছন্দ করেন। সুতরাং এ দিয়ে শুরু করুন You ঘরে আপনি শেষ করেন Now এখন আপনার মনে আছে 4 এ => 6 (এবং ব্যবহৃত) 6 টি রুমে আপনি তথ্যটি 1 প্রস্থান পাবেন এবং আবার আপনি প্রথম অব্যবহৃতটিকে বেছে নিন (এবং এই ক্ষেত্রে কেবল প্রস্থান করুন) ঘরে ফিরে আসুন 6 এ => 4 জানার জন্য (এবং 6 ঘরে আর বেরোবে না) এখন আপনি পরবর্তী প্রস্থান বি চয়ন করুন এবং রুম 5 এ পৌঁছান ...

যত তাড়াতাড়ি বা পরে আপনি সমস্ত কক্ষ সেভাবে সন্ধান করবেন। তবে নিয়মতান্ত্রিক বিষয়ে।

আপনার কী পাথ সন্ধানের প্রয়োজন হবে তার একমাত্র কারণ হ'ল যখন আপনি নিজেকে এমন ঘরে খুঁজে পান যেখানে সমস্ত প্রস্থান ইতিমধ্যে অন্বেষণ করা হয়েছে। তারপরে আপনি নিজের অনুসন্ধানের সাথে নিজস্ব হওয়ার জন্য অপরিবর্তিত বহির্গমন সহ পরবর্তী ঘরে সরাসরি পথ সন্ধান করতে চাইবেন। সুতরাং কোন কৌশলটি বাইরে বেরোন তা কোন ঘরে পৌঁছায় (যদিও এটি সহায়ক হতে পারে) তবে এখনও চেষ্টা না করে বেরোনোর ​​ট্র্যাক রাখা মুখ্য কৌশলটি কম।

উদাহরণস্বরূপ আপনি এই সময় সর্বদা চেনাশোনাগুলিতে দৌড়ানো এড়াতে পারেন, নিখুঁত এলোমেলো পদ্ধতির জন্য কী ঝুঁকি হবে।

আপনার উদাহরণের মধ্যে গোলকধাঁধাটি সম্ভবত খুব বেশি গুরুত্ব পাবে না। তবে অনেকগুলি কক্ষ এবং সংযোগ এবং সম্ভবত কৌশলযুক্ত বিজ্ঞপ্তিযুক্ত কক্ষগুলির সাথে একটি বৃহত ধাঁধাতে এই সিস্টেমটি গ্যারান্টি দেয় যে আপনি যতটা সম্ভব ট্রায়াল সহ প্রস্থানটি খুঁজে পাবেন।

(আমি মনে করি এটি সম্ভবত একই সিস্টেমটি বাইট 5 এর সাথে গেমার্সে এসেছিল)


হ্যাঁ, আমি ঘর থেকে বাইরে নির্দিষ্ট প্রস্থান (দরজা) বেছে নিতে পারি। তাদের অনন্য আইডি রয়েছে। সুতরাং, আপনার পরামর্শটি হল প্রথমে পূর্ণ গোলকধাঁধাটি অন্বেষণ করা এবং তারপরে কোনও পরিচিত অ্যালগরিদম ব্যবহার করা?
কিরিলো এম

আমি প্রোগ্রামটি লিখতে শুরু করেছি এবং একটি নতুন প্রশ্ন পেয়েছি ... প্রথমে আমি সমস্ত সংযোগের সাথে কাঠামো তৈরির জন্য সমস্ত কক্ষ অনুসন্ধান করি। দ্বিতীয় পদক্ষেপ হবে পথ সন্ধান করা। তবে সমস্ত সংযোগ যুক্ত হয়ে গেলে আমি বিল্ডিং বন্ধ করব। তবে
সেভাবেই

10

আমি স্বীকার করেছি যে আপনি সম্ভবত অন্যান্য উত্তরগুলি থেকে টুকরোটি পেয়েছেন, তবে এটি একটি মজাদার প্রশ্ন এবং আমার মনে হয়েছিল যেন অল্প অজগর কোডিং করা হচ্ছে। এটি আমার অবজেক্ট-ভিত্তিক পদ্ধতি 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))

মন্তব্য

ব্যাকট্র্যাকিং খুব দক্ষ নয় - সবচেয়ে খারাপ ক্ষেত্রে এটি সংলগ্ন ঘরে যাওয়ার জন্য প্রতিটি ঘরে গিয়ে যেতে পারে, তবে ব্যাকট্র্যাকিং মোটামুটি বিরল - উপরের পরীক্ষায় এটি কেবল তিনবার ব্যাকট্রাক করে। কোডটি সংক্ষিপ্ত রাখতে আমি ব্যতিক্রম হ্যান্ডলিং এড়ানোর চেষ্টা করেছি। আমার পাইথনে কোনও মন্তব্য প্রশংসিত :)


স্মরণীয় উত্তর! দুঃখজনকভাবে দুটি উত্তর হতে পারে না :( আমি ইতিমধ্যে C # প্রোগ্রাম লেখেন এবং সাধারণত প্রায় একই ধারনা ব্যবহৃত backtracking না জন্য দম গভীর অনুসন্ধানের অ্যালগোরিদমের ব্যবহার করা হয়েছিল।।
Kyrylo এম

4

মূলত, আপনার কাছে একটি নির্দেশিক গ্রাফ রয়েছে, যেখানে প্রতিটি সংযুক্ত ঘর দুটি অজানা প্যাসেজ দ্বারা সংযুক্ত থাকে - উভয় দিকের মধ্যে একটি। বলুন আপনি নোড 1এবং দরজা দিয়ে শুরু করেন Aএবং Bবেরিয়ে যান। আপনি জানেন না প্রতিটি দরজার বাইরে কী রয়েছে তাই আপনি কেবল দরজাটি বেছে নিন A। আপনি রুমে পেতে 2, যা দরজা আছে C, Dএবং E। এখন আপনি যে দরজা জানেন Aরুম থেকে বিশালাকার 1রুমে 2, কিন্তু আপনি ফিরে পেতে কিভাবে জানি না, তাই আপনি এলোমেলোভাবে দরজা বাছাই C। তুমি ঘরে ফিরে যাও 1! এখন আপনি কীভাবে রুম 1এবং এর মধ্যে যেতে পারবেন তা জানেন 2। আপনি প্রস্থানটি না পাওয়া পর্যন্ত সবচেয়ে কাছের অজানা দরজা দিয়ে অন্বেষণ চালিয়ে যান!


4

যেহেতু প্রস্থানগুলি তালিকাতে ঘরগুলি সর্বদা একই ক্রমে থাকে তাই আমরা প্রস্থানটি সন্ধানের জন্য ঘরের একটি দ্রুত মানচিত্র তৈরি করতে পারি।

আমার সিউডো কোডটি কিছুটা জাভিশ, দুঃখিত, আমি এটি ইদানীং ব্যবহার করেছি।

আনভিসিটেড_ রুমস হ্যাশম্যাপ যা একটি রুমের আইডি, এবং ম্যানেজ করা কক্ষগুলির সূচকের তালিকা বা 2 ডি অ্যারে, যা কাজ করে তা।

আমি কল্পনা করি অ্যালগরিদম এরকম কিছু যেতে পারে:

Unvisited_Rooms.add(currentRoom.ID, currentRoom.exits) //add the starting room exits
while(Unvisited_Rooms.Keys.Count > 0 && currentRoom != end) //keep going while there are unmapped exits and we're not at the end
    Room1 = currentRoom
    ExitID = Room1.get_first_unmapped_Room() //returns the index of the first unmapped room
    if(ExitID == -1) //this room didn't have any more unmapped rooms, it's totally mapped
        PathTo(Get_Next_Room_With_Unmapped_Exits) //we need to go to a room with unmapped exits
        continue //we need to start over once we're there, so we don't create false links
    GoToExit(ExitID) //goes to the room, setting current room to the room on the other side
    Room1.Exits[exitID].connection = currentRoom.ID //maps the connection for later path finding
    Unvisited_Rooms[Room1.ID].remove(exitID) //removes the index so we don't worry about it
    if(Unvisited_Rooms[Room1.ID].size < 1) //checks if all the rooms exits have been accounted for
        Unvisited_Rooms.remove(Room1.ID)  //removes the room if it's exits are all mapped
    Unvisited_Rooms.add(currentRoom.ID, currentRoom.unvisited_exits) //adds more exits to the list

If(currentRoom != end && Unvisited_Rooms.Keys.Count < 1)
   print(No exit found!)
else
   print(exit is roomID: currentRoom.ID)

"মানচিত্র" জুড়ে পাথটো () কক্ষগুলিতে আপনাকে একটি সাধারণ নোড পাথ সন্ধানকারী ব্যবহার করতে হবে আশা করি কোনও কিছু শুরু করার জন্য এটি যথেষ্ট পরিস্কার।


@ বাইট 56 - এখানে আপনার চেকমার্কটি হারানো 2/3 এর জন্য একটি আপভোট রয়েছে। :)
সাইক্লোপস

2

আমি আপনার প্রয়োজনীয়তা সম্পর্কে খুব পরিষ্কার নয়, তবে নিম্নলিখিতগুলির অনুমতি থাকলে অ্যালগরিদম অনুসরণ করা সহজ হতে পারে। সম্ভবত সেখানে একটি বাগ রয়েছে, বিশেষত যেহেতু এটি পুনরাবৃত্তি ফাংশন ব্যবহার করে। এছাড়াও, এটি পরীক্ষা করে দেখেছে যে আপনি যে ঘর থেকে এসেছিলেন সেদিকে কোনও দরজা পৌঁছে দেয়, তবে আমি জানি না যে তিনটি ঘরের বৃত্তাকার পথটি কীভাবে পরিচালনা করবে, এটি কেবল তিনটি ঘরে চিরতরে লুপিং রাখতে পারে। কোনও ঘরে দু'বার পরীক্ষা করা হয় না তা নিশ্চিত করতে আপনাকে একটি ইতিহাস যুক্ত করতে হতে পারে। তবে আপনার বিবরণ পড়ে যা অনুমোদিত হতে পারে না।

solved = FALSE

SearchRoom(rooms[0], rooms[0])    // Start at room 1 (or any room)
IF solved THEN
  // solvable
ELSE
  // unsolvable
ENDIF
END

// Recursive function, should run until it searches every room or finds the exit
FUNCTION SearchRoom: curRoom, prevRoom
  // Is this room the 'exit' room
  IF curRoom.IsExit() THEN
    solved = TRUE
    RETURN
  ENDIF

  // Deadend?  (skip starting room)
  IF (curRoom.id <> prevRoom.id) AND (curRoom.doors <= 1) THEN RETURN

  // Search each room the current room leads to
  FOREACH door IN curRoom
    // Skip the room we just came from
    IF door.id <> prevRoom.id THEN
      SearchRoom(door, curRoom)
    ENDIF
    IF solved THEN EXIT LOOP
  NEXT

  RETURN
ENDFUNCTION

[সম্পাদনা] পূর্ববর্তী চেকটিতে 'আইডি' যুক্ত করা হয়েছে এবং আরও অবজেক্ট ওরিয়েন্টেড করার জন্য আপডেট করা হয়েছে।


1
আমি কোথা থেকে এসেছি প্রতিটি পদক্ষেপে আমি জানি না। সুতরাং, এই অ্যালগরিদমগুলি কার্যটি সমাধান করে না। তবে চেষ্টা করার জন্য ধন্যবাদ।
কিরিলো এম

3
সুতরাং আপনি বলছেন যে আপনি আগের ঘরটি জানার অনুমতি নেই? অথবা আপনি আগের ঘরটি জানেন না? উপরের কোডটি আপনার জন্য আগের কক্ষগুলি ট্র্যাক করে। যদি আপনাকে জানার অনুমতি না পাওয়া যায় তবে আমি মনে করি না যে 'x' এর প্রচেষ্টার জন্য এলোমেলোভাবে ধাঁধাটিকে পুনরাবৃত্তি করা ছাড়া অন্য কোনও বৈধ সমাধান আছে, এবং যদি আপনি কোনও প্রস্থান খুঁজে না পান, তবে আপনি ধাঁধাটি অবিশ্বাস্য বলে ধরে নিতে পারবেন ।
ডগ.এমসিফারলেন

1
"আমি জানি না"। আমি আবার কোড তাকাল। দ্বিতীয় সমস্যাটি হ'ল পুনরাবৃত্তি ব্যবহার করা সমস্যাযুক্ত। ভাবুন, আপনি এমন ধাঁধার ভিতরে রয়েছেন। প্রস্থানটি খুঁজে পেতে আপনি পুনরাবৃত্তির অ্যালগরিদম কীভাবে ব্যবহার করবেন?
কিরিলো এম

এছাড়াও, আপনি 6 ঘরে শুরু করলে কী হবে? curRoom.doors <= 1সুতরাং, ফাংশনটি অবিলম্বে ফিরে আসবে, এই জেনে যে এটি একটি মৃতপ্রান্তে রয়েছে, কিন্তু এই ভেবে যে এটি ইতিমধ্যে গোলকধাঁটির সম্পূর্ণতা সন্ধান করেছে।
dlras2

এটি নিকটে, তবে দৈর্ঘ্যের গ্রাফের মধ্যে চক্র দুটি বেশি হলে এটি স্ট্যাকটি ফুটিয়ে তুলবে।
উপুড়হস্ত

1

সংক্ষিপ্ত উত্তরটি ব্যাকট্র্যাকিংয়ের সাথে গভীরতার প্রথম অনুসন্ধান is আপনি যদি চান তবে আপনি প্রস্থে প্রথম করতে পারেন, তবে আপনার ছোট্ট রোবট তখন অনেক পিছনে পিছনে হাঁটবে।

আরও দৃ concrete়ভাবে, ধরুন আমাদের দেওয়া হয়েছে:

// Moves to the given room, which must have a door between
// it and the current room.
moveTo(room);

// Returns the list of room ids directly reachable from
// the current room.
getDoors();

// Returns true if this room is the exit.
isExit();

প্রস্থানটি খুঁজে পেতে, আমাদের কেবল প্রয়োজন:

void escape(int startingRoom) {
  Stack<int> path = new Stack<int>();
  path.push(startingRoom);
  escape(path);
}

boolean escape(Stack<int> path) {
  for (int door : getDoors()) {
    // Stop if we've escaped.
    if (isExit()) return true;

    // Don't walk in circles.
    if (path.contains(door)) continue;

    moveTo(door);
    path.push(door);
    if (escape(path)) return true;

    // If we got here, the door didn't lead to an exit. Backtrack.
    path.pop();
    moveTo(path.peek());
  }
}

escape()স্টার্ট রুমের আইডি সহ কল করুন এবং এটি রোবটটি প্রস্থান করতে (কল করে moveTo()) প্রস্থান করবে ।


আমার কাছে escape(int startingRoom)কল করা উচিত বলে মনে হয়escape(Stack<int> path)
সিসকোআইপিফোন

1
আমি মনে করি if (path.contains(door)) continue;তার প্রয়োজনীয়তা লঙ্ঘন করেছে - এজেন্ট আসলে জানে না যে কোনও দরজা যদি কোনও ঘরে ফিরে যায় তবে সে ইতিমধ্যে সেখানে ছিল তবে যদি সে দরজা দিয়ে না যায়।
সিসকোআইপিফোন

ধন্যবাদ, স্থির! হ্যাঁ, এখন আমি প্রয়োজনীয়তাগুলি দেখছি, সমস্যাটি একটু ফিশ করে মনে হচ্ছে। আপনি যদি ব্যাকট্র্যাক করতে না পারেন তবে সর্বোত্তম আপনি যা আশা করতে পারেন তা এলোমেলো হাঁটা।
উপুড়হস্ত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.