আমি কীভাবে একটি হিউরিস্টিক অ্যালগরিদম পরীক্ষা করব?


10

বলুন আমাদের কাছে আলগরিদম সন্ধানের রুট রয়েছে:

def myHeuristicTSP(graph):
    /*implementation*/
    return route

এখন আমরা এটি পরীক্ষা করতে চাই:

class TestMyHeuristicTSP:
    def testNullGraphRaiseValueError(self):
        self.assertRaises(ValueError, myHueristicTSP(None))

    def testSimpleTwoNodeGraphReturnsRoute:
        self.assertEquals(expectedResult, myHeuristicTSP(input))

প্রশ্নটি হল, একটি অ-হিউরিস্টিক টিএসপি অ্যালগরিদমের জন্য, আমরা বিভিন্ন ধরণের গ্রাফ দিতে পারি এবং পরীক্ষা করতে পারি যে তারা সর্বদা স্বল্পতম রুটে ফিরে আসে।

তবে যেহেতু হেরিস্টিক অ্যালগরিদম, যদিও এখনও নির্দ্বিধায় রয়েছে, কম অনুমানযোগ্য, কেবল এটি বোঝার জন্য কীভাবে অ্যালগরিদমকে কাজ করা বোঝানো হয়, এবং এই প্রান্তের কেসগুলি খুঁজে পাওয়া যায়?


উত্তর:


11

আদর্শ হিসাবে প্রত্যাবর্তন না করে একটি "যথেষ্ট যথেষ্ট" সমাধান হিসাবে প্রত্যাশিত একটি হিউরিস্টিক অ্যালগরিদমের জন্য আপনার কাছে বিভিন্ন পরীক্ষা-নিরীক্ষা এবং পরীক্ষা করা হবে

  1. সমাধান কি আসলে বৈধ? আপনি অবশ্যই নিশ্চিত করতে চাইছেন যে আপনার রুট-সন্ধানের অ্যালগরিদম যে পথগুলি অসম্ভব বা যেটি আসলে শুরু থেকে শেষের দিকে নিয়ে যায় না তা ফেরায় না। আপনি সমাধানটি আদর্শ হিসাবে প্রমাণ করতে সক্ষম নাও হতে পারেন তবে আপনি অন্তত যা মূল্য ফেরৎ মূল্য তা সমাধান তা যাচাই করতে সক্ষম হবেন ।
  2. সমাধান "যথেষ্ট ভাল"? আপনার কিছু প্রয়োজনীয়তা থাকতে হবে যা নির্ধারণ করে যে অ্যালগোরিদম আদর্শ সমাধানের চেয়ে কতটা খারাপ হতে পারে। আপনার কাছে এমন পরীক্ষার কেস থাকতে হবে যেখানে আদর্শ সমাধানটি পরিচিত (বা কমপক্ষে এমন একটি সমাধান যা তুলনামূলক মান হিসাবে ব্যবহার করার পক্ষে যথেষ্ট ভাল বলে বিবেচিত হয়) এবং নিশ্চিত করুন যে অ্যালগরিদমের দ্বারা সরবরাহ করা সমাধানটি x% এর চেয়ে খারাপ নয়।
  3. অ্যালগরিদম কি যথেষ্ট দ্রুত? আপনি প্রায়শই একটি তাত্ত্বিক দৃষ্টিভঙ্গি ব্যবহার করেন যখন আপনি ধারনা করেন যে তারা আরও দ্রুত হয়ে তাদের যথার্থতার অভাবের জন্য মেক আপ করে। এটি যাচাই করার জন্য আপনার তাদের রানটাইম পরিমাপ করা উচিত এবং নিশ্চিত হওয়া উচিত যে তারা একটি অ্যালগরিদমের তুলনায় প্রকৃতপক্ষে দ্রুততর যা সঠিক সমাধানটি পেয়েছে। রানটাইম পরিমাপ সবসময় কিছুটা অস্পষ্ট থাকে, সুতরাং প্রত্যাশিত রানটাইম ছাড়িয়ে যাওয়া একটি ত্রুটি নয় (যখন আপনার ইউনিট পরীক্ষার কাঠামো সতর্কতা এবং ত্রুটির মধ্যে পার্থক্য করতে দেয়)।

আপনি কীভাবে আপনি নির্ধারণ করবেন যে কোনও রুটটি বৈধ?
দ্বিজোহনস্টন

@dwjohnston কেবল আপনার গ্রাফটি ধরুন, আপনার পথ ধরুন এবং আপনার গ্রাফের উপর দিয়ে পথটি অতিক্রম করার চেষ্টা করুন। যাচাই করুন যে পাথের প্রতিটি প্রান্তটি বর্তমান নোড থেকে শুরু করছে এবং সঠিক নোডে পথটি শুরু এবং শেষ হবে। আপনিও যাচাই করতে পারেন যে শেষ-নোড শেষের আগে পৌঁছেছে না।
ফিলিপ

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

3

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

যে কোনও ধরণের জটিল অ্যালগরিদমের জন্য ভাল ইউনিট টেস্ট তৈরি করতে আসলে একজনকে আসলে অ্যালগরিদম নিজেই বিস্তারিত জানতে হবে । "পাহাড়ী আরোহণ" এর মতো সাধারণ হিউরিস্টিকের জন্য আপনি সাধারণত ছোট ইনপুটগুলির ফলাফলের পূর্বাভাস দিতে পারেন। উদাহরণস্বরূপ, 3 থেকে 5 পয়েন্টের প্রাথমিক রুটের জন্য, যখন একটি নির্দিষ্ট ক্রমে দেওয়া হয়, আপনি ভবিষ্যদ্বাণী করতে পারেন কী হবে। আমি জানি বেশিরভাগ নির্বিচারবাদী হিউরিস্টিক অ্যালগরিদমের ক্ষেত্রে এটি সত্য থাকবে, সুতরাং এটি সম্ভবত একটি ভাল জায়গা শুরু করার জন্য।

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

আপনি যদি ইউনিট-পরীক্ষার সন্ধান করছেন না, তবে স্বয়ংক্রিয়ভাবে গ্রহণযোগ্যতা বা ইন্টিগ্রেশন টেস্টগুলি খুঁজছেন, আপনি @ ফিলিপটি (2) বা (3) এর অধীনে কি প্রস্তাব করেছেন তা চেষ্টা করতে পারেন ।

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