কীভাবে ওয়ার্মহোল নোডগুলির সাথে সংক্ষিপ্ততম পথটি সন্ধান করবেন?


25

উদাহরণ

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

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

নীল পথটি গ্রহণ করা স্পষ্টতই দ্রুততর, যেহেতু আপনাকে কেবল হলুদ পথ পর্যন্ত কেবল অর্ধেক (মোটামুটি) সরানো দরকার, তবে আমি কীভাবে এটি অগ্রগতিতে করব?

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

কিছু বেগুনি স্ট্র্যাপ দ্বি-দিকনির্দেশক এবং কিছু না, অর্থাত্ কখনও কখনও আপনি কেবল একপাশ থেকে একটি বার্প প্রবেশ করতে পারেন, তবে ওয়ার্পিং পরে ফিরে যেতে পারবেন না।

আমি সমাধানটি নিয়ে চিন্তা করেছি এবং কেবল এই সিদ্ধান্তে পৌঁছেছি যে আমি প্রতিটি ওয়ার্প পয়েন্টের দূরত্ব (মাইনাস দ্য ইউনি-দিকনির্দেশক পয়েন্ট) এবং এই পয়েন্টগুলির মধ্যে পার্থক্য এবং তার কাছের পয়েন্টগুলি পরীক্ষা করে সমস্যার গণনা করতে সক্ষম হব ।

প্রোগ্রামটি কোনওভাবে নির্ধারণ করতে হবে যে প্রথম লাফ থেকে হাঁটার পরিবর্তে দ্বিতীয় বার্পটি নেওয়া আরও বেশি উপকারী। সুতরাং, 6 টি দাগ সরানোর পরিবর্তে, ওয়ারপিংয়ের পরে বাকী 8 টি ধাপ পায়ে হেঁটে (যা ওয়ারপগুলি ব্যবহার না করার চেয়ে দ্রুতও হয়), 6 টি পদক্ষেপ নিতে হবে, তারপরে দুটি পদক্ষেপ দ্বিতীয় বার্পে চলে যাবে।

সম্পাদনা: আমি বুঝতে পেরেছি যে নীল পথটি আসলে 8 এর পরিবর্তে 12 টি পদক্ষেপ নেবে, তবে প্রশ্নটি একই রয়েছে।


4
নীল পথটি 12 টি হওয়া উচিত নয় (শেষটি বেগুনি থেকে লাল পর্যন্ত দুটি পেতে)
ব্লুরাজা - ড্যানি পিফ্লুঘিওফ্ট

5
নীল আসলে 12 (7 + 3 + 2) নড়ে?
ড্যানিয়েল জোর

উফফফ, গণ্ডগোল, ধন্যবাদ ছেলেরা! @ ড্যানিয়েলজোর এবং ব্লু
জেফ স্মিথ

দূরত্বগুলির মডেল করার "সঠিক" উপায়টি টপোলজি ব্যবহার এবং এটি একটি উচ্চ মাত্রিক পৃষ্ঠ হিসাবে মডেল করা হবে। আমি ভাবছি এখানে যদি এইরকম উত্তর উপযুক্ত হয়?
গিকি আমি

উত্তর:


49

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

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

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

আমি মনে করি যে আপনি যদি এমন কোনও হিউরিস্টিক ব্যবহার করেন যা সমস্ত বিদায়ী কৃমহোলকে একটি লক্ষ্মীরূপ হিসাবে লক্ষ্য করে সরাসরি লক্ষ্য করে: হিউরিস্টিক দূরত্বটিকে হ্রাস করতে পারে তবে এটিকে কখনই অল্প মূল্যায়ন করতে হবে না। অর্থাত্ হিরিস্টিক হ'ল:

def wormhole_heuristic(x):
  return min(euclidean_distance(x, g) for g in [goal, wormholes...])

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

def wormhole_heuristic(x):
  direct = euclidean_distance(x, goal)
  via_wormhole = min(euclidean_distance(x, w) + wormhole_path_distance(w, goal) for w in wormholes)
  return min(direct, via_wormhole)

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

def wormhole_heuristic(x):
  direct = euclidean_distance(x, goal)
  to_next_wormhole = min(euclidean_distance(x, w) for w in wormholes)
  from_last_wormhole = min(euclidean_distance(w.exit, goal) for w in wormholes)
  via_wormhole = to_next_wormhole + from_last_wormhole
  return min(direct, via_wormhole)

10
লক্ষণীয় যে dijkstra_heuristic(x) = 0
ডিজকস্ট্রা

