ডিজকস্ট্রার অ্যালগোরিদম ব্যবহার করে নেতিবাচক ওজন


113

আমি বুঝতে চেষ্টা করছি যে ডিজকস্ট্রার অ্যালগরিদম কেন নেতিবাচক ওজন নিয়ে কাজ করবে না। সংক্ষিপ্ত পথগুলির উপর একটি উদাহরণ পড়ে , আমি নিম্নলিখিত পরিস্থিতিটি বের করার চেষ্টা করছি:

    2
A-------B
 \     /
3 \   / -2
   \ /
    C

ওয়েবসাইট থেকে:

প্রান্তগুলি সবগুলি বাম থেকে ডানে দিকে নির্দেশিত, আমরা যদি এ থেকে শুরু করি, ডিজকস্ট্রার অ্যালগোরিদমটি প্রান্তটি (এ, এক্স) নূন্যতম ডি (এ, এ) + দৈর্ঘ্য (প্রান্ত), (এ, বি) বেছে নেবে। এরপরে এটি ডি (এ, বি) = 2 সেট করে এবং অন্য প্রান্ত (y, C) কমিয়ে ডি (এ, ওয়াই) + ডি (ওয়াই, সি) চয়ন করে; একমাত্র পছন্দটি (এ, সি) এবং এটি ডি (এ, সি) = 3 নির্ধারণ করে। তবে এটি মোট দৈর্ঘ্য 1 সহ সি এর মাধ্যমে এ থেকে বি যাওয়ার সবচেয়ে কমতম পথ কখনই খুঁজে পায় না।

আমি বুঝতে পারি না ডিজকস্ট্রার নিম্নলিখিত প্রয়োগটি ব্যবহার করে কেন, ডি [বি] এর সাথে আপডেট করা হবে না 1(যখন অ্যালগোরিদম ভার্টেক্স সিতে পৌঁছে যাবে তখন এটি বিয়ের উপর শিথিল হবে, দেখুন ডি [বি] এর সমান হয় 2, এবং তাই আপডেট হয় এর মান 1)।

Dijkstra(G, w, s)  {
   Initialize-Single-Source(G, s)
   S ← Ø
   Q ← V[G]//priority queue by d[v]
   while Q ≠ Ø do
      u ← Extract-Min(Q)
      S ← S U {u}
      for each vertex v in Adj[u] do
         Relax(u, v)
}

Initialize-Single-Source(G, s) {
   for each vertex v  V(G)
      d[v] ← ∞
      π[v] ← NIL
   d[s] ← 0
}

Relax(u, v) {
   //update only if we found a strictly shortest path
   if d[v] > d[u] + w(u,v) 
      d[v] ← d[u] + w(u,v)
      π[v] ← u
      Update(Q, v)
}

ধন্যবাদ,

মেইর


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

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

উত্তর:


202

আপনার প্রস্তাবিত অ্যালগরিদম এই গ্রাফের মধ্যে সবচেয়ে সংক্ষিপ্ততম পথটি খুঁজে পাবে, তবে সমস্ত গ্রাফ সাধারণভাবে পাওয়া যায় না। উদাহরণস্বরূপ, এই গ্রাফটি বিবেচনা করুন:

গ্রাফের চিত্র

ধরুন প্রান্তগুলি আপনার উদাহরণের মতো বাম থেকে ডানে পরিচালিত হয়েছে,

আপনার অ্যালগরিদম নিম্নলিখিত হিসাবে কাজ করবে:

  1. প্রথমত, আপনি সেট d(A)করার জন্য zeroএবং অন্যান্য দূরত্বের infinity
  2. এর পরে আপনি নোড আউট প্রসারিত A, সেটিং d(B)থেকে 1, d(C)থেকে zero, এবং d(D)করতে 99
  3. এর পরে, আপনি Cকোনও নেট পরিবর্তন ছাড়াই প্রসারিত করুন ।
  4. তারপরে আপনি প্রসারিত করুন B, যার কোনও প্রভাব নেই।
  5. অবশেষে, আপনি প্রসারিত করুন D, যা পরিবর্তিত d(B)হয় -201

