এনএক্সএনএক্সএন কিউবিক জালিতে সমস্ত পয়েন্ট পয়েন্ট তৈরি করতে অ্যালগরিদম যা প্রতিসমের অধীনে অনন্য


10

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

একটি এনএক্সএনএক্সএন কিউবিক ল্যাটিস রয়েছে, উদাহরণস্বরূপ যদি এন = 2 এর মধ্যে (0,0,0), (0,1,0), (1,0,0), (1,1,0), (0, 1,1), (0,0,1), (1,0,1), (1,1,1)।

এই ল্যাটিসটি থেকে আমি পুনরাবৃত্তভাবে সমস্ত সেট মি পয়েন্ট তৈরি করব, এরকম কিছু:

solve(set_of_points) {
     if set_of_points.size = m, finish

     do some useful computation here

     for each point in lattice not in set_of_points:
         solve(set_of_points + new_point);
}

এরপরে একে খালি সেট_পো_পয়েন্ট দিয়ে শুরু করে বলা যেতে পারে।

সমস্যার প্রকৃতিটি হ'ল আমার আসলে মি পয়েন্টগুলির প্রতিটি অনুক্রমের প্রয়োজন হয় না , কেবল কিউবের প্রাকৃতিক প্রতিসাম্যের অধীনে অনন্য।

উদাহরণস্বরূপ, একটি 2x2x2 কিউব নিন এবং ধরুন আমরা 1 পয়েন্টের সমস্ত সেট চাই। উপরের বেসিক অ্যালগরিদমের অধীনে 1 পয়েন্টের 8 টি আলাদা সেট রয়েছে।

তবে কিউবের প্রতিসাম্য ব্যবহার করে আমরা এটিকে 1 পয়েন্টের 1 অনন্য সেটকে হ্রাস করতে পারি, যেহেতু মূল 8 টি সমস্ত কিউবের প্রতিসাম্যের অধীনে সমান (তারা এই ক্ষেত্রে সমস্ত 'কোণ')।

যদি ঘনক্ষেত্রটি 2x2x2 এবং মি = 2 হয় তবে বেসিক অ্যালগরিদমে 28 টি সেট রয়েছে তবে এটি প্রতিসমের অধীনে মাত্র 3 এ চলেছে (যেমন {(0,0,0), (1,0,0)}, {(0 , 0,0), (1,1,0)}, {(0,0,0), (1,1,1)})

স্পষ্টতই 3 সেট পয়েন্টগুলিতে গণনা করা 28 এর চেয়ে অনেক ভাল, সুতরাং আমার প্রশ্নটি হল আমি ইতিমধ্যে উত্পন্ন উত্সের প্রতিসাম্য সমতুল্য পয়েন্টগুলির সেট তৈরি না করে কীভাবে যাব? বা যদি এটি সম্ভব না হয় তবে আমি কীভাবে কমপক্ষে সেটগুলির সংখ্যা কিছুটা কমিয়ে আনব।

(দ্রষ্টব্য - যদি মি = 1 এটি তুলনামূলকভাবে সহজ হয় - কেবল সীমানায় কিছুটা ঝাঁকুনির সাথে অন্য শীর্ষগুলির চেয়ে যে পয়েন্টগুলি (0,0,0) এর নিকটবর্তী হয় কেবল তা বেছে নিন m এটি এম> 1 এর জন্য এটি পায় একটি বাস্তব সমস্যা হতে)


1
প্রতিসম সমতুল্য দ্বারা আপনি কোন কাজগুলি অন্তর্ভুক্ত করেছেন: কেন্দ্রের মাধ্যমে মিরর-প্লেনগুলি? কেন্দ্রের মাধ্যমে পয়েন্ট-ইনভার্শন? কেন্দ্রের মাধ্যমে তিনটি 4-ঘূর্ণন-অক্ষ?
BmyGuest

যে কোনও আইসোমেট্রি কৌশলটি করবে
rbennett485

আপনি যদি এখনও আশেপাশে থাকেন তবে পয়েন্টগুলির এম-সেটটিতে পুনরাবৃত্তি অনুমোদিত হবে? উদাহরণস্বরূপ, মি = 3 এর জন্য valid (0,0,0), (1,1,1), (0,0,0) one একটি বৈধ নির্বাচন হিসাবে বিবেচিত হবে?

@ ব্ল্যাকপেন না, এটি 3 টি অনন্য পয়েন্ট হওয়া দরকার
rbennett485

উত্তর:


1

বেসিক ধারণা:

(1) আমরা বিন্দুটি (0,0,0) কেবলমাত্র 000 হিসাবে দেখতে পারি the এখন জালির প্রতিটি পয়েন্ট একটি সাধারণ ক্রমে পড়ে। প্রথম পয়েন্টটি 000, তারপরে 001, তারপরে 010 011 100 101 110 এবং 111 This এটি আপনাকে পয়েন্ট-সেটে যুক্ত করার চেষ্টা করবে।