আমি বুঝতে পারছি না আপনি [* ওয়ার্মহোলস, গোল] বলতে কী বোঝাতে চেয়েছেন, আপনি কি এটি ব্যাখ্যা করবেন?
জেফ স্মিথ

1
"নিকটতম ওয়ার্মহোল প্রস্থান থেকে ইউক্যালিডিয়ান দূরত্ব" wormhole_path_distanceউপগ্রাফ অনুসন্ধানের চেয়ে সস্তা ব্যয় , এবং "সমস্ত প্রস্থান লক্ষ্যমাত্রায় রয়েছে" এর চেয়ে কম মূল্যায়ন করা হয় না।
কালেথ

3
@ ক্যালথ অবশ্যই! এখানে প্রচুর সূক্ষ্ম-সুরকরণের সম্ভাবনা রয়েছে, যেমন আমরা n = 3 টি জাম্প এগিয়ে দেখার সিদ্ধান্ত নিতে পারি। সাবগ্রাফ অনুসন্ধানটি সমস্ত অ্যাসাইক্লিক ওয়ার্মহোল জাম্প বন্ধের সাথে মিলে যায়। আপনার প্রস্তাবনা এগিয়ে দেখুন এন = 1 জাম্প খুব মার্জিত হিসাবে এটি মূলত শূন্য অতিরিক্ত খরচ :) হয়েছে
আমন

1
সরলতার ঝাঁকুনির জন্য, ধরে নিন যে কেবল একটি ওয়ার্মহোল (দুটি নোড) রয়েছে, তবে আপনি এই দুটি পয়েন্টের মধ্যে সামঞ্জস্যিক অক্ষ হিসাবে সমান্তরাল রেখার সাথে একটি প্রতিসামগ্রী বিমানটি অনুলিপি করে এই প্লেন 1-ওয়ার্মহোলকে 2 মিরর প্লেনে রূপান্তর করতে পারেন। আপনার কাছে এখন দুটি প্লেন রয়েছে, আসল বিমানটি কল করুন (আপনি কীটমহলটি নিবেন না) এবং কাল্পনিক বিমান (আপনি কীটপোকা নিয়েছিলেন)। এখন, আমরা জেড সমন্বয় চালু করি। এই সমন্বয়টি আসল বিমানের প্রতিটি পয়েন্টের জন্য 0 হবে এবং এটি কাল্পনিক বিমানের প্রতিটি পয়েন্টের জন্য দূরের (ওয়ার্মহোল, পয়েন্ট) হবে। এর পরে, ত্রি-মাত্রিক জায়গার জন্য এ * প্রয়োগ করুন।
লাইলিক 21 ই

5

আপনার সমন্বিত সমন্বিত গ্রিডে 6 টি উল্লম্ব একটি গ্রাফ রয়েছে:

A ( 0,0)
B ( 4,7)
C ( 7,4)
D (10,4)
E (16,2)
F (16,0)

আপনি vert টি শীর্ষ দিকগুলিতে একটি সম্পূর্ণ গ্রাফ তৈরি করতে পারেন এবং প্রতিটি প্রান্তে একটি ব্যয় নির্ধারণ করতে পারেন যেখানে MAX( ABS( x1 - x2 ), ABS( y1 - y2 ) )স্ট্যান্ডার্ড প্রান্তগুলির জন্য এবং ওয়ার্মহোলের জন্য 0 ব্যয়।

এটি আপনাকে ব্যয় দেবে (সংলগ্ন ম্যাট্রিক্স হিসাবে):

   A  B  C  D  E  F
- -- -- -- -- -- --
A  -  7  7 10 16 16
B  7  -  0  6 12 12
C  7  0  -  3  9  9
D 10  6  3  -  0  6
E 16 12  9  0  -  2
F 16 12  9  6  2  -

যদি কোনও দিকনির্দেশক ওয়ার্প থাকে তবে কেবল গ্রাফের (বা সংলগ্ন ম্যাট্রিক্স) প্রান্তগুলি তৈরি করুন যা সেই দিকে চলে তবে বিপরীতে নয়।

তারপরে আপনি ডিজিকস্ট্রার অ্যালগরিদমটিকে অগ্রাধিকারের সারি সহ ব্যবহার করতে পারেন ।

Aঅগ্রাধিকার সারিতে প্রতিটি সংলগ্ন প্রান্তটি থেকে শুরু করুন এবং টিপুন:

ফর্ম্যাট: (পথ: ব্যয়)

