একে অপরকে দেখতে পারে এমন গ্রুপ ইউনিটের দ্রুততম উপায়?


12

আমি যে 2 ডি গেমের সাথে কাজ করছি তাতে গেম ইঞ্জিন আমাকে প্রতিটি ইউনিটের জন্য তার ইউনিটগুলির দর্শন সীমার মধ্যে থাকা অন্যান্য ইউনিটের তালিকা দিতে সক্ষম হয়।

আমি জানতে চাই যে গ্রুপগুলিতে ইউনিটগুলি বাছাই করার জন্য একটি প্রতিষ্ঠিত অ্যালগরিদম রয়েছে কিনা , যেখানে প্রতিটি গ্রুপ একে অপরের সাথে "সংযুক্ত" থাকা সমস্ত ইউনিট (এমনকি অন্যদের মাধ্যমে) দ্বারা সংজ্ঞায়িত হবে।

একটি উদাহরণ প্রশ্ন আরও ভাল বুঝতে সাহায্য করতে পারে (ই = শত্রু, ও = নিজস্ব ইউনিট)। গেম ইঞ্জিনটি থেকে আমি যে ডেটা পেতে পারি তা প্রথম:

E1 can see E2, E3, O5
E2 can see E1
E3 can see E1
E4 can see O5
E5 can see O2
E6 can see E7, O9, O1
E7 can see E6
O1 can see E6
O2 can see O5, E5
O5 can see E1, E4, O2
O9 can see E6

তারপরে আমার গ্রুপগুলি নিম্নরূপে গণনা করা উচিত:

G1 = E1, E2, E3, E4, E5, O2, O5
G2 = O1, O9, E6, E7

এটি নিরাপদে অনুমান করা যায় যে দেখার ক্ষেত্রের জন্য একটি পরিবহণযোগ্য সম্পত্তি রয়েছে: [যদি এ বি দেখায়, তবে বি এ দেখেন]।

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

আপনার সাহায্যের জন্য অগ্রিম ধন্যবাদ!


1
আমি মনে করি এই প্রশ্নটি যথেষ্ট সাধারণ যে এটি স্ট্যাকওভারফ্লোতে আরও ভাল উত্তর পেতে পারে, বা এমনকি গণিতেও (সেট থিউরি?) থাকতে পারে। এটি গেম ডেভেলপমেন্ট সুনির্দিষ্ট নয় আমার বিষয়।
টোর ভ্যালামো

1
@ টোর - সম্ভবত সত্য, তবে আমরা জানি যে এটি কোনও গেমের জন্য, কারণ এই সমস্যাটি আরও নির্দিষ্ট করে এমন লোকদের উত্তর সজ্জিত করতে পারে।
রবার্ট ফ্রেজার

আমি মনে করি আপনি স্থানিক হ্যাশিং এবং একটি দৃশ্যমানতার মানচিত্রের স্পিনের সাহায্যে কিছু চালাক স্টাফ করতে পারেন - আমার কেবল এটি সম্পর্কে চিন্তা করা দরকার।
জোনাথন ডিকিনসন

উত্তর:


7

যদি আপনার "দেখতে পারে" সম্পর্কটি প্রতিসম হয়, যাতে "এ বি দেখতে পারে" বোঝায় "বি এ দেখতে পারে", তারপরে আপনি যে গোষ্ঠীগুলি গণনা করতে চান তা হ'ল "দেখতে পারে" সম্পর্ক দ্বারা সংজ্ঞায়িত গ্রাফের সংযুক্ত উপাদানগুলি । অন্যরা যেমন উল্লেখ করেছে, এগুলি গণনা করার জন্য সাধারণ অ্যালগরিদম রয়েছে, যেমন:

while ungrouped units remain:
    let u = arbitrary ungrouped unit
    let g = new group
    let s = temporary stack
    assign u to g
    push u onto s
    while s is not empty:
        let v = topmost unit in s
        remove v from s
        for each unit w that v can see:
            if w is ungrouped:
                assign w to g
                push w onto s
            end if
        end for
    end while
 end while

