সি ++ এ ব্যাকট্র্যাকিং বোঝা


12

আমার সি ++ এর মূলসূত্রগুলির একটি ভাল বুনিয়াদি বোধগম্যতা রয়েছে, পুনরাবৃত্তিটি কীভাবে কাজ করে তাও আমার একটি বোধগম্য। আমি ক্লাসিকিক আট রানী সমস্যা এবং ব্যাকট্র্যাকিংয়ের সাথে সুডোকু সমাধান করার মতো কিছু সমস্যা পেয়েছি ।

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

এটি সহায়ক হবে যদি ব্যাকট্র্যাকিংয়ের শুরুতে লক্ষ্য করা কোনও টিউটোরিয়াল থাকে বা কোনও ভাল বই ছিল যেখানে এটি আবৃত ছিল। যদি কেউ এই বিষয়ে আলোকপাত করতে পারেন বা শালীন উল্লেখের জন্য আমাকে কিছু লিঙ্ক দিতে পারেন, আমি সত্যিই কৃতজ্ঞ হব।

এবং হ্যাঁ আমি জানি যে এটি কার্যকরী ভাষাগুলিতে আরও সহজ হবে তবে আমি অবশ্যম্ভাবী ভাষাগুলিতেও বাস্তবায়ন বুঝতে চাই।


আমি মনে করি এটি একটি ভাল প্রশ্ন, তবে আমি মনে করি টিউটোরিয়াল বা অন্যান্য সংস্থান জিজ্ঞাসা করার বিষয়ে কাউকে ব্যাকট্র্যাকিংয়ের ব্যাখ্যা দেওয়ার জন্য অনুরোধটি জোর দেওয়া ভাল be গভীরতার একটি ব্যাখ্যা ধরণের উত্তর যে কোনও দিন রেফারেন্সের তালিকাকে মারধর করে।
অ্যাডাম লিয়ার

কেউ সঠিক ব্যাখ্যা দিতে পারে তা নিখুঁত হবে, তবে আমি রেফারেন্সগুলি পড়তে আপত্তি করব না। এটা ঠিক যে আমি কোথা থেকে শুরু করব জানি না।
নিখিল

উত্তর:


9

... সমস্যাটি সমাধানের জন্য পুনরাবৃত্তি স্ট্যাকটিতে ফিরে যাওয়ার এবং আবার শুরু করার ধারণাটি সম্পর্কে আমি আমার মন পেতে সক্ষম হতে পারি না ।

ব্যাকট্র্যাকিংয়ে আপনি আবার শুরু করছেন না। পরিবর্তে, আপনি বর্তমান পরিস্থিতিতে সমস্ত বিকল্পের মাধ্যমে পুনরাবৃত্তি।

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

সম্পাদনা : নীচেরটি একটি সিউডো কোড যা ব্যাকট্র্যাকিং বোঝার জন্য সহায়তা করে।

# depending on the problem, backtracking is not necessarily calling the
# method itself directly. for now, let's just stick with the simple case.

def backtracking(state)
  option_list = state.get_all_options
  option_list.each {|option|
    state.apply option
    return resolved if state.is_resolved
    return resolved if backtracking(state) == resolved
    state.undo option
  }
  return not_resolved
end

8 কিউ প্রশ্নের জন্য:

  • state.get_all_options পরবর্তী রানির জন্য সম্ভাব্য পদের তালিকা ফিরিয়ে আনবে
  • state.is_resolve পরীক্ষা করে যদি সমস্ত রানী বোর্ডে থাকে এবং তারা একে অপরের সাথে ভাল থাকে with
  • state.apply এবং state.undo কোনও পজিশনিং প্রয়োগ বা পূর্বাবস্থায় ফেলার জন্য বোর্ডকে সংশোধন করবে।

একটি অ্যাসাইনমেন্টের জন্য আমি প্রথম পুনরাবৃত্ত কোডটি লিখেছিলাম (1984 সালে পাস্কাল ব্যবহার করে) একটি গোলকধাঁধা সমাধান অ্যালগরিদম।
গেরি

এমন কিছু সাধারণ কার্যকারিতা সম্পর্কে জানুন যেখানে আমি এই স্টাফটির প্রকৃত অনুভূতি পেতে কোডটি লিখতে পারি।
নিখিল

@ নিখিল: আপনি জিজ্ঞাসা করছেন কিছু সাধারণ সমস্যা আছে কিনা? ব্যাকট্র্যাকিংয়ের জেনেরিক রাউটিংটি প্রদর্শনের জন্য কিছু ছদ্ম কোড লিখাই ভাল। আমি একটি উত্তর পরে পরে চেষ্টা করব।
কোডিজম

হ্যাঁ ঠিক, এটি সবচেয়ে সহায়ক হবে।
নিখিল

আপনাকে অনেক ধন্যবাদ, আমি ইদানীং কিছু জিনিস পড়ছি। ধীরে ধীরে তবে ধীরে ধীরে আমার বোঝার উন্নতি হচ্ছে improving
নিখিল

5

আপনি একটি বাইনারি গাছ হাঁটার একটি প্রোগ্রাম দেখেছেন, তাই না? দেখে মনে হচ্ছে:

void walk(node* p){
  if (p == NULL) return;  // this is backtracking
  else if (WeWin(p)){
    // print We Win !!
    // do a Throw, or otherwise quit
  }
  else {
    walk(p->left);   // first try moving to the left
    walk(p->right);  // if we didn't win, try moving to the right
                     // if we still didn't win, just return (i.e. backtrack)
  }
}

আপনার ব্যাকট্র্যাকিং আছে।

আপনার আসলে কোনও শারীরিক গাছের দরকার নেই। আপনার যা যা দরকার তা হ'ল একটি চালচলন এবং পরে এটি পূর্বাবস্থায় ফেলা, বা আপনি জিতেছেন কিনা তা বলুন বা আপনি আর যেতে পারছেন না তা বলুন।


1
সাবট্রিতে সলিউশন পাওয়া যায় কিনা তা পরীক্ষা করে দেখতে আপনি কোনও বুল / ইনট ফিরিয়ে দিতে পারবেন না? প্রত্যাশিত ফলাফলের else{return walk(p->left)||walk(p->right));}জন্য নিক্ষেপের দরকার নেই
র‌্যাচেট ফ্রিক

@ র্যাচেট: একেবারে। এটি এটি করার একটি পুরোপুরি ভাল উপায়। (আমি কেবল উদাহরণটিকে নষ্ট করে দেওয়ার চেষ্টা করছিলাম I আমি আসলে এটি আপনার পথে করব))
মাইক ডুনলাভে

বাস্তবে মাইকডুনলাভে কাটিং এক ধরণের গুরুত্বপূর্ণ।
jupp0r
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.