গ্রিডে এ * দিয়ে কীভাবে প্রাকৃতিক-দর্শনীয় পথ তৈরি করবেন?


13

আমি এটি পড়ছি: http://theory.stanford.edu/~amitp/ গেমপ্রোগ্রামিং / হিউরিস্টিক্স এইচটিএমএল

তবে এমন কিছু জিনিস রয়েছে যা আমি বুঝতে পারি না, উদাহরণস্বরূপ নিবন্ধটি তির্যক আন্দোলনের সাথে প্যাথফাইন্ডিংয়ের জন্য এই জাতীয় কিছু ব্যবহার করতে বলেছে:

function heuristic(node) =
    dx = abs(node.x - goal.x)
    dy = abs(node.y - goal.y)
    return D * max(dx, dy)

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

এটি আমার প্রত্নতাত্ত্বিক কাজ এবং সরানো ফাংশন:

def heuristic(self, node, goal):
    D = 5
    dx = abs(node.x - goal.x)
    dy = abs(node.y - goal.y)
    return D * max(dx, dy)

def move_cost(self, current, node):
   cross = abs(current.x - node.x) == 1 and abs(current.y - node.y) == 1
   return 7 if cross else 5

ফলাফল:

এখানে চিত্র বর্ণনা লিখুন

মসৃণ নৌযানের পথটি আমরা ঘটতে চাই:

এখানে চিত্র বর্ণনা লিখুন

আমার কোডের বাকি অংশ: http://pastebin.com/TL2cEkeX


হালনাগাদ

আমি এখন অবধি খুঁজে পাওয়া এটিই সেরা সমাধান:

def heuristic(node, start, goal):
    dx1 = node.x - goal.x
    dy1 = node.y - goal.y
    dx2 = start.x - goal.x
    dy2 = start.y - goal.y
    cross = abs(dx1*dy2 - dx2*dy1)

    dx3 = abs(dx1)
    dy3 = abs(dy1)

    return 5 + (cross*0.01) * (dx3+dy3) + (sqrt(2)-2) * min(dx3, dy3)

def move_cost(current, node):
    cross = abs(current.x - node.x) == 1 and abs(current.y - node.y) == 1
    return 7 if cross else 5

এটি দ্বিতীয় ছবি থেকে কাঙ্ক্ষিত পথ উত্পাদন করে তবে বাধা খুব ভালভাবে পরিচালনা করে না (দেয়ালগুলিতে হামাগুড়ি দেয়) এবং কখনও কখনও দীর্ঘ দূরত্বে সর্বোত্তম পথ তৈরি করতে ব্যর্থ হয়।

এটিকে উন্নত করার জন্য আমি কীভাবে কিছু টুইট এবং অপ্টিমাইজেশন প্রয়োগ করতে পারি?


2
যদি আপনি কার্তেসিয়ান দূরত্বকে তাঁর হিউরিস্টিক হিসাবে ব্যবহার করেন?
জিমি

2
এখানে কেবল একটি ধারণা, প্রতিটি ধাপে এজেন্ট একই দিকে অগ্রসর হওয়ার জন্য এক টালি থেকে অন্য টলে যাওয়ার ব্যয় বাড়ান।
Ali1S232

@ জিমি আমি স্কয়ার্ট (পাও (গোল.এক্স - নোড.এক্স, ২) + পাউ (গোল.ই - নোড.ই, ২)) চেষ্টা করেছিলাম এবং আমার ছোট উদাহরণের পথের জন্য এটি আসলে আমার প্রশ্নের চিত্রের মতোই ফিরে আসে ।
বেনামে সত্তা

উত্তর:


10

এ * আপনাকে গ্রাফের সবচেয়ে সংক্ষিপ্ত পথ দেয়। আপনার গ্রাফ হিসাবে গ্রিড ব্যবহার করার সময় প্রায় একাধিক সংক্ষিপ্ততম পাথ থাকে। আপনার প্রথম ডায়াগ্রাম, যে হয় সবচেয়ে কম পাথ করুন। এটি সমস্ত অক্ষীয় গতিবিধি প্রথমে এবং পরে সমস্ত তির্যক আন্দোলন রাখে। তবে এটি একই দৈর্ঘ্যের পথটি যেমন আপনি সমস্ত विकर्णগুলি প্রথমে রেখেছেন বা আপনি অক্ষ এবং তির্যক গতিবিধি মিশ্রিত করে থাকেন। এগুলি সমস্ত সমানভাবে সংক্ষিপ্ত, এবং কোন একটি * বাছাই কোডটি কীভাবে লেখা হয় এবং গ্রাফটি কীভাবে উপস্থাপন করা হয় তার উপর নির্ভর করে।

