ধরে নিই যে আমি একজন প্রোগ্রামার এবং আমার একটি এনপি-সম্পূর্ণ সমস্যা রয়েছে যা আমার এটি সমাধান করা দরকার। এনপিসি সমস্যা মোকাবেলায় কোন পদ্ধতি উপলব্ধ? এই বিষয়ে কোন সমীক্ষা বা অনুরূপ কিছু আছে?
ধরে নিই যে আমি একজন প্রোগ্রামার এবং আমার একটি এনপি-সম্পূর্ণ সমস্যা রয়েছে যা আমার এটি সমাধান করা দরকার। এনপিসি সমস্যা মোকাবেলায় কোন পদ্ধতি উপলব্ধ? এই বিষয়ে কোন সমীক্ষা বা অনুরূপ কিছু আছে?
উত্তর:
বেশ কয়েকটি সু-অধ্যয়নিত কৌশল রয়েছে; আপনার অ্যাপ্লিকেশন সেরা যা পরিস্থিতি উপর নির্ভর করে।
সবচেয়ে খারাপ ক্ষেত্রে রানটাইম উন্নত করুন
সমস্যা-নির্দিষ্ট অন্তর্দৃষ্টি ব্যবহার করে, আপনি প্রায়শই নিখুঁত অ্যালগরিদমকে উন্নত করতে পারেন। উদাহরণস্বরূপ, সি < 1.3 [1]সহ ভার্টেক্স কভারের জন্য অ্যালগরিদম রয়েছে; এই একটি হল বিশাল উন্নতি সাদাসিধা উপর Ω ( 2 এন ) এবং উদাহরণস্বরূপ প্রাসঙ্গিক মাপ আপনি সহজে টানা যায় এমন জন্য করা হতে পারে।
হিউরিস্টিক্স ব্যবহার করে প্রত্যাশিত রানটাইম উন্নত করুন , আপনি প্রায়শই অ্যালগরিদমগুলি তৈরি করতে পারেন যা অনেক ক্ষেত্রে দ্রুত fast সেগুলির মধ্যে যদি আপনি অনুশীলনের সাথে মিলিত হন তবে আপনি সোনার হন। উদাহরণগুলি হ'ল স্যাট, যার জন্য যথেষ্ট জড়িত সমাধানকারী উপস্থিত রয়েছে এবং সিম্প্লেক্স অ্যালগরিদম (যা একটি বহুপদী সমস্যা সমাধান করে, তবে এখনও)। একটি প্রাথমিক কৌশল যা প্রায়শই সহায়ক হয় শাখা এবং আবদ্ধ ।
সমস্যাটি সীমাবদ্ধ করুন
আপনি যদি নিজের ইনপুটগুলিতে আরও অনুমান করতে পারেন তবে সমস্যাটি সহজ হতে পারে।
ফলাফলটি
দুর্বল হয়েছে এর অর্থ হ'ল আপনি ভুল বা অসম্পূর্ণ ফলাফল সহ্য করছেন। দুটি প্রধান স্বাদ রয়েছে:
পড়ুন হার্ড সমস্যা রয়েছে Algorithmics একটি পুঙ্খানুপুঙ্খ চিকিৎসার জন্য Hromkovič দ্বারা।
অন্যান্য উত্তর এটিকে আরও তাত্ত্বিক দৃষ্টিকোণ থেকে সম্বোধন করেছে। এখানে একটি আরও ব্যবহারিক পদ্ধতির।
"টিপিক্যাল" এনপি-সম্পূর্ণ সিদ্ধান্ত সমস্যার জন্য ( "এমন কোনও বিষয় রয়েছে যা এই সমস্ত বাধাগুলিকে সন্তুষ্ট করে?" ), আমি সর্বদা এই চেষ্টা করবো:
একটি সাধারণ প্রোগ্রাম লিখুন যা আপনার সমস্যার উদাহরণটিকে স্যাট উদাহরণ হিসাবে এনকোড করে ।
তারপরে একটি ভাল SAT সলভার নিন , এটি চালান (আপনার কাছে যে দ্রুততম মাল্টি-কোর কম্পিউটার রয়েছে তা ব্যবহার করে) এবং দেখুন কী ঘটে।
এটি কতটা সময় নিতে পারে সে সম্পর্কে ধারণা পেতে প্রথমে ছোট ছোট উদাহরণ দিয়ে চেষ্টা করুন।
আশ্চর্যের বিষয় প্রায়শই, আপনার বর্তমান সমস্যার জন্য বিশেষত আপনার নিজস্ব সমাধানকারী প্রয়োগ করার চেষ্টা করার চেয়ে এই পদ্ধতিরটি অনেক ভাল:
স্যাট সলভারগুলি খুব চালাক এবং ভাল-অনুকূলিত। তারা সহজেই আপনার নিজের ব্যাকট্র্যাকিং অনুসন্ধানের প্রয়োগকে কার্যকর করে তুলবে (আপনি নিজের কোডটি অনুকূলিতকরণে যত সময় ব্যয় করেন না)। তারা সহজেই বহুসংখ্যক স্ব-স্ব বিকল্প যেমন ইন্টিজার লিনিয়ার প্রোগ্রামিং সলভার্সকে ছাড়িয়ে যায়।
এর জন্য খুব কম প্রোগ্রামিং দরকার। পদক্ষেপ 1 তুলনামূলকভাবে সহজ এবং এটি কর্মক্ষমতা-সমালোচনা নয়; আপনি পাইথনের মতো স্ক্রিপ্টিং ভাষা ব্যবহার করতে পারেন। আপনার পদক্ষেপ 2 এর জন্য প্রয়োজনীয় সমস্ত কিছু ইতিমধ্যে অন্য কেউ বাস্তবায়নের যত্ন নিয়েছে।
সাধারণ এনপি-হার্ড অপ্টিমাইজেশান সমস্যার জন্য ( "সবচেয়ে ছোট জিনিসটি আবিষ্কার করুন যা এই সমস্ত সীমাবদ্ধতাগুলিকে সন্তুষ্ট করে" ) এই পদ্ধতির কাজ বা নাও হতে পারে।
আপনি যদি এটিকে সহজেই সিদ্ধান্তের সমস্যায় পরিণত করতে পারেন ( "4 মাপের এমন কি কিছু আছে যা এই সমস্ত বাধাগুলি পূরণ করে?" , "আকার 3 সম্পর্কে কী?" ) দুর্দান্ত, সিদ্ধান্তের সমস্যাগুলির সাথে উপরের মত একই পদ্ধতি অনুসরণ করুন।
অন্যথায়, আপনি একটি হিউরিস্টিক সলভার অবলম্বন করতে চাইতে পারেন যা একটি ছোট সমাধান (অগত্যা সবচেয়ে ছোট সমাধানটি নয়) সন্ধান করার চেষ্টা করে। উদাহরণ স্বরূপ:
আপনার সমস্যাটিকে একটি (ওজনযুক্ত) ম্যাক্স-স্যাট উদাহরণ হিসাবে এনকোড করুন ।
ইউবিসিএসএটি প্যাকেজ থেকে তাত্পর্যপূর্ণ সমাধানকারী ব্যবহার করুন । হিউরিস্টিক সলভারগুলি তুচ্ছভাবে সমান্তরালভাবে; শত শত কম্পিউটার সহ একটি কম্পিউটার ক্লাস্টার সন্ধান করার চেষ্টা করুন। আপনি যতক্ষণ চান সলভারগুলি চালাতে পারেন এবং তারপরে আপনি এ পর্যন্ত খুঁজে পাওয়া সেরা সমাধানটি নিতে পারেন।
আন্তঃব্যক্তির আক্রমণ করার একটি উপায় হ'ল প্যারামাইট্রাইজড জটিলতার প্রসঙ্গে সমস্যাটি নিয়ে চিন্তা করা।
এগুলি ডব্লু হায়ারার্কির বিভিন্ন শ্রেণির কয়েকটি নমুনা:
এগুলি এনপি সমস্যাগুলিকে আরও সুনির্দিষ্ট উপায়ে শ্রেণিবদ্ধ করার জন্য জটিলতার আরও একটি স্তর এবং আপনি যদি আরও কিছু চান তবে আপনি প্যারামিটারাইজড সার্কিট জটিলতা এবং ডাবনাই এট আল (1998) দ্বারা ডাব্লু হায়ারার্কি দেখতে পারেন ।
আপনি যদি আরও কিছু চান তবে ফ্লুম এবং গ্রোহের প্যারামিটারাইজড কমপ্লেক্সিটি থিওরিটি পড়তে ভাল ।
এবং পরিশেষে:
এটা তোলে পরিচিত সমস্যাটি FPTAS (পুরোপুরি আছে যা বহুপদী টাইম পড়তা স্কীম ) তাহলে এটি FPT (যা সুস্পষ্ট) এর কিন্তু কিছুই ভাল বিপরীত দিক পরিচিত আছে, সেখানে পিটিএ র এবং XP সম্পর্ক কিছু কাজ, কিন্তু পিটিএএস এবং ডাব্লু হায়ারার্কির মধ্যে খুব দৃ tight় সম্পর্ক নয় (কমপক্ষে আমি এই মুহুর্তে জানি না)।
এছাড়াও কিছু ক্ষেত্রে আমরা কিছু আলাদা প্যারামিটারগুলি ঠিক করতে পারি, যেমন: গ্রাফের দীর্ঘতম পাথের দৈর্ঘ্য সীমিত হয় এবং একটি সমাধানের আকার বেঁধে দেওয়া হয় (উদাহরণস্বরূপ প্রতিক্রিয়া ভার্টেক্স সেটটিতে), ...
কিছু লোকের বিশ্বাস হতে পারে যে প্যারামেট্রাইজড জটিলতা অনুশীলনে অকেজো। তবে এটি ভুল। প্যারামেট্রাইজড অ্যালগরিদমগুলি অনেকগুলি বাস্তব বিশ্বের অ্যাপ্লিকেশনগুলিতে সন্ধান করা হয়, যখন আপনি কিছু প্যারামিটারগুলি ঠিক করতে পারেন, এখানে একটি উদাহরণ রয়েছে:
টিএসপি-র অন্যতম দ্রুত এবং সঠিক হিউরিস্টিক অ্যালগরিদম হ'ল: ট্যুর মার্জিং এবং ব্রাঞ্চ পচন , যা সমস্যার প্যারামিট্রাইজেশন ব্যবহার করে (সরাসরি নয়, তবে শাখা পঁচা এবং তারা ব্যবহার করে গতিশীল প্রোগ্রামিং পদ্ধতির কিছু ভাল অনুমানের উপর ভিত্তি করে)।
এনপি সম্পূর্ণতা সবচেয়ে খারাপ ক্ষেত্রে অক্ষমতার সম্পর্কে। আপনি কোন সমস্যায় কাজ করছেন তার উপর নির্ভর করে অনুশীলনের উপযুক্ত সময়ে বেশিরভাগ ক্লাসের দাবী সমাধানযোগ্য হতে পারে (যদিও ভাল রানটাইম পেতে আপনার আরও বিশেষায়িত অ্যালগরিদমের প্রয়োজন হতে পারে)।
আপনার সমস্যার সমাধান থেকে ভাল সমাধানকারী যেমন বুলিয়ান সন্তুষ্টিযোগ্যতা বা পূর্ণসংখ্যার লিনিয়ার প্রোগ্রামিংয়ের ক্ষেত্রে কোনও সমস্যার হ্রাস রয়েছে কিনা তা বিবেচনা করুন।
যদিও কয়েকটি উত্তরে সংক্ষিপ্তভাবে স্পর্শ করা হয়েছে, তবে আমি জোর দিয়ে বলি যে বাস্তবে এনপি-সম্পূর্ণ সমস্যাগুলি সর্বদা সমাধান করা হয় (বা আনুমানিক)। অনুশীলনে আপনি এনপি-সম্পূর্ণ সমস্যাগুলি সমাধান করতে পারার প্রধান কারণ হ'ল:
বাস্তবে যেসব পরিস্থিতি দেখা গেছে সেগুলি "সবচেয়ে খারাপ ক্ষেত্রে" নয়।
এই তাত্পর্য হওয়ার আরেকটি কারণ হ'ল:
আনুষ্ঠানিকভাবে হিউরিস্টিক অ্যালগরিদম বিশ্লেষণ করা কঠিন।
অনুশীলনে, আপনি আপনার এনপি-সম্পূর্ণ সমস্যাগুলি সমাধান করতে হিউরিস্টিক অ্যালগরিদম ব্যবহার করেন এবং সেরাটির জন্য আশা করেন। ফলাফলগুলি প্রায়শই অত্যাশ্চর্য হয়।
অন্যান্য উত্তরে স্পষ্ট করা আরেকটি বিষয় হ'ল:
কখনও কখনও ক্ষতিকারক অ্যালগরিদমগুলি যথেষ্ট দ্রুত।
অবশ্যই সমস্যা উপর নির্ভর করে। যখন বড় ডেটা জড়িত থাকে তখন আমাদের বিপরীত সর্বোচ্চটি থাকে:
কখনও কখনও কেবল সম্ভাব্য অ্যালগরিদমগুলি হল ক্যাসিলিনিয়ার।
আমি ভয় করি যে এখানে ভিড় বরং তাত্ত্বিকভাবে ঝোঁকযুক্ত। আপনি মূল স্ট্যাকেক্সচেঞ্জ সাইটে আরও ভাল উত্তর পেতে পারেন।