কীভাবে সীমাবদ্ধ চলাচলে প্যাথফাইন্ডিং অ্যালগরিদমকে অভিযোজিত করবেন?


10

গাড়ির মতো চলাচলের কল্পনা করুন যেখানে সত্তাগুলি একটি ডাইম চালু করতে পারে না। বলুন, আলোচনার খাতিরে, যখন গতিতে তারা প্রতি সেকেন্ডে 90 ডিগ্রি ঘুরতে পারে। এটি অনেক ক্ষেত্রে অনুকূল পথ এবং সেইজন্য প্যাথফাইন্ডিং পরিবর্তন করে। এমনকি এটি 'স্বাভাবিক' পথগুলি অতিক্রম করা সম্পূর্ণ অসম্ভব করে তুলতে পারে।

এমন কোনও প্যাথফাইন্ডিং অ্যালগরিদম বা আন্দোলনের পরিকল্পনার অ্যালগরিদম রয়েছে যা এটিকে মাথায় রাখতে পারে, বা জনপ্রিয়গুলির সাথে খাপ খাইয়ের সহজ উপায় আছে?


পাথফাইন্ডিংয়ে গতি-ডেটাও অন্তর্ভুক্ত থাকবে? যেমন, এক্স কিমি / ঘন্টা (বা এমপিএফ) এ এ থেকে বিতে যান, বা এটি একটি ধ্রুবক গতি হবে? এছাড়াও, ধীরে গতিতে প্রতি সেকেন্ডে 90 ডিগ্রি খুব বন্ধ বাঁক হয়ে শেষ হতে পারে, এমনকি শারীরিকভাবেও অসম্ভব। (যতক্ষণ না আপনার চারটি চাকা এক্সডি ঘুরিয়ে দেওয়া থাকে)
ব্রায়ান এইচ।

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

আমি এটি একটি খুব আকর্ষণীয় প্রশ্ন পেয়েছি, আমার কাছ থেকে একটি +1 পেয়েছি, কিছু ঝরঝরে উত্তর দেখার অপেক্ষা করতে পারি না :)
ব্রায়ান এইচ।


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

উত্তর:


10

অ-সর্বজনীন গতি পরিকল্পনার দুর্দান্ত পৃথিবীতে আপনাকে স্বাগতম । আমি ল্যাটিস গ্রিড পাথ প্ল্যানার ব্যবহার করে এটি করার পরামর্শ দিচ্ছি । অন্যান্য বিকল্পের মধ্যে কিনোডাইনামিক আরআরটি এবং ট্র্যাজেক্টোরি অপ্টিমাইজেশন অন্তর্ভুক্ত রয়েছে । নন-হোলোনমিক সিস্টেমে গাড়ি, নৌকা, আনসাইকেল বা সত্যিই এমন কিছু অন্তর্ভুক্ত থাকে যেখানে যানবাহন তার পছন্দমতো পথে ভ্রমণ করতে পারে না। এই সিস্টেমগুলির জন্য পরিকল্পনা হোলোনমিক সিস্টেমগুলির চেয়ে অনেক বেশি শক্ত এবং academic 2000 অবধি একাডেমিক গবেষণার প্রান্তে ছিল। আজকাল প্রচুর অ্যালগরিদম রয়েছে যা থেকে শালীনতার সাথে কাজ করে।

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

এখানে কিভাবে এটা কাজ করে.

রাষ্ট্র

আপনার গাড়ির কনফিগারেশন q আসলে একটি 3D স্টেট যা গাড়ির এক্স, ওয়াই অবস্থান এবং এর অরিয়েন্টেশন t যুক্ত করে । আপনার এ * অ্যালগোরিদমের নোডগুলি আসলে 3 ডি ভেক্টর।

class Node
{
    // The position and orientation of the car.
    float x, y, theta;
}

ক্রিয়াকলাপ

তাই প্রান্ত সম্পর্কে কি?

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

class Action
{
    // The direction of the steering wheel.
    float wheelDirection;

    // The speed to go at in m/s.
    float speed;

    // The time that it takes to complete an action in seconds.
    float dt;
}

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

Action turnRight;
turnRight.speed = 1;
turnRight.wheelDirection = 1;
turnRight.dt = 0.5;

গাড়িটি বিপরীতে স্থাপন করা এবং ব্যাক আপ নেওয়া এই রকম হবে:

Action reverse;
reverse.speed = -1;
reverse.wheelDirection = 0;
reverse.dt = 0.5;

এবং আপনার ক্রিয়াকলাপগুলির তালিকাটি এর মতো দেখাবে:

List<Action> actions = { turnRight, turnLeft, goStraight, reverse ...}

নোডে নেওয়া কোনও পদক্ষেপ কীভাবে একটি নতুন নোডের ফলাফল দেয় তা নির্ধারণ করার একটি উপায়ও আপনার প্রয়োজন। একে সিস্টেমের ফরোয়ার্ড ডায়নামিক্স বলা হয় ।

