উত্তর:
স্মরণ করুন যে ডিজকস্ট্রার অ্যালগরিদমে একবার একবার একটি শীর্ষবিন্দুটি "বদ্ধ" হিসাবে চিহ্নিত করা হয় (এবং খোলা সেট থেকে বাইরে) - অ্যালগরিদম এটির সবচেয়ে সংক্ষিপ্ত পথ খুঁজে পেয়েছিল এবং আবার কখনও এই নোডটি বিকাশ করতে হবে না - এটি ধরে নিয়েছে যে পথটি বিকশিত হয়েছে পথটি সবচেয়ে ছোট।
তবে নেতিবাচক ওজন সহ - এটি সত্য নাও হতে পারে। উদাহরণ স্বরূপ:
A
/ \
/ \
/ \
5 2
/ \
B--(-10)-->C
V={A,B,C} ; E = {(A,C,2), (A,B,5), (B,C,-10)}
এ থেকে ডিজকস্ট্রা প্রথমে সি বিকাশ করবে এবং পরে এটি ব্যর্থ হবে A->B->C
কিছু গভীরতর ব্যাখ্যা সম্পাদনা করুন:
মনে রাখবেন এটি গুরুত্বপূর্ণ, কারণ প্রতিটি শিথিলকরণের ধাপে, অ্যালগরিদমটি "বদ্ধ" নোডগুলির "ব্যয় "টি প্রকৃতপক্ষে ন্যূনতম বলে ধরে নেওয়া হয় এবং এইভাবে পরবর্তী নোডটিও ন্যূনতম হয়।
এটির ধারণাটি হ'ল: যদি আমাদের কাছে এমন একটি ভার্টেক্স থাকে যাতে এটির ব্যয় ন্যূনতম হয় - যে কোনও ভের্টেক্সে কোনও ধনাত্মক সংখ্যা যুক্ত করে - সংক্ষিপ্ততা কখনই পরিবর্তিত হবে না।
ধনাত্মক সংখ্যার প্রতিবন্ধকতা ছাড়াই - উপরের অনুমানটি সত্য নয়।
যেহেতু আমরা "বদ্ধ" ছিল এমন প্রতিটি প্রান্তকে "জানি" করি না কেন - আমরা "পিছনে ফিরে" ছাড়া নিরাপদে শিথিলকরণের পদক্ষেপটি করতে পারি। আমাদের যদি "ফিরে তাকাতে" দরকার হয় - বেলম্যান-ফোর্ড এটির জন্য একটি পুনরাবৃত্ত-জাতীয় (ডিপি) সমাধান সরবরাহ করে।
A->B
5 এবং A->C
করবে 2 তারপর B->C
হবে -5
। সুতরাং মানটি বেলম্যান-ফোর্ডের সমান C
হবে -5
। কীভাবে এটি সঠিক উত্তর দিচ্ছে না?
A
0 মানের সাথে নোডটি "বন্ধ" করবে, তারপরে এটি ন্যূনতম মূল্যবান নোডের দিকে নজর দেবে, B
এটি 5 এবং C
2 হ'ল ন্যূনতম C
, সুতরাং এটি C
মান 2 সহ বন্ধ হবে এবং কখনই পিছনে ফিরে তাকাবে না পরে B
বন্ধ হয়ে গেছে, এটি এর মানটি পরিবর্তন করতে পারে না C
, কারণ এটি ইতিমধ্যে "বন্ধ" রয়েছে।
A -> B -> C
? এটি প্রথমে C
2 এর দূরত্ব এবং পরে 5 এর দূরত্ব আপডেট করবে B
Ass আপনার গ্রাফটিতে কোনও বহির্গমন প্রান্ত নেই বলে ধরে C
নিই, তবে পরিদর্শন করার সময় আমরা কিছুই করি না C
(এবং এর দূরত্ব এখনও 2)। তারপরে আমরা D
সংলগ্ন নোডগুলি ঘুরে দেখি এবং কেবল সংলগ্ন নোড হয় C
, যার নতুন দূরত্ব -5। দ্রষ্টব্য যে ডিজকস্ট্রার অ্যালগরিদমে আমরা যে পিতামাতার কাছ থেকে নোডে পৌঁছাচ্ছি (এবং আপডেট করি) তাও আমরা রেখেছি এবং এখান থেকে C
আপনি পিতামাতাকে পাবেন B
এবং তারপরে A
একটি সঠিক ফলাফলের ফলস্বরূপ। আমি কী মিস করছি?
আমি যখন আমার ব্যাখ্যায় ডিজকস্ট্রার অ্যালগরিদমকে উল্লেখ করি আমি নীচে প্রয়োগকৃত হিসাবে ডিজকস্ট্রার অ্যালগরিদম সম্পর্কে কথা বলব,
সুতরাং প্রথমটি প্রতিটি ভার্টেক্সকে নির্ধারিত মানগুলি ( উত্স থেকে শীর্ষবিন্দুর দূরত্ব ) শুরু করা হয়,
আমরা প্রথমে Q = [A, B, C] এর শীর্ষবিন্দুটি বের করি যার স্বল্পতম মান হয়, অর্থাৎ A, এর পরে Q = [B, C] । দ্রষ্টব্য এ এর বি এবং সি এর দিকনির্দেশিত প্রান্ত রয়েছে, উভয়ই Q তে রয়েছে, সুতরাং আমরা সেই দুটি মানই আপডেট করি,
এখন আমরা সি হিসাবে বের করি (2 <5), এখন Q = [B] । লক্ষ্য করুন যে সি কোনও কিছুর সাথে সংযুক্ত নেই, তাই line16
লুপটি চলবে না।
অবশেষে আমরা নিষ্কর্ষ বি, যার পরে । দ্রষ্টব্য বি এর সি এর দিকনির্দেশিত প্রান্ত রয়েছে তবে সিটিতে Q উপস্থিত নেই তাই আমরা আবার লুপ ইন করতে প্রবেশ করি না line16
,
সুতরাং আমরা হিসাবে দূরত্ব শেষ
নোট কিভাবে এই ভুল যেমন সি A থেকে সবচেয়ে কম দূরত্ব 5 + + -10 = -5 হয়, যখন তুমি যাও ।
সুতরাং এই গ্রাফের জন্য ডিজকস্ট্রার অ্যালগরিদম ভুলভাবে এ থেকে সি এর দূরত্বের গণনা করে
এটি ঘটেছিল কারণ ডিজকস্ট্রার অ্যালগরিদম ইতিমধ্যে Q থেকে নিষ্কাশিত উল্লম্বগুলির একটি আরও ছোট পথ সন্ধান করার চেষ্টা করে না ।
কি line16
লুপ করছে প্রান্তবিন্দু গ্রহণ হয় তোমার দর্শন লগ করা এবং বলার অপেক্ষা রাখে না "আরে দেখে মনে হচ্ছে আমরা ফিরে যেতে পারেন বনাম মাধ্যমে উৎস থেকে তোমার দর্শন লগ করা , যে (Alt বা বিকল্প) দূরত্ব কোনো বর্তমান বেশী ভালো Dist [V] আমরা পেয়েছিলাম? তাই আপডেট করতে দেয় তাহলে ডিস্ট [ভি] "
নোট যে line16
তারা সব প্রতিবেশীদের পরীক্ষা বনাম (অর্থাত একটি নির্দেশ প্রান্ত থেকে বিদ্যমান U V থেকে ), এর U যা প্রশ্ন এখনও । ইন line14
তারা প্র: সুতরাং থেকে পরিদর্শন নোট অপসারণ যদি এক্স একটি পরিদর্শন প্রতিবেশী তোমার দর্শন লগ করা পথ হয় এমনকি বিবেচনা করা উৎস থেকে একটি সম্ভাব্য খাটো উপায় হিসেবে বনাম ।
আমাদের উপরের উদাহরণে, সি বি এর একজন পরিদর্শন প্রতিবেশী ছিল, সুতরাং বর্তমানের সংক্ষিপ্ততম পথটি অপরিবর্তিত রেখে পথটি বিবেচনা করা হয়নি ।
এটি আসলে কার্যকর যদি প্রান্তের ওজনগুলি সব ধনাত্মক সংখ্যা হয় , তবে তারপরে আমরা যে পথগুলি সংক্ষিপ্ত হতে পারি না সেগুলি বিবেচনা করে আমাদের সময় নষ্ট করব না ।
তাই আমি বলি যে এই অ্যালগরিদম চলমান যদি এক্স সামনে প্রশ্ন থেকে আহরণ করা হয় Y একটি পাথ খুঁজে, তারপর তার সম্ভাব্য না - যা খাটো। আমি এটি একটি উদাহরণ দিয়ে ব্যাখ্যা করি,
যেহেতু y সবেমাত্র বের করা হয়েছিল এবং x নিজেই আগে বের করা হয়েছিল, তারপরে <[y]> dist [x] কারণ অন্যথায় x এর আগে y বের করা হত । ( সর্বনিম্ন দূরত্ব প্রথম)line 13
এবং আমরা ইতিমধ্যে ধরে নিয়েছি যে প্রান্তের ওজনগুলি ধনাত্মক, অর্থাৎ দৈর্ঘ্য (x, y)> 0 । বিকল্প দূরত্ব (Alt) মাধ্যমে তাই Y সর্বদা নিশ্চিত বেশী হতে, অর্থাত্ Dist [Y] দৈর্ঘ্য (X, Y)> Dist [X] । সুতরাং ডিস্টের [x] এর মান আপডেট করা হত না যদিও y কে x এর পথ হিসাবে বিবেচনা করা হত , সুতরাং আমরা এই সিদ্ধান্তে পৌঁছেছি যে কেবলমাত্র y এর প্রতিবেশী যারা এখনও Q- এ রয়েছেন তাদের বিবেচনা করা বুদ্ধিমান হয় (মন্তব্যটিতে মন্তব্য করুন line16
)
তবে এই জিনিসটি যদি আমাদের ধনাত্মক প্রান্ত দৈর্ঘ্যের অনুমানের উপর নির্ভর করে দৈর্ঘ্য (ইউ, ভি) <0 হয় তবে সেই প্রান্তটি কতটা নেতিবাচক তার উপর নির্ভর করে আমরা তুলনার পরে ডি [এক্স] প্রতিস্থাপন করতে পারি line18
।
সুতরাং আমরা যে কোনও ডিস [x] গণনা করি তা ভুল হবে যদি সমস্ত শীর্ষকোষের আগে এক্স সরিয়ে ফেলা হয় v এর - যেমন x তাদের সাথে সংযোগকারী নেগেটিভ প্রান্তযুক্ত v এর প্রতিবেশী - সরানো হয়।
কারণ সেই v টির প্রতিটিই উত্স থেকে এক্স পর্যন্ত সম্ভাব্য "আরও ভাল" পথের দ্বিতীয় শেষ প্রান্ত , যা ডিজকস্ট্রার অ্যালগরিদম দ্বারা বাতিল করা হয়।
সুতরাং আমি উপরে যে উদাহরণটি দিয়েছি, ভুলটি ছিল কারণ বি সরানোর আগে সি সরানো হয়েছিল। যে সি নেতিবাচক প্রান্ত সঙ্গে বি একটি প্রতিবেশী ছিল!
কেবল পরিষ্কার করার জন্য, বি এবং সি এ এর প্রতিবেশী। বি এর একক প্রতিবেশী সি এবং সি এর কোনও প্রতিবেশী নেই। দৈর্ঘ্য (ক, খ) হ'ল কোণ এবং ক এর মধ্যবর্তী দৈর্ঘ্য।
ডিজকস্ট্রার অ্যালগোরিদম ধরে নিয়েছে যে পাথগুলি কেবল 'ভারী' হয়ে উঠতে পারে, যাতে আপনার যদি 3 টি ওজনযুক্ত A থেকে B পর্যন্ত এবং 3 টি ওজনের এ থেকে সি পর্যন্ত কোনও পথ থাকে তবে আপনি কোনও প্রান্ত যুক্ত করতে পারবেন না এবং 3 এরও কম ওজন নিয়ে সি থেকে এ পর্যন্ত বি পান।
এই অনুমানটি alণাত্মক ওজনগুলিকে বিবেচনায় নিতে হবে এমন অ্যালগরিদমের চেয়ে অ্যালগরিদমকে দ্রুত করে তোলে।
ডিজকস্ট্রার অ্যালগরিদমের সঠিকতা:
অ্যালগরিদমের যেকোন ধাপে আমাদের 2 টি শীর্ষ কোণ রয়েছে। সেট এ এমন শিখাগুলি নিয়ে গঠিত যা আমরা সংক্ষিপ্ততম পথগুলি গণনা করেছি। সেট বিতে বাকি শীর্ষগুলি রয়েছে।
ইন্ডাকটিভ হাইপোথিসিস : প্রতিটি পদক্ষেপে আমরা ধরে নেব যে পূর্ববর্তী সমস্ত পুনরাবৃত্তিগুলি সঠিক।
প্ররোচনামূলক পদক্ষেপ : যখন আমরা সেট এটিতে একটি শীর্ষবিন্দু ভি যোগ করি এবং দূরত্বকে [V] হিসাবে নির্ধারণ করি তখন আমাদের অবশ্যই প্রমাণ করতে হবে যে এই দূরত্বটি সর্বোত্তম। যদি এটি সর্বোত্তম না হয় তবে অবশ্যই ভার্টেক্স ভি এর আরও কয়েকটি পথ থাকতে হবে যা সংক্ষিপ্ত দৈর্ঘ্যের।
মনে করুন এটি অন্য কোনও পথটি কিছু প্রান্তিক এক্স দিয়ে গেছে।
এখন থেকে যেহেতু ডিস্ট [ভি] <= ডিস্ট [এক্স], সুতরাং গ্রাফের নেতিবাচক প্রান্ত দৈর্ঘ্য না হলে ভি এর অন্য যে কোনও পথের ন্যূনতম দূরত্ব [ভি] দৈর্ঘ্য হবে।
সুতরাং ডিজজস্ট্রার অ্যালগরিদমটি কাজ করার জন্য, প্রান্তের ওজনগুলি অবশ্যই নেতিবাচক হবে।
নিম্নলিখিত গ্রাফটিতে ডিজকস্ট্রার অ্যালগরিদম ব্যবহার করে A
দেখুন, কী ঘটছে তা দেখার জন্য উত্স নোডকে ধরে নেওয়া:
A->B
ইচ্ছা 1
এবং A->C
ইচ্ছা 100
। তাহলে B->D
হবে 2
। তাহলে C->D
হবে -4900
। সুতরাং মানটি বেলম্যান-ফোর্ডের সমান D
হবে -4900
। কীভাবে এটি সঠিক উত্তর দিচ্ছে না?
A->B
হবে 1
এবং A->C
হবে 100
। তারপরে B
অন্বেষণ করা হয় এবং সেট করা B->D
হয় 2
। তারপরে ডি অনুসন্ধান করা হয় কারণ বর্তমানে এটি উত্সটিতে সবচেয়ে সংক্ষিপ্ততম পথ রয়েছে? আমি এই বলে যে তাহলে সঠিক হবে B->D
ছিল 100
, C
প্রথমে হয়ত লাগত অন্বেষণ করে থাকেন? আমি আপনার বাদে অন্য সমস্ত উদাহরণ মানুষ দেয়।
স্মরণ করুন যে ডিজকস্ট্রার অ্যালগরিদমে, একবার একবার একটি শীর্ষবিন্দু "বদ্ধ" হিসাবে চিহ্নিত করা হয় (এবং খোলা সেট থেকে বাইরে) - এটি ধরে নেওয়া হয় যে এটি থেকে উত্পন্ন কোনও নোড আরও বেশি দূরত্বের দিকে নিয়ে যাবে সুতরাং, অ্যালগরিদম এটির সংক্ষিপ্ততম পথটি খুঁজে পেয়েছিল এবং আর কখনও এই নোড বিকাশ করতে হবে না, তবে এটি নেতিবাচক ওজনের ক্ষেত্রে সত্য হয় না।
অন্যান্য উত্তর এখনও পর্যন্ত বেশ ভালভাবে দেখায় যে কেন ডিজকস্ট্রার অ্যালগরিদম পথে নেতিবাচক ওজন পরিচালনা করতে পারে না।
তবে প্রশ্নটি নিজেই হয়ত পথগুলির ওজন সম্পর্কে একটি ভুল বোঝার উপর ভিত্তি করে। যদি পাথের নেতিবাচক ওজনগুলিকে সাধারণভাবে প্যাথফাইন্ডিং অ্যালগরিদমগুলিতে অনুমতি দেওয়া হয়, তবে আপনি স্থায়ী লুপ পাবেন যা থামবে না।
এই বিবেচনা:
A <- 5 -> B <- (-1) -> C <- 5 -> D
এ এবং ডি এর মধ্যে সর্বোত্তম পথটি কী?
যে কোনও প্যাথফাইন্ডিং অ্যালগরিদমকে অবিচ্ছিন্নভাবে বি এবং সি এর মধ্যে লুপ করতে হবে কারণ এটি করলে মোট পাথের ওজন হ্রাস পায়। সুতরাং কোনও সংযোগের জন্য নেতিবাচক ওজনকে মঞ্জুরি দেওয়া যেকোন প্যাথফাইন্ডিগ অ্যালগরিদম মোটকে রেন্ডার করে, সম্ভবত আপনি যদি প্রতিটি সংযোগ কেবল একবার ব্যবহার করার জন্য সীমাবদ্ধ করেন তবে।
নেতিবাচক চক্র সহ নেতিবাচক প্রান্তগুলি সহ আপনি ডিজকস্ট্রার অ্যালগরিদম ব্যবহার করতে পারেন তবে আপনাকে অবশ্যই একটি শীর্ষবিন্দু একাধিকবার পরিদর্শন করতে দেওয়া উচিত এবং সেই সংস্করণটি এটি দ্রুত সময়ের জটিলতা হারাবে।
সেক্ষেত্রে ব্যবহারিকভাবে আমি দেখেছি এসপিএফএ অ্যালগরিদম ব্যবহার করা আরও ভাল যাগুলির মধ্যে সাধারণ সারি রয়েছে এবং এটি নেতিবাচক প্রান্তগুলি পরিচালনা করতে পারে।