লক্ষ করুন যে এটির শেষে, যদিও d(C)এটি এখনও রয়েছে 0, যদিও সবচেয়ে ছোট পথটির Cদৈর্ঘ্য রয়েছে -200 আপনার অ্যালগরিদম কিছু ক্ষেত্রে সঠিকভাবে দূরত্বগুলি গণনা করতে ব্যর্থ। তদুপরি, আপনি প্রতিটি নোড থেকে শুরু নোডে কীভাবে Aযাবেন সে সম্পর্কে পয়েন্টারগুলি ব্যাক করে রাখলেও আপনি ভুল পথটি অন্যদিকে ফিরে যেতে শেষ Cকরবেন A


35
আপনার দুর্দান্ত উত্তরে যোগ করার জন্য: ডিজকস্ট্রা হ'ল লোভী অ্যালগরিদম হ'ল এটির স্বল্পদৃষ্টির পছন্দ choice
blubb

4
আমি উল্লেখ করতে চাই, প্রযুক্তিগতভাবে, এই গ্রাফের সমস্ত পাথের নেতিবাচক চক্র এ, ডি, বি, এ এর ​​নেতিবাচক অনন্ত সৌজন্যে একটি ব্যয় রয়েছে।
Nate

2
@ নেট- স্পষ্ট করার জন্য, গ্রাফের সমস্ত প্রান্তগুলি বাম থেকে ডানে নির্দেশিত। আমার উচ্চমানের ASCII শিল্পে তীর সরবরাহ করা খুব কঠিন ছিল। :-)
টেম্পলেট

2
যারা নেতিবাচক প্রান্তগুলি সহ গ্রাফগুলি আগে দেখেননি তাদের জন্য, এই গ্রাফটির টোল রাস্তার নেটওয়ার্ক হওয়ার জন্য আমি এই গ্রাফটির একটি দরকারী ব্যাখ্যা পেয়েছি, যেখানে প্রান্তের ওজনগুলি আপনাকে প্রদেয় টোল দেয়। -300 রাস্তাটি একটি উন্মাদ পিছনের টোল রোড যেখানে তারা আপনাকে পরিবর্তে $ 300 দেয়।
ডি কোয়েজি

3
@ শোয়েটজানভিটিয়ানুজিৎ- ডিজকস্ট্রার অ্যালগরিদম এভাবেই কাজ করে। অ্যালগরিদম পাথ অন্বেষণ করে না , পরিবর্তে নোডগুলি প্রক্রিয়া করে কাজ করে । প্রতিটি নোড হ'ল একবার প্রক্রিয়াজাত হয়, সুতরাং আমরা বি নোডটি প্রক্রিয়া করার সাথে সাথে এর দূরত্বটি 1 হওয়ার সাথে সাথে আমরা কখনই নোড বি পুনর্বিবেচনা করব না বা তার দূরত্ব আপডেট করার চেষ্টা করব না।
টেমপ্লেট টাইপফ

25

দ্রষ্টব্য, গ্রাফিকের নেতিবাচক চক্র না থাকলে, যেমন চক্রের সমষ্টিযুক্ত ওজন শূন্যের চেয়ে কম, এমনকি ডিজেস্ট্রা নেতিবাচক ওজনের জন্যও কাজ করে।

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

যদি কেউ বিকল্প স্টপ মানদণ্ড ব্যবহার করে যা অগ্রাধিকার-সারি (হিপ) খালি চলার সময় অ্যালগরিদমকে থামায় (এই স্টপ মানদণ্ডটি প্রশ্নটিতেও ব্যবহৃত হয়েছিল), তবে ডিজকস্ট্রা এমনকি নেতিবাচক ওজন সহ গ্রাফের জন্য সঠিক দূরত্ব খুঁজে পাবে নেতিবাচক চক্র।

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