queue     = [ (A-B : 7), (A-C : 7), (A-D : 10), (A-E : 16), (A-F : 16) ]

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

min-costs = { A: 0, B: 7, C: 7, D: 10, E: 16, F: 16 }

সারি থেকে প্রথম আইটেমটি সরিয়ে ফেলুন এবং, যদি এর ব্যয়টি এখনও সর্বনিম্ন ব্যয়ের সাথে মেলে, তবে সেই পথটি এবং তার সংলগ্ন প্রান্তগুলি দ্বারা গঠিত সমস্ত সম্মিলিত পাথগুলি অগ্রাধিকারের সারিতে পিছনে চাপুন (যদি সম্মিলিত পাথগুলি বিদ্যমান ন্যূনতমের চেয়ে কম দাম থাকে):

অপসারণ: (A-B : 7)

  • চেষ্টা করুন (A-B-A : 14)- উচ্চ ব্যয় হিসাবে প্রত্যাখ্যান করুন
  • চেষ্টা করুন (A-B-C : 7)- একই ব্যয় হিসাবে প্রত্যাখ্যান করুন
  • চেষ্টা করুন (A-B-D : 13)- উচ্চ ব্যয় হিসাবে প্রত্যাখ্যান করুন
  • চেষ্টা করুন (A-B-E : 19)- উচ্চ ব্যয় হিসাবে প্রত্যাখ্যান করুন
  • চেষ্টা করুন (A-B-F : 19)- উচ্চ ব্যয় হিসাবে প্রত্যাখ্যান করুন

অপসারণ (A-C : 7)

  • চেষ্টা করুন (A-C-A : 14)- উচ্চ ব্যয় হিসাবে প্রত্যাখ্যান করুন
  • চেষ্টা করুন (A-C-B : 7)- একই ব্যয় হিসাবে প্রত্যাখ্যান করুন
  • চেষ্টা করুন (A-C-D : 10)- একই ব্যয় হিসাবে প্রত্যাখ্যান করুন
  • চেষ্টা করুন (A-C-E : 16)- একই ব্যয় হিসাবে প্রত্যাখ্যান করুন
  • চেষ্টা করুন (A-C-F : 16)- একই ব্যয় হিসাবে প্রত্যাখ্যান করুন

অপসারণ (A-D : 10)

  • চেষ্টা করুন (A-D-A : 20)- উচ্চ ব্যয় হিসাবে প্রত্যাখ্যান করুন
  • চেষ্টা করুন (A-D-B : 16)- উচ্চ ব্যয় হিসাবে প্রত্যাখ্যান করুন
  • চেষ্টা করুন (A-D-C : 13)- উচ্চ ব্যয় হিসাবে প্রত্যাখ্যান করুন
  • চেষ্টা করুন (A-D-E : 10)- সারি intoোকান
  • চেষ্টা করুন (A-D-F : 16)- একই ব্যয় হিসাবে প্রত্যাখ্যান করুন

এখন সারিটি দেখতে পাবেন:

queue     = [ (A-D-E : 10), (A-E : 16), (A-F : 16) ]
min-costs = { A: 0, B: 7, C: 7, D: 10, E: 10, F: 16 }

অপসারণ (A-D-E : 10)

  • চেষ্টা করুন (A-D-E-A : 26)- উচ্চ ব্যয় হিসাবে প্রত্যাখ্যান করুন
  • চেষ্টা করুন (A-D-E-B : 22)- উচ্চ ব্যয় হিসাবে প্রত্যাখ্যান করুন
  • চেষ্টা করুন (A-D-E-C : 19)- উচ্চ ব্যয় হিসাবে প্রত্যাখ্যান করুন
  • চেষ্টা করুন (A-D-E-D : 10)- একই ব্যয় হিসাবে প্রত্যাখ্যান করুন
  • চেষ্টা করুন (A-D-E-F : 12)- সারি intoোকান

তারপরে সারিটি হ'ল:

queue     = [ (A-D-E-F : 12), (A-E : 16), (A-F : 16) ]
min-costs = { A: 0, B: 7, C: 7, D: 10, E: 10, F: 12 }

সরান (A-D-E-F : 12), 12 টি ব্যয়ে আপনি গন্তব্য নোডে পৌঁছেছেন তা সন্ধান করুন।

নোট: পাথ (A-B-C-D-E-F), (A-C-D-E-F)এবং (A-D-E-F)সব 12 একই সর্বনিম্ন খরচ আছে।


0

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

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