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

বিবর্তন, যেখানে কোড মিউটেট করে
IEEE Conference on Games 2026-এ প্রকাশের জন্য গৃহীত সাম্প্রতিক একটি গবেষণায়, লেখকরা এই ধারণাটি চারটি ক্লাসিক গেমে পরীক্ষা করেছেন: «সোকোবান», «জেল্ডা», «Dangerous Dave» এবং «Lode Runner»। বিবর্তনের প্রতিটি রান ছিল Python-এ লেখা একটি সম্পূর্ণ লেভেল জেনারেটর, আর মিউটেশন ও ক্রসওভার অপারেটরের ভূমিকা পালন করেছিল একটি বড় ভাষার মডেল। অর্থাৎ, আলাদা মানচিত্র নয়, বরং সম্পূর্ণ প্রোগ্রাম প্রজন্ম থেকে প্রজন্মে বদলাচ্ছিল। এটি নির্দিষ্ট আর্টিফ্যাক্টের জায়গার বদলে প্রসিডিউরাল জেনারেটরের জায়গায় খোঁজ চালাতে দেয় — এবং এমন সমাধান খুঁজে পেতে দেয় যা একসাথে অনেকগুলো লেভেলে প্রযোজ্য।
তবে এই পদ্ধতির একটি দুর্বল দিক আছে: প্রোগ্রামগুলো দ্রুত বেড়ে ওঠে, আর দরকারি কোডের টুকরোগুলো এলোমেলো পরিবর্তনের মধ্যে হারিয়ে যায়। এটি ঠিক করতে, লেখকরা Continual Abstraction Discovery (CAD) নামে একটি প্রক্রিয়া প্রস্তাব করেছেন — অবিরাম অ্যাবস্ট্রাকশন আবিষ্কার।
কীভাবে CAD বিবর্তনকে সাহায্য করে
CAD-এর ধারণা হলো বিবর্তনের সময় উচ্চ ফিটনেসের প্রোগ্রামগুলো থেকে সফল প্রিমিটিভগুলোকে তুলে নিয়ে সেগুলোকে আলাদা একটি সহায়ক মডিউলে জমা করা। এই মডিউলটি পরবর্তী প্রজন্মের জন্য একটি সাধারণ «লাইব্রেরি» হয়ে ওঠে। এভাবে, দরকারি প্যাটার্নগুলো নতুন করে আবিষ্কৃত হয় না এবং মিউটেশনের দ্বারা মুছে যায় না — সেগুলো জমা হয় এবং আরও ব্যবহার করা হয়।
এটি কতটা কার্যকর তা বোঝার জন্য, গবেষকরা একটি 2×2 ম্যাট্রিক্স নিয়ে পরীক্ষা চালিয়েছেন: CAD সহ এবং ছাড়া রান, পাশাপাশি একটি নির্দিষ্ট ডোমেইন API-তে অ্যাক্সেস সহ এবং ছাড়া রান তুলনা করা হয়েছিল। মোট 160টি সম্পূর্ণ বিবর্তনমূলক রান করা হয়েছিল, এবং পরীক্ষার প্রতিটি ঘরে — কমপক্ষে দশটি রান, প্রতিটিতে 50টি প্রজন্ম। এটি সিদ্ধান্ত নেওয়ার জন্য বেশ শক্তিশালী পরিসংখ্যানগত ভিত্তি।

অ্যাবস্ট্রাকশনগুলো সত্যিই কাজ করে
ফলাফলগুলো দ্ব্যর্থহীন ছিল: CAD আটটি তুলনার সবকটিতেই গড় চূড়ান্ত সেরা ফিটনেস উন্নত করেছে — চারটি গেমেই এবং API-এর উভয় ভেরিয়েন্টেই। তাছাড়া, বিবর্তনের সময় তৈরি «লাইব্রেরিগুলো» পরবর্তী বেশিরভাগ প্রোগ্রাম সক্রিয়ভাবে ব্যবহার করেছে। মজার বিষয় হলো, গেম এবং রানের শর্ত নির্বিশেষে, CAD বারবার একই ইউটিলিটিগুলো নতুন করে আবিষ্কার করেছে: লেভেলের বৈধতা পরীক্ষা, পৌঁছানোর পরীক্ষা এবং কাঠামোগত প্রিমিটিভ। এটি ইঙ্গিত দেয় যে এই ধরনের অ্যাবস্ট্রাকশনগুলো কোনো নির্দিষ্ট কাজের কাকতালীয় ঘটনা নয়, বরং গেম কনটেন্ট তৈরির মৌলিক বিল্ডিং ব্লক।
অনুশীলনের জন্য এর অর্থ কী
ব্যবহারিক দৃষ্টিকোণ থেকে, ফলাফলগুলো একটি সহজ ধারণাকে সমর্থন করে: যদি আমরা চাই যে ভাষার মডেলগুলো ভালো প্রসিডিউরাল জেনারেটর তৈরি করুক, তাহলে শুধু «ভালো» প্রোগ্রামগুলোকে উৎসাহিত করাই যথেষ্ট নয়, বরং বিবর্তনকে জ্ঞান সঞ্চয়ের একটি উপায়ও দিতে হবে। CAD ঠিক এটিই করে — বিবর্তনমূলক খোঁজকে এমন একটি প্রক্রিয়ায় রূপান্তরিত করে যা ধীরে ধীরে নিজস্ব ডোমেইন তৈরি করে। প্রতিবার শূন্য থেকে শুরু করার বদলে, মডেলটি আগে পাওয়া সমাধানগুলো থেকে শেখে এবং নির্ভরযোগ্য বিল্ডিং ব্লক তৈরি করে।
অবশ্যই, ক্লাসিক 2D গেমের পরীক্ষাগুলো শুধুমাত্র শুরু। কিন্তু যদি পদ্ধতিটি স্কেল করা যায়, তাহলে আমরা এমন জেনারেটর দেখতে পাব যা পুরো জেনার বা অপ্রত্যাশিত গেম মেকানিক্স তৈরি করে। আর তখন লেভেলের বিবর্তন অবশেষে কনটেন্ট খোঁজার বদলে ধারণার বিবর্তনে পরিণত হবে — প্রোগ্রামের ভাষায় লেখা।