২. আপনি কেন মনে করেন যে সময়টি আমার "বেলম্যান-ফোর্ডের মতো" হবে এবং তাত্পর্যপূর্ণ হবে না (এটি বেলম্যান-ফোর্ডের চেয়েও খারাপ)। আপনার কি কংক্রিটের অ্যালগরিদম এবং মনে প্রমাণ রয়েছে?
গাসা

3
1 তে: আপনি উল্লিখিত স্টপ মাপদণ্ডের সাথে ঠিক একইভাবে ডিজজস্ট্রার প্রয়োগ করতে পারবেন, যখন কোনও সারি খালি চলে তখন থামবে (মূল প্রশ্নে সিউডোকোড দেখুন), এটি এখনও সংক্ষিপ্ততম পথগুলির জন্য ডিজজস্ট্রাস অ্যালগরিদম, যদিও এটি ভিন্নভাবে আচরণ করে নোড কয়েকবার স্থির করে (লেবেল সংশোধন)।
infty10000101

1
2 তে: এটি কেবলমাত্র অনুমান ছিল তাই আমি এটি মুছতে চলেছি। আমি মনে করি আপনি ঘৃণ্য সময়টির সাথে ঠিকই রয়েছেন, কারণ অনেকগুলি পাথই এক্সপেনশিয়ালভাবে অনুসন্ধান করতে হবে।
infty10000101

11

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

এই বাস্তবতা O (E + VlogV) এর জটিলতা নিশ্চিত করে [অন্যথায়, আপনি একবারের পরে আরও একবার প্রান্তটি পুনরাবৃত্তি করবেন, এবং আরও একবার আবার শীর্ষে]

অন্য কথায়, আপনি যে অ্যালগরিদম পোস্ট করেছেন এটি ডি (ই + ভ্লগভি) এ নাও থাকতে পারে, যেমন ডিজজস্ট্রার অ্যালগরিদম দ্বারা প্রতিশ্রুতি দেওয়া হয়েছিল।


এছাড়াও, নেতিবাচক ওজন প্রান্ত ছাড়া প্রান্তকে পরিবর্তন করার দরকার নেই, যা পুরোপুরি ধারণাটি ভেঙে দেয় যে পথের ব্যয়গুলি কেবল পুনরাবৃত্ত প্রান্তগুলি
দিয়েই

এই অনুমানটি হ'ল আমাদের এস ব্যবহার করতে দেয় এবং 'বুদ্ধিমান' একবার ভার্টেক্সে এস এ থাকলে তা আর কখনও সংশোধিত হবে না।
amit

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

7

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


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


4

টিএল; ডিআর: উত্তরটি আপনার প্রয়োগের উপর নির্ভর করে। আপনার পোস্ট করা সিউডো কোডের জন্য এটি নেতিবাচক ওজন নিয়ে কাজ করে।


ডিজকস্ট্রার অ্যালগোরিদমের রূপগুলি

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

  1. শীর্ষ শিথিল করতে নেস্টেড- forলুপ ব্যবহার করা । এটি ডিজকস্ট্রার অ্যালগরিদম বাস্তবায়নের সবচেয়ে সহজ উপায়। সময়ের জটিলতা হ'ল ও (ভি ^ 2)।
  2. অগ্রাধিকার-সারি / হিপ ভিত্তিক বাস্তবায়ন + কোনও পুনরায় প্রবেশের অনুমতি নেই, যেখানে পুনরায় প্রবেশের অর্থ একটি শিথিল ভার্টেক্সকে পরে আবার শিথিল করার জন্য অগ্রাধিকার-কাতারে চাপ দেওয়া যেতে পারে
  3. অগ্রাধিকার-সারি / গাদা ভিত্তিক প্রয়োগ + পুনরায় প্রবেশের অনুমতি।

