প্রক্রিয়াগতভাবে একটি বিশ্বের ইতিহাস উত্পন্ন করার উপায় আছে?


28

আমি এখানে কিছু চিত্র খুঁজে পেয়েছি যা এখানে 1800 বছরের সাংস্কৃতিক ইতিহাসকে উপস্থাপন করে যা কিছু লোক তৈরি করেছিল।

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

এই ধরণের জিনিসটির মনে হয় গেম বিকাশের জন্য দৃ applications় অ্যাপ্লিকেশন রয়েছে, বিশ্ব নকশা হিসাবে ইনফার ins

দেখে মনে হচ্ছে তিনি এই চিত্রটি হাতে হাতে করেছিলেন। আমি যা আগ্রহী তা হ'ল এই ধরণের চিত্রটি অগ্রগতিগতভাবে তৈরি করার কোনও উপায় আছে কিনা তা দেখছি।

আপনি যদি এলোমেলো মান থেকে উপরের স্টাইলে ডায়াগ্রাম তৈরির কাজটি সজ্জিত করেন তবে আপনি কীভাবে এটি ব্যবহার করবেন? আপনি বিবেচনা করবে কোন নির্দিষ্ট ডেটা স্ট্রাকচার বা অ্যালগরিদম আছে?


5
বামন দুর্গ এক নজরে দেখুন বিবেচনা করুন । উত্স অনুপলব্ধ এবং বিশ্ব প্রজন্মের প্রক্রিয়াটি অনির্ধারিত (যার কারণে আমি এর উত্তর দিচ্ছি না) তবে আপনি গেমটি খেলতে শিখতে না পেরে উত্পন্ন বিশ্ব ইতিহাস পরীক্ষা করতে পারেন এবং এটি আপনাকে এই ধরণের ধারণা দিতে পারে আপনি করতে পারেন জিনিস।
জোশ

অন্য একটি উত্স, এবং কোনও উত্তর নাও পাওয়া যেতে পারে: www-cs-students.stanford.edu/~amitp/game-pogramming/… এটি একটি পরিবেশ তৈরির জন্য একটি নিবন্ধ তবে এটি পরিবেশ কীভাবে হতে পারে তা স্পর্শ করে চলেছে সংস্থানসমূহের উপর ভিত্তি করে রাজ্যগুলির জন্য আঞ্চলিক সীমানা সংজ্ঞায়িত করার জন্য ব্যবহৃত হয়েছিল (যেমন জল, আবাদযোগ্য জমি, ইত্যাদি) যেগুলি যখন মানুষ কখন এবং কোথায় বা কীভাবে যুদ্ধের জন্য যুদ্ধে লিপ্ত হয়, আবার, কেবল একটি উত্স নয়, কোনও উত্তর নয়।
জেমস

1
এই চিত্রটি সভ্যতার 3 এর পাওয়ার গ্রাফের সাথে খুব মিল দেখাচ্ছে আপনি কিছু ধারনার জন্য সেই সিরিজটি পরীক্ষা করতে চাইতে পারেন।
ওয়াইল্ডওয়েজেল

উত্তর:


15

আপনি কতটা সঠিক হতে চান? একটি ভাল তবে জটিল পছন্দ সেই সমস্ত ইতিহাসকে অনুকরণ করে:

  1. এই অঞ্চলগুলির মধ্যে একটি এলোমেলো অঞ্চল তালিকা এবং সংলগ্নতা তৈরি করুন।
  2. জনসংখ্যা, যুদ্ধক্ষেত্র, প্রযুক্তি ... এবং অঞ্চলগুলিকে বসানোর মতো বৈশিষ্ট্য সহ এলোমেলো সভ্যতা তৈরি করুন।
  3. আপনি যতগুলি ইতিহাস চান সিমুলেট করুন সভ্যতার বৈশিষ্ট্যের ভিত্তিতে ফলাফল নির্ধারণ করে।

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

এটি কিছু প্রক্রিয়াজাতীয় গল্প বলার জন্যও মঞ্জুরি দেয়: আপনি কেবল কোনও অঞ্চল চিত্রটিই আউটপুট করতে পারবেন না, তবে ইতিহাসের পাঠ্য বিবরণও সময়ের সাথে সাথে আউটপুট করতে পারেন। আপনি এই সিস্টেমটিকে আপনার পছন্দ মতো জটিল করে তুলতে পারেন।


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

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

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

এটিই আপনার অ্যালগরিদমের মূলমন্ত্র: হিউরিস্টিক্সকে সামঞ্জস্য করা শক্ত: প্রতিটি সভ্যতার জন্য সিমুলেশনের শুরুতে কীভাবে বৈশিষ্ট্যগুলি বন্টন করা যায় এবং তাদের ভিত্তিতে সিমুলেশন রাষ্ট্রটি কীভাবে পরিসংখ্যানগতভাবে পরিবর্তন করা যায়।

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

for each civilization
  if civ.isAtWar
    civ.population -= civ.population * 0.05;
    civ.wealth -= 1000.0;
    civ.belligerence += 1.0;
  if civ.population < 100
    civ.negotiatePeace()

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