(২) একইভাবে, সেট {(0,0,0), (0,0,1), (0,1,0) simply কেবল 000001010 হিসাবে দেখা যাবে, এবং সেটটি {(0,0,0) , (0,1,0), (0,0,1) 00 কেবল 000010001 হিসাবে দেখা যায় Two দুটি ভিন্ন সেট একই ক্রম হতে পারে না এবং আপনি 000001010 সংখ্যা বা বর্ণমালার তুলনায় 000010001 এর চেয়ে কম হিসাবে দেখতে পারবেন view একে সেট-মান বলি। এন পয়েন্টগুলির প্রতিটি সম্ভাব্য সেটের এখন একটি সেট-মান রয়েছে এবং এন পয়েন্টগুলির সমস্ত সম্ভাব্য সেট এখন একটি সহজ সু-অর্ডারের তালিকায় পড়ে।

(3) পয়েন্ট-সেটগুলির প্রতিটি আইসমোরিক গ্রুপের ঠিক এক সদস্য থাকে যার সর্বনিম্ন সেট-মান থাকে। তারাই কেবলমাত্র যেখানে আমরা "দরকারী গণনা" করি।

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

solve(set_of_points,new_point) {
 set_of_points = set_of_points + new_point
 do some useful computation here
 if set_of_points.size = m, compute how many isomophisms exist, apply that multiple, finish
 for(candidate_point = new_point+1 to last_point) { /skips point-permutations for free!/
  if ISOMORPH_TESTS_CANNOT_LOWER_VALUE_OF(set_of_points+candidate_point) {
   solve(set_of_points,candidate_point);
  }
 }
}

1

উপরের উত্তর স্বরলিপি গ্রহণ।

প্রথমে ফাংশনটি ঘোরানো (দিকনির্দেশ, সংখ্যা_আপনি সময়) দ্বারা প্রস্তাবিত প্রতিযোগিতা সংজ্ঞায়িত করতে দিন

সমাধান:

(1) প্রতিটি পতাকা = 0 দিয়ে আদেশের সব সেটের হ্যাশ তৈরি করুন। উদাহরণস্বরূপ এন = 2, মি = 2 000,001 = 0 000,010 = 0 000,011 = 0 ইস্ট '...

(২) আর ডি সেট থেকে শুরু করুন, উদাহরণস্বরূপ i = 000,001

(3) ঘোরান ফাংশন (বা আপনার পছন্দ মতো অন্য কোনও প্রতিসাম্য) ব্যবহার করে সেট i কে সমস্ত দিকে ঘোরান উদাহরণস্বরূপ, ঘোরার প্রতিটি ক্রমবর্ধনের জন্য ঘোরানো ফাংশনটি 24 বার কল করা উচিত।

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

ব্যাখ্যা: যে কোনও সংখ্যা 1-6 আপনার সামনে থাকতে পারে এবং প্রতিটি সংখ্যার 4 বার ঘোরানো যায়, সুতরাং 6 * 4 = 24

(4) সংমিশ্রণ থেকে পুনরুদ্ধার করা প্রতিটি সেটের জন্য, হ্যাশের পতাকাটি 1 এ সেট করুন (এটি ইতিমধ্যে প্রতিসাম্যিক সেট রয়েছে)

(৫) পরবর্তী সেটটিতে i আপডেট করুন উদাহরণস্বরূপ i = 000,010

()) যদি হ্যাশের সেট আইটি ইতিমধ্যে চিহ্নিত করা থাকে, (5) এ যান অন্যথায় (3) এ যান

সমস্ত হ্যাশ 1 হিসাবে চিহ্নিত করা হলে আমরা শেষ করি।


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

1

দ্রষ্টব্য: আমি কেবল আয়নার প্রতিসারণগুলি নিয়েই ভাবি, এখানে ঘূর্ণমান প্রতিসারণ নয়।

ধরা যাক, আমাদের ডি- ডাইমেনশনগুলির একটি (হাইপার) কিউব রয়েছে , প্রতিটি এন ইউনিট দীর্ঘ (একটি রুবিকের কিউব হবে d = 3, n = 3 )।

একটি নিষ্পাপ অ্যালগরিদম পয়েন্টগুলির n ^ d সংমিশ্রণ তৈরি করে এবং অন্য সকলের সাথে প্রতিসাম্য সংঘর্ষের জন্য প্রতিটি পরীক্ষা করে দেখত।

আমরা যদি কিছুটা ভেক্টর এন ^ ডি বিট দীর্ঘ হিসাবে পয়েন্টগুলির সংমিশ্রণ উপস্থাপন করি তবে আমরা বিট ভেক্টরের সমস্ত প্রতিসাম্যকে সত্য করে চিহ্নিত করতে একটি মানচিত্র (বিট ভেক্টর -> বুলিয়ান) ব্যবহার করতে পারি । এরপরে মানচিত্রে চিহ্নিত হয়ে থাকলে আমরা কোনও সংমিশ্রণটি এড়িয়ে যেতে পারি।

এই পদ্ধতিরটি খুব স্পেস-অদক্ষ 2 এটি 2 ^ (n) d) এন্ট্রি সহ একটি মানচিত্র নেয় , এটি এই বিটগুলির সাথে একটি বিটম্যাপ। (রুবিকের ঘনক্ষেত্রের জন্য এটি 2 ^ 27 = 128Mbit = 16 Mbytes হবে)