সংস্করণ 1 এবং 2 নেতিবাচক ওজন সহ গ্রাফগুলিতে ব্যর্থ হবে (আপনি যদি এই ক্ষেত্রে সঠিক উত্তরটি পান তবে এটি কেবল একটি কাকতালীয় ঘটনা), তবে সংস্করণ 3 এখনও কার্যকর হয়

মূল সমস্যার অধীনে পোস্ট করা সিউডো কোডটি উপরের সংস্করণ 3, সুতরাং এটি নেতিবাচক ওজন নিয়ে কাজ করে।

এখানে অ্যালগরিদম (চতুর্থ সংস্করণ) থেকে একটি ভাল রেফারেন্স দেওয়া হয়েছে , যা বলে (এবং আমি উপরে উল্লিখিত সংস্করণ 2 এবং 3 এর জাভা প্রয়োগ রয়েছে):

প্র: ডিজজস্ট্রার অ্যালগরিদমটি নেতিবাচক ওজন নিয়ে কাজ করে?

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


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


1

আপনি বি এবং সি এর মধ্যে পিছনে পিছনে যান তবে কী হবে তা বিবেচনা করুন ... ভয়েলা

(কেবল গ্রাফটি নির্দেশিত না হলে প্রাসঙ্গিক)

সম্পাদিত: আমি বিশ্বাস করি যে এসি * সহ পাথটি কেবল নেতিবাচক ওজন প্রান্তের অস্তিত্বের সাথে এবি-র চেয়ে ভাল হতে পারে, তাই আপনি এসি-র পিছনে কোথায় যাবেন তা বিবেচ্য নয়- নেতিবাচক ওজনের প্রান্তগুলি একবার এসি করার পরে আপনি বি পৌঁছানোর জন্য বেছে নেওয়ার পরে এবি এর চেয়ে ভাল কোনও পথ খুঁজে পাওয়া অসম্ভব।


এটি সম্ভব নয়, গ্রাফটি নির্দেশিত।
amit

@ অমিত: ভাল কথা, আমি সেটা মিস করেছি। সমস্যার পুনর্বিবেচনার সময়
প্রুশওয়ান

1

"২) আমরা কী নেতিবাচক ওজন সহ গ্রাফের জন্য সংক্ষিপ্ততম পাথের জন্য ডিজজরার অ্যালগরিদম ব্যবহার করতে পারি - একটি ধারণা হতে পারে, সর্বনিম্ন ওজনের মান গণনা করা, সমস্ত ওজনে একটি ধনাত্মক মান (সর্বনিম্ন ওজনের মানের সমান) যোগ করতে এবং ডিজজর আলগোরিদিম চালাতে পারে? পরিবর্তিত গ্রাফের জন্য। এই অ্যালগরিদমটি কি কাজ করবে? "

সমস্ত সংক্ষিপ্ত পাথের দৈর্ঘ্য না থাকলে এটি একেবারেই কাজ করে না। উদাহরণস্বরূপ, দৈর্ঘ্যের দুটি প্রান্তের একটি সংক্ষিপ্ততম পথ দেওয়া হয়েছে এবং প্রতিটি প্রান্তে পরম মান যুক্ত করার পরে মোট পাথ ব্যয়টি 2 * | সর্বাধিক নেতিবাচক ওজন দ্বারা বাড়ানো হয়েছে। অন্যদিকে দৈর্ঘ্যের তিন প্রান্তের অন্য একটি পথ, সুতরাং পথের ব্যয়টি 3 * | সর্বাধিক নেতিবাচক ওজন দ্বারা বাড়ানো হয়েছে। সুতরাং, সমস্ত পৃথক পাথ বিভিন্ন পরিমাণে বৃদ্ধি করা হয় are


0

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

সেক্ষেত্রে ব্যবহারিকভাবে আমি দেখেছি এসপিএফএ অ্যালগরিদম ব্যবহার করা আরও ভাল যাগুলির মধ্যে সাধারণ সারি রয়েছে এবং এটি নেতিবাচক প্রান্তগুলি পরিচালনা করতে পারে।

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