// These forward dynamics are for a dubin's car that can change its
// course instantaneously.
Node forwardIntegrate(Node start, Action action) 
{
    // the speed of the car in theta, x and y.
    float thetaDot = action.wheelDirection * TURNING_RADIUS;

    // the discrete timestep in seconds that we integrate at.
    float timestep = 0.001;

    float x = start.x;
    float y = start.y;
    float theta = start.theta;

    // Discrete Euler integration over the length of the action.
    for (float t = 0; t < action.dt; t += timestep)
    {
       theta += timestep * thetaDot;
       float xDot = action.speed * cos(theta);
       float yDot = action.speed * sin(theta);
       x += timestep * xDot;
       y += timestep * yDot;
    }

    return Node(x, y, theta);
}

পৃথক গ্রিড ঘর

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

GridCell hashNode(Node node)
{
    GridCell cell;
    cell.x = round(node.x / X_RESOLUTION);
    cell.y = round(node.y / Y_RESOLUTION);
    cell.theta = round(node.theta / THETA_RESOLUTION);
    return cell; 
}

এখন, আমরা একটি এ * পরিকল্পনা করতে পারি যেখানে গ্রিডসেলগুলি নোড, ক্রিয়াগুলি নোডগুলির মধ্যে প্রান্ত এবং গ্রিডসেলের ক্ষেত্রে স্টার্ট এবং লক্ষ্য প্রকাশ করা হয়। দুটি গ্রিডসেলের মধ্যে হিউরিস্টিক হ'ল x এবং y এর সাথে দূরত্বে কোণার দূরত্ব।

পথ অনুসরণ করা

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


দুর্দান্ত পোস্ট (এবং এমনকি সংক্ষিপ্ত! আমি নৌকাগুলির জন্যও অনুরূপ কিছু করি - পিচ্ছিল :-)। Otoh, সেখানে আরও জায়গা হয়,
Stormwind

4

বেশিরভাগ পাথ সন্ধানকারী অ্যালগরিদমগুলি জ্যামিতির সীমাবদ্ধতা ছাড়াই একটি স্বেচ্ছাসেবক গ্রাফে কাজ করে।

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


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

6
@WeckarE। কিন্তু গাড়ী একই নোড পরিদর্শন করে না। এটি 2 নোডগুলিতে পরিদর্শন করে যা একই অবস্থানের সাথে পৃথক ওরিয়েন্টেশন
ratchet freak

3
@WeckarE। এগুলি দুটি পৃথক নোড হিসাবে বিবেচনা করুন। শারীরিক গ্রাফ এবং লজিক্যাল গ্রাফের ঠিক এক রকম হওয়ার দরকার নেই।
ব্লুরাজা - ড্যানি পিফ্লুঘুফ্ট

1

আমার চিন্তা, তাদের পরীক্ষা করা হয়নি!

  1. শুরু থেকে গন্তব্য পর্যন্ত A * চালান , পথটি ফিরে যান।
  2. পথটির মধ্য দিয়ে লুপ করুন, যখন আপনি কোনও পালা শনাক্ত করেন, তখন বেজিয়ার অ্যালগরিদম (বা এটির মতো কোনও) ব্যবহার করুন যা সন্ধানকারীদের বর্তমান গতি ব্যবহার করে নোডগুলির পূর্বাভাস দেয় যা একটি মসৃণ মোড় তৈরি করবে। এটি সবচেয়ে কাছের পাথ-নোডে ফিরে যাওয়ার চেষ্টা করে তা নিশ্চিত করুন।
  3. যদি টার্নটি সম্পন্ন করা যায় তবে দুর্দান্ত, যদি না হয় তবে ধীর গতির সাথে পুনরাবৃত্তি করুন, আরও তীব্র টার্নের জন্য।
  4. একবার সঠিক পাথ তৈরি হয়ে গেলে, মোড় ঘুরিয়ে দেওয়ার আগে সন্ধানীর গতি সামঞ্জস্য করার পথে আবার ফিরে যান যাতে মোড় শুরুর আগে এটি সঠিক গতিতে ধীর হয়ে যায়।
  5. যদি মোড়টি আদৌ তৈরি করা না যায় তবে পুরো জিনিসটি আবার চালান। বাঁকটি তৈরি করা যায় না এমন সমস্ত হ্যান্ডল্ড নোডগুলি বন্ধ তালিকায় রয়েছে তা নিশ্চিত করুন, তাই সেগুলি উপেক্ষা করা হয়। এবং আপনি সেই বিন্দুটি দিয়ে শুরু করতে পারেন যেখানে টার্নটি শুরু হয়েছিল যাতে আপনি পথের সফল অংশটি এড়িয়ে যেতে পারেন তবে কিছু ক্ষেত্রে এটি সম্ভবত সর্বোত্তম পথের চেয়েও কম পথ তৈরি করতে পারে।

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

রাস্তা খোঁজা


0

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

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

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

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