আপনার প্রশ্নের ক্ষেত্রে সুনির্দিষ্ট: আপনার প্রশ্নের মতো একটি চিত্র তৈরি করতে আপনাকে বিশ্বের অঞ্চলগুলি (ডায়াগ্রামের শীর্ষে, এক্স অক্ষের, যে পয়েন্ট 1: আমার উত্তরে অঞ্চল তালিকা তৈরি করতে হবে ) এবং তাদের সভ্যতাগুলি (বর্ণের বর্ণগুলি ডায়াগ্রাম, পয়েন্ট 2 ) সময়ের মাধ্যমে (y অক্ষ, বিন্দু 3 তে সিমুলেশন লুপ )

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


খুব সুন্দর উত্তরের জন্য ধন্যবাদ, যদিও আমি যে প্রযুক্তিগত দিকগুলি সম্পর্কে উদ্বিগ্ন তা স্পর্শ করে না
pdusen

@ পিডুসেন মন্তব্যটি বেশ দীর্ঘ পেয়েছে তাই আমি আমার উত্তরটি এটির সাথে "ইডিআইটি" চিহ্নের সাথে আপডেট করেছি।
কওড

2
আমি এই উত্তরটি যুক্ত করতে যাচ্ছি, যদি আপনি কিছু মনে করেন না?
জোনাথন ডিকিনসন


@ পিডুসেন আমি আরও কিছু বাস্তবায়ন-নির্দিষ্ট বিশদ যুক্ত করেছি।
জোনাথন ডিকিনসন

8

হ্যা এখানে. এখানে একটি ময়লা-সহজ ইতিহাস জেনারেটর:

#!/usr/bin/env python
# to create a visualisation, run like this:
#    ./timeline.py --dot | dot -Tpng > filename.png
import sys
import random
from pprint import pprint
# Names is a newline separated list of nation names.
file = "names.txt"
names = open(file, "r").read().split("\n") 
history = []
dot = False
if len(sys.argv) > 1 and sys.argv[1] == "--dot":
  dot = True

def wrap(str, wrap='"'):
  return wrap+str+wrap

def merge(states, names):
  number = random.randint(2,3)
  mergers = [] 
  if number < len(states):
    mergers = random.sample(states, number)
    new_name = random.choice(names)
    states = list(set(states).difference(set(mergers)))
    states.append(new_name)
    names.remove(new_name)
    if dot:
      for state in mergers:
        print '"%s" -> "%s"'%(state, new_name)
      print '{rank=same; %s }'%wrap(new_name)
    else:
      print "MERGE %s ==> '%s'"%( ", ".join(map(wrap,mergers)), new_name)
  return states, names 


def split(states, names):
  number = random.randint(2,3)
  if number < len(names):
    splitter = random.choice(states)
    states.remove(splitter)
    new_states = random.sample(names, number)
    names = list(set(names).difference(set(new_states)))
    states = list(set(states).union(set(new_states)))
    if dot:
      for state in new_states:
        print '"%s" -> "%s"'%(splitter, state)
      print '{rank=same; %s }'%("; ".join(map(wrap, new_states)))
    else:
      print "SPLIT '%s' ==> %s"%(splitter, ", ".join(map(wrap,new_states)))
  return states, names

def revolt(states, names):
  old = random.choice(states)
  new = random.choice(names)
  names.remove(new)
  states.remove(old)
  states.append(new)
  if dot:
    print '"%s" -> "%s"'%(old, new)
    print '{rank=same; "%s"}'%new
  else:
    print "REVOLT '%s' ==> '%s'"%(old, new)
  return states, names

def conquest(states, names):
  if len(states) > 1:
    loser = random.choice(states)
    states.remove(loser)
    winner = random.choice(states)
    if dot:
      print '"%s" -> "%s" [label="conquered by"]'%(loser, winner)
    else:
      print "CONQUEST '%s' conquered '%s'"%(winner, loser)
  return states, names


#ignore empty names
names = [name for name in names if name] #yes, really.

origin = random.sample(names, random.randint(1,3))
names = list(set(names).difference(set(origin)))
history.append(origin) #random starting states

if dot:
  print "digraph g {"
  print "{rank=same; %s}"%("; ".join(map(wrap,origin)))
else:
  print("BEGIN %s"%(", ".join(map(wrap,history[0]))))

while names:
  func = random.choice([merge, split, revolt, conquest])
  states, names = func(history[-1], names)
  history.append(states)

if dot:
  print '{rank=same; %s}'%("; ".join(map(wrap,history[-1])))
  print "}"
else:
  print "END %s"%(", ".join(map(wrap,history[-1])))

যা এই জাতীয় ফলাফল দেয়:

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

বিভিন্ন গ্রাফ তৈরি করতে হিউরিস্টিকগুলি সামঞ্জস্য করুন।

এটি করার সহজ উপায় হ'ল func = random.choice([merge, split, revolt, conquest])একই নামের একাধিক ফাংশন রাখার জন্য লাইনটি পরিবর্তন করা । উদাহরণস্বরূপ func = random.choice([merge, split, revolt, conquest, merge, merge]), দেশগুলি আরও বেশি বার মার্জ করে নিয়ে যায়।

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