আমরা কেবল ক্যানোনিকাল উপস্থাপনাগুলি মনে করতে পারি, তা হ'ল এই জাতীয় বিট ভেক্টরগুলির মধ্যে সবচেয়ে ছোট পূর্ণসংখ্যার মান রয়েছে, যদি এটি একটি এন ^ ডি- বিট স্বাক্ষরযুক্ত শব্দ হিসাবে প্রতিনিধিত্ব করে । যখন আমরা পয়েন্টগুলির একটি নতুন ক্রম উত্পাদন করি, আমরা এর সমস্ত প্রতিসাম্য তৈরি করি এবং কেবলমাত্র যদি আমরা ক্ষুদ্রতম সংখ্যাসূচক মানের সাথে প্রতিসাম্যটি দেখেছি কিনা তা পরীক্ষা করে দেখি। এটি আমাদের কাছে কেবলমাত্র 2 ^ n বিট (রুবিকের ঘনক্ষেত্রের জন্য 1 বাইট) ম্যাপের ম্যাপটি সংরক্ষণ করতে দেয় , কারণ আমাদের কাছে 2 ^ d প্রতিসাম্য রয়েছে। এটি আমাদের প্রতিটি পদক্ষেপে এই 2 ^ d প্রতিসাম্য তৈরি করতে সক্ষম করে, যদিও আমরা ও (2 ^ (d ^ n + d)) = ও (2 ^ (ডি ^ এন) * 2 ^ ডি) সময় ব্যয় করি। তবু দরিদ্র।

আমরা পূর্ববর্তী অনুচ্ছেদ থেকে 1-মাত্রিক ক্ষেত্রে ধারণাটি প্রয়োগ করতে পারি। দৈর্ঘ্যের d এর ভেক্টরে সমস্ত সংমিশ্রণ তৈরি করতে, আমরা কেবলমাত্র সমস্ত বর্গ থেকে শুরু করে দীর্ঘ বাইনারি সংখ্যা ডি বিট বৃদ্ধি করতে পারি 0। আসুন আমাদের ভেক্টরকে দুটি ডি / 2- দীর্ঘ অংশগুলিতে ভাগ করুন, যেমন বাম এবং ডানদিকে। আমরা লক্ষ করতে পারি যে 1বাম অংশে প্রতিটি বিটের জন্য আমাদের কেবলমাত্র সংমিশ্রণগুলি দেখতে হবে 1যা ডান বিভাগের প্রতিসাম্য অবস্থানে বিট রয়েছে। অন্যথায় আমরা ইতিমধ্যে একটি প্রতিসম সংমিশ্রণটি তৈরি করতে পেরেছিলাম, যখন বিটগুলির অবস্থানগুলি অদলবদল করা হয়েছিল, এবং এর 0আগে এসেছিল 1। এইভাবে, ডান অর্ধেক (আর) এর প্রতিটি বিট পজিশনের জন্য এবং বাম অর্ধেকে প্রতিসম অবস্থানের জন্য(ঠ) আমাদের কেবল 3 টি সংমিশ্রণ তৈরি করতে হবে: (l = 0, r = 0); (l = 1, আর = 1); (ঠ = 1, R = 0) । সুতরাং আমাদের কেবল দৈর্ঘ্যের d এর একটি ভেক্টরের 2 ations (d / 2) অনুক্রম তৈরি করতে হবে , প্রতিটি ক্রমের জন্য 3 টি সংমিশ্রণ পাওয়া যায়।

ডি ডাইমেনশনের ঘনকটি এন ^ (ডি -১) ভেক্টর দিয়ে তৈরি করা যেতে পারে। উপরের কৌশলটি ভেক্টরগুলিকে ভোজনভিত্তিক পদ্ধতির চেয়ে কম সস্তা দেয়। একটি ঘনক উৎপন্ন করার জন্য, আমরা প্রয়োজন হে (ঢ ^ (ঘ-1) * 2 ^ (ঘ / 2)) সময়।

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

এখন আমরা যদি এই মাত্রাটি জুড়ে দেখি তবে আমরা একই কৌশলটি পুনরায় ব্যবহার করতে পারি।

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

এই কৌশলটি তৃতীয় মাত্রা ইত্যাদির সাহায্যে নিম্নলিখিত প্লেনগুলির ক্রম নির্ধারণের আরও সীমাবদ্ধকরণের জন্য প্রয়োগ করা যেতে পারে etc.

যদিও একটি সম্পূর্ণ অ্যালগরিদম না, আমি আশা করি এটি সাহায্য করবে।

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