(একটি সারি বা অন্য কোনও সংগ্রহ যা কার্যকরভাবে কার্যকরভাবে প্রয়োগ করে "নতুন উপাদান যুক্ত করুন" এবং "কিছু উপাদান সরান এবং ফিরিয়ে আনুন") স্ট্যাকের জায়গায় ব্যবহার করা যেতে পারে s উপরের ))

আপনার "দেখতে পারেন" সম্পর্ক হয়, তাহলে না প্রতিসম, আপনি কিনা আপনি আপনার গ্রুপ হতে চান সিদ্ধান্ত নিতে হবে দৃঢ়ভাবে বা স্বাস্থ্যহীন সংযুক্ত উপাদান। দুর্বলভাবে সংযুক্ত উপাদানগুলির জন্য, উপরের অ্যালগরিদম যেমনটি কাজ করবে, লাইনটি for each unit w that v can seeপরিবর্তিত করা উচিত for each unit w that can see v, or that v can see। জন্য জোরালোভাবে সংযুক্ত উপাদান , আপনি আলগোরিদিম এক (ব্যবহার করতে পারেন Kosaraju এর , Tarjan এর বা Gabow এর ) লিঙ্ক উইকিপিডিয়া পৃষ্ঠাতে উল্লেখ করেছে।

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


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

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

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

4

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

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

তবে সাধারণভাবে, আপনাকে প্রতিটি ফ্রেমের দৃশ্যমানতার পুনরায় পরীক্ষা করতে হবে। মতভেদগুলি হল, এটি দৃশ্যমানতার গ্রুপগুলি খুঁজতে গ্রাফ ট্র্যাভার্সালের চেয়ে ধীর হতে চলেছে।


3
কেবল প্রযুক্তিগত শব্দটি যুক্ত করার জন্য: আপনি যা অনুসন্ধান করার চেষ্টা করছেন তা হ'ল গ্রাফের সংযুক্ত উপাদানগুলি এবং মানক অ্যালগোরিদম হ'ল: (1) সমস্ত নোডকে একটি তালিকায় রাখুন, (2) একটি নোড বাছুন, (3) সন্ধান করুন বিএফএস / ডিএফএস ব্যবহার করে সমস্ত সংযুক্ত নোড, (4) তালিকা থেকে আপনি খুঁজে পাওয়া সমস্ত নোড সরিয়ে ফেলুন, (5) আর কোনও নোড না রেখে পুনরাবৃত্তি করুন।
নাথন রিড

3

মানক গ্রাফ সংযোগের সমস্যার মতো মনে হচ্ছে। এটির জন্য বেশ কয়েকটি ধরণের অ্যালগরিদম থাকতে পারে এবং এটি নীচের মত দেখাতে পারে:

remaining units = all units
for each unit in remaining units:
    current group = create a new group
    add this unit to current group
    for each unit visible to this unit:
        if unit is in a group already:
            merge current group into that existing group
            set current group as that existing group
        else:
            remove that unit from remaining units
            add that unit to current group

আমি আশা করি এটি হায়ারারিকিকাল ক্লাস্টারিংয়ের মতো একটি গাছের মাধ্যমে এটি বাস্তবায়ন করা সম্ভব, তবে আমি সন্দেহ করি যে এটি দ্রুত কাজ করবে - গাছগুলি O (লগ এন) হিসাবে থাকে যদিও আমি উপরে দেওয়া বেশিরভাগ চেকগুলি ও (1) হিসাবে প্রয়োগ করা যেতে পারে ।


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

এটিই আমি আমার ওপিতে নির্বাক বাস্তবায়ন হিসাবে উল্লেখ করেছি। জেনে রাখা ভাল যে আমি তখন ভেবেছিলাম ততটা খারাপ হতে পারে না! :)
ম্যাক

গাছ হিসাবে আপনি যেভাবে এটি করেন তা হ'ল পথ সংকোচনের সাথে একটি ইউনিয়ন সেট ব্যবহার করা । এটি খুব নির্বোধ নয়, এবং বাস্তবে সর্বোত্তম।
পিটার টেলর

2

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

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

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