আমি মনে করি আপনি যা চাইছেন তা হ'ল:

  1. আপনার গ্রিডে স্থানান্তরিত হওয়া দরকার তবে আপনি অক্ষীয় এবং তির্যক পদক্ষেপগুলি মিশ্রিত করতে চান যাতে এটি আরও ভাল দেখায়। একটি পদ্ধতির অপরটি সমান সংক্ষিপ্ত পথ বেছে নেওয়া; "টাই ব্রেকিং" সন্ধানের জন্য হিউরিস্টিক পৃষ্ঠাটি পড়তে থাকুন। আরেকটি পদ্ধতি হ'ল আপনি যখন প্রতিবেশীদের মূল্যায়ন করছেন, প্রথমে যা মূল্যায়ন করবেন তা এলোমেলোভাবে চয়ন করুন যাতে এটি সর্বদা অন্যটির আগে পছন্দ না করে। আমি না ইউক্লিডিয় / কার্টিজিয়ান দূরত্ব ব্যবহার করা হয় তবে আপনি গ্রিড উপর স্থানান্তর করতে চান সুপারিশ; এটি একটি অমিল যা এ * রানকে ধীর করে তোলে।
  2. আপনার গ্রিডে সরানোর দরকার নেই, এবং একটি সরলরেখায় যেতে চান। একটি পদ্ধতি হ'ল "স্ট্রিং পুলিং" ব্যবহার করে পথগুলি সোজা করা। আপনি সেই জায়গাগুলি সন্ধান করছেন যেখানে পথটি সরে যায় এবং সেই পয়েন্টগুলির মধ্যে সরল রেখা আঁকতে হবে। আর একটি পদ্ধতি হ'ল এটি অন্তর্নিহিত গ্রাফটিতে প্রয়োগ করা। গ্রিডে পাথফাইন্ডিংয়ের পরিবর্তে মানচিত্রে মূল পয়েন্টগুলিতে পাথফাইন্ড করুন এবং তারপরে সেই মূল পয়েন্টগুলির মধ্যে সরলরেখাগুলি বরাবর সরান। আপনি এখানে একটি উদাহরণ দেখতে পারেন । তবুও আরেকটি পন্থা হ'ল থেটা * অ্যালগরিদম

ভাল উত্তর. আমি আমার প্রশ্নটি কিছু নতুন তথ্য দিয়ে আপডেট করেছি, আশা করি আপনি নিজের উত্তরটি কিছুটা নির্দিষ্ট করতে পারবেন।
বেনামে সত্তা

আমি মনে করি বাধা সম্পর্কে কিছুটা প্রত্যাশিত; হিউরিস্টিক পৃষ্ঠায় একটি চিত্র রয়েছে যার শিরোনাম রয়েছে "প্রতিবন্ধকতাগুলির সাথে কম সুন্দর" is টাই ব্রেকিং পন্থাগুলি বাধার আশেপাশে খুব একটা সহায়তা করে না। অন্য পদ্ধতির মধ্যে একটির (যেমন থেটা *) আপনি যা চান তা হতে পারে।
amitp

2

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

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

একটি ভাল সূত্র হতে পারে:

cost = normal_cost * (1.1 - 0.1 / num_of_steps_in_the_same_direction)

নোট করুন যে এর জন্য প্রয়োজন যে পথ-ব্যয়টি পূর্ণসংখ্যার হিসাবে নয়, ভাসমান-পয়েন্টের মান হিসাবে ট্র্যাক করা উচিত।


1

অভিযোজন এ *

ফিলিপ যেমন বলেছিল, দিক দীর্ঘদিন পরিবর্তিত হয় না তখন আপনার ব্যয় যোগ করা উচিত। তবে, ফিলিপ দ্বারা করা এই ক্রিয়াকলাপটি অতিরিক্ত অতিরিক্ত ব্যয়ের পরিমাণ দ্রুত বাড়িয়ে তুলতে পারে, যা অতিরিক্ত টাইল সন্ধানের জন্য ব্যয়ের চেয়ে বেশি। তবে তার মূল ধারণাটি সঠিক!

"সমস্ত" অনুকূল পাথ (সবচেয়ে সংক্ষিপ্ত দৈর্ঘ্যের সহ) গণনা করার জন্য এবং এরপরে অন্য একটি হিউরিস্টিক দ্বারা এটিকে একটি নির্বাচন করা সহজ * বলে মনে হয় * কিন্তু একটি সমস্যা আছে. আপনার যদি দীর্ঘ পথ থাকে তবে অনুকূল দৈর্ঘ্য সহ অনেকগুলি সমাধান হতে পারে। এর ফলে এ * অ্যালগোরিদমকে এই সমস্ত অন্যান্য সমাধানগুলি গণনা করতে আরও বেশি সময় লাগে। এটি গ্রিড কারণ। আপনি 90 ডিগ্রির পরিবর্তে 80 ডিগ্রি হাঁটতে পারবেন না, যা একটি অনুকূল সমাধানের পরিবর্তে একাধিক সাবঅপটিমাল সলিউশনে নিয়ে যায়। কল্পনা করার জন্য, কোনও বাধা ছাড়াই মানচিত্রের কল্পনা করুন। X- দূরত্বটি 2 y- দূরত্ব 3 This এর অর্থ, সমস্ত সংক্ষিপ্ততম পাথগুলিতে 2 টি তির্যক চল এবং 1 টি সোজা পদক্ষেপ থাকে। এই সহজ পাথের জন্য 3 টি বৈধ সংমিশ্রণ রয়েছে: এসডিডি, ডিএসডি, ডিডিএস (যেখানে ডি = ডায়াগোনাল, এস = স্ট্রেইট)। প্রকৃত "মজা" ইতিমধ্যে শুরু হয় যখন আপনার উদাহরণ সহ পাথ থাকে 3 টি সোজা এবং 2 টি তির্যক পদক্ষেপ: এসএসএসডিডি, এসএসডিএসডি, এসএসডিডিএস, এসডিএসডিএস, এসডিএসডিএস, এসডিডিএসএস, ডিএসএসএসডি, ডিএসএসডিএস, ডিএসডিএসএস, ডিডিএসএস (সবচেয়ে ছোট পথের 10 টি প্রকরণ, যদি আমি কোনও চিহ্ন নাও থাকে)। আমার ধারণা আপনার ধারণাটি পাওয়া উচিত ছিল ...

সুতরাং আমাদের কম খরচে (বা কেবলমাত্র একটি সমাধান) "অনুকূল" হ'ল ব্যয়টির কার্যকারিতাটি এমনভাবে মানিয়ে নেওয়া উচিত।

ব্যয় কার্য সম্পাদন

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

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

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

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