কোনও নতুন ডিএজে কোনও ডিএজি চুক্তি করার সর্বনিম্ন আকার


15

আমাদের একটি ডিএজি আছে। আমাদের নোড একটি ফাংশন রয়েছে এফ:ভীএন(আলগাভাবে বলতে গেলে, আমরা নোডগুলি সংখ্যা করি)। আমরা এই নিয়মগুলি সহ একটি নতুন নির্দেশিত গ্রাফ তৈরি করতে চাই:

  1. এফ(এক্স)এফ(Y)এক্স'Y'এক্স'Y'এফ(এক্স)এফ(Y)
  2. আমরা নতুন নোডগুলির মধ্যে সমস্ত পুরানো প্রান্ত যুক্ত করব: ।(এক্স,Y)এক্স'Y'(এক্স',Y')'
  3. এই নতুন গ্রাফটি এখনও একটি ডিএজি।

নূন্যতম কি? নূন্যতম নতুন গ্রাফ তৈরি করে একটি অ্যালগরিদম কী?|ভী'|


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

1
আপনি যদি দুটি সংযুক্ত নোড চুক্তি করেন তবে আপনি কি একটি নিষিদ্ধ স্ব-লুপ পাবেন?
যুবাল ফিল্মাস

1
নাঃ। 2 পড়ুন: আবার যদি সংকোচনের পরে দুটি নোড আলাদা হয় তবে আমরা কেবল প্রান্তটি যুক্ত করি। দুটি নোড যদি একটিতে চুক্তিবদ্ধ হয় তবে আমরা প্রান্তটি যুক্ত করব না।
chx

1
@chx আপনি কি "ন্যূনতম" বা "সর্বনিম্ন" চাইছেন?
রিয়েলজ স্লাও

1
আপনি কিছু অনুপ্রেরণা / বিকেজি দিতে পারেন?
vzn

উত্তর:


5

এই সমস্যাটি সমাধান করার জন্য একটি পদ্ধতিকে হবে পূর্ণসংখ্যার লিনিয়ার প্রোগ্রামিং (আইএলপি) ব্যবহার করা। আসুন সমস্যা সিদ্ধান্ত সংস্করণ সাজসরঁজাম: প্রদত্ত , সেখানে চুক্তি একই রঙ ছেদচিহ্ন একটি উপায় আকারের একটি DAG পেতে হয় ?

এটি স্ট্যান্ডার্ড কৌশলগুলি ব্যবহার করে আইএলপি উদাহরণ হিসাবে প্রকাশ করা যেতে পারে। আমাদের আসল গ্রাফের প্রতিটি ভার্টেক্সের রঙ দেওয়া হয়েছে। আমি আপনাকে পরামর্শ দিচ্ছি যে আমরা একটি লেবেল সঙ্গে প্রতিটি প্রান্তবিন্দু লেবেল ; একই লেবেলযুক্ত এবং একই রঙযুক্ত সমস্ত উল্লম্ব চুক্তিবদ্ধ হবে। সুতরাং, সিদ্ধান্তের সমস্যাটি হয়ে ওঠে: একটি লেবেল উপস্থিত রয়েছে কি, যেমন সমস্ত একই রঙের একই-লেবেল শীর্ষকে চুক্তিবদ্ধ করার মাধ্যমে একটি ডিএজি পাওয়া যায়?{1,2,...,}

একটি পূর্ণসংখ্যা রৈখিক প্রোগ্রাম হিসাবে এই প্রকাশ, একটি পূর্ণসংখ্যা পরিবর্তনশীল পরিচয় করিয়ে প্রতিটি প্রান্তবিন্দু জন্য বনাম , প্রান্তবিন্দু উপর ট্যাগ প্রতিনিধিত্ব করতে বনাম । বৈষম্য যোগ করুন 1 বনামবনামবনামবনাম1বনাম

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

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

অবশ্যই, এটি বহুবারের মধ্যে সম্পূর্ণরূপে গ্যারান্টিযুক্ত নয়। কোন গ্যারান্টি আছে। যাইহোক, আইএলপি সলভারগুলি বেশ ভাল পেয়েছে। আমি প্রত্যাশা করব যে, একটি যুক্তিসঙ্গত আকারের গ্রাফের জন্য, আপনি একটি শালীন সুযোগ পেয়েছেন যে কোনও আইএলপি সল্ভর উপযুক্ত সময়ে এই সমস্যাটি সমাধান করতে সক্ষম হতে পারে।

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

(আমি আশা করি এটি ঠিক আছে I


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


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

@ chx, আমি সীমাবদ্ধতার সম্ভাব্যতা পরীক্ষা করতে ILP ব্যবহার করছি। এটি আইএলপি সলভারকে আপনার পছন্দ মতো কোনও উদ্দেশ্য ফাংশন সর্বাধিক করতে (যেমন, সর্বোচ্চ 0) এবং তারপরে বস্তুনিষ্ঠ ফাংশনের মান উপেক্ষা করে এবং কেবলমাত্র আইএলপি সম্ভব হয় কিনা তা দেখার জন্য এটি করা যেতে পারে। উভয় ক্ষেত্রেই ILP সমাধানকারী সাড়া "infeasible" (যা কোন সংকুচিত হচ্ছে আকারের DAG মানে অথবা এটি সাড়া "সম্ভবপর" এবং উদ্দেশ্য ফাংশন এটা খুঁজে পাইনি শ্রেষ্ঠ মান প্রদান করে); সেক্ষেত্রে আপনি উদ্দেশ্যমূলক কার্যের মানটিকে উপেক্ষা করুন (এবং আপনি জানেন যে আকারের একটি ডিএজি উপস্থিত রয়েছে ) কে ))
DW


আপনার রৈখিক সময় সমাধান সম্পর্কিত; আমি আপনার আইএলপি গঠনের হজম করিনি, সুতরাং আমি এটি বিচার করতে পারি না, তবে আমি নিশ্চিত যে সমস্যাটি এনপি-হার্ড প্রমাণ করতে পারব, যা লিনিয়ার সময় সমাধানকে বেশ সহজ করে তুলবে: পি। আমি তাড়াতাড়ি পোস্ট করব।
রিয়েলজ স্লাও

@ রিলেজস্লাও, আপনাকে ধন্যবাদ! সেক্ষেত্রে আমি দৃ strongly়ভাবে সন্দেহ করি যে আমি কোথাও ভুল করে ফেলেছি (যদিও আমি এখনও নিশ্চিত নই)।
DW

5

দ্রষ্টব্য: আফ্রিক, ডিডাব্লু এই হ্রাসের একটি গর্ত পেয়েছে এবং এটি ভুল (মন্তব্য দেখুন)। Historicalতিহাসিক কারণে এটি এখানে রাখা।

ভূমিকা : প্রথমে আমি আমাদের সমস্যার মনোোটোন 3 এসএটি সমস্যা হ্রাস করব । যদিও মনোোটোন 3 এসএটি সমস্যাটি তুচ্ছভাবে সন্তুষ্টিজনক তবে আমাদের সমস্যাটি ন্যূনতম সত্যিকারের মনোটোন 3 এস্যাট সমস্যাটি আরও সমাধান করতে পারে যা এনপি-হার্ড; এইভাবে এই সমস্যাটি এনপি-হার্ড।

মনোোটোন 3 এসএটি থেকে আমাদের সমস্যার হ্রাস

আমাদের একটি মনোোটোন বুলিয়ান সূত্র ভেরিয়েবলের ক্রম এবং ধারাগুলির ক্রম হিসাবে প্রকাশ করা আছে। সিএনএফ ফর্মের এমন যে:Φ=(V,C)

এবং

(আমিসি) আমি=(এক্সএক্সএক্স)||(এক্স,এক্স,এক্সভী)

আমি=1এনআমি|আমিসি,এন=|সি|

পরিবর্তন

আমরা একটি লেখচিত্র, গঠন । প্রতিটি প্রান্তবিন্দু জি ' একটি লেবেল আছে; একই লেবেলের সাথে উল্লম্ব সংকোচনের জন্য যোগ্য।জি'=ভী','জি'

প্রথমে আমরা গ্রাফটি নিম্নরূপে তৈরি করি: প্রতিটি , আমরা দুটি নোড তৈরি করি, প্রতিটি লেবেলযুক্ত x i , এবং একটি থেকে অন্যের দিকে একটি নির্দেশিত প্রান্ত (উচ্চ রেজোলিউশনের জন্য চিত্রগুলিতে ক্লিক করুন)।এক্সআমিভীএক্সআমি

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

এই নোডগুলি অবশ্যই চুক্তিবদ্ধ হতে পারে কারণ তাদের লেবেল একই। আমরা ভেরিয়েবল / নোডগুলি বিবেচনা করব যা চুক্তিবদ্ধ হয়েছে ভুয়া হিসাবে মূল্যবান বলে বিবেচিত হবে এবং যেগুলি চুক্তিবদ্ধ নয় তাদের সত্য হিসাবে মূল্যবান বলে গণ্য হবে :

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

ভী'2|ভী|আমিসি, আমি=(এক্সএক্সএক্স)|এক্স,এক্স,এক্সভীআমি

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

আমি1আমি

2|ভী|+ +|সি|

এক্সআমিএক্স এক্সআমিআমি

এখানে শৃঙ্খলাবদ্ধতা সীমাবদ্ধ না করে এখানে আরও একটি দৃশ্যায়ন রয়েছে:

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

সুতরাং, প্রতিটি অনুচ্ছেদের সীমাবদ্ধতার জন্য এটির অন্তত একটি ভেরিয়েবলের অনিয়ন্ত্রিত থাকা দরকার; যেহেতু অনিয়ন্ত্রিত নোডগুলি সত্য হিসাবে মূল্যবান হয় তাই এর প্রয়োজন একটি ভেরিয়েবলের সত্য হতে পারে; মনোোটোন স্যাট এর ক্লজগুলির জন্য ঠিক কী প্রয়োজন।

নূন্যতম সত্য মনোটোন 3 এসএটি থেকে হ্রাস

মনোোটোন 3 এস্যাট তুচ্ছভাবে সন্তুষ্টিজনক; আপনি কেবল সমস্ত ভেরিয়েবলগুলি সত্যতে সেট করতে পারেন।

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


তথ্যসূত্র:

গ্রাফ উত্স:


1
কি দারুন. তাহলে ডিডব্লিউর সমাধান অবশ্যই ভুল হতে পারে (বা আমরা প্রমাণিত এনপি = পি যা আমি কিছুটা হলেও সন্দেহ করি: পি) - তবে কোথায়?
chx

(এক্স1এক্স2এক্স6)(এক্স1এক্স4এক্স5)(এক্স3এক্স4এক্স6)এক্স1=এক্স4=এক্স6=মিথ্যা এক্স2=এক্স3=এক্স5=সত্য1এক্স1এক্স4এক্স61

@ ডিডব্লু আপনার সাথে আবার কথা বলতেও চমৎকার: ডি, এবং শুভকামনা, আমরা যদি উভয়ই ঠিক থাকি তবে আপনার উত্তরটিতে আমরা পি = এনপি পেতে পারি! / জে কে
রিয়েলজ স্লাও

(এক্স1,এক্স3)

@ রিলেজস্লাও, আমি ভয় করি যে আমি এখনও অনুসরণ করি না ... আমার সূত্রটি কেন রূপান্তরিত হতে হবে তার কোনও কারণ আমি দেখছি না। আমি বিশ্বাস করি এটি আগে থেকেই হয় নূন্যতম সত্য Monotone 3SAT একটি দৃষ্টান্ত। তবে আমি এটি একটি স্তর নিতে। আরও বিস্তৃতভাবে, আমি প্রস্তাবিত হ্রাস দেখতে পাচ্ছি, তবে হ্রাসটি সঠিক বলে কোনও যুক্তি দেখছি না - এটি অনুপস্থিত। হ্রাসটি সঠিক হওয়ার জন্য, এটি হ্যাঁ, হ্যাঁ, হ্যাঁ, হ্যাঁ, হ্যাঁ, উদাহরণস্বরূপ, হ্যাঁ, হ্যাঁ, হ্যাঁ, হ্যাঁ আমি সন্দেহ করি যে আপনি যদি আপনার হ্রাসের জন্য যথার্থতার প্রমাণ লেখার চেষ্টা করেন তবে আপনি যে সূত্রটি দিয়েছিলেন তা বিবেচনা করলে আপনি কোনও সমস্যার মুখোমুখি হবেন।
ডিডাব্লু

1

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

পাইথন-ইশ (পরীক্ষিত নয়):

def play((V,E),F,sequence=[]):
  """
  (V,E) -- a dag.
  V     -- a set of vertices.
  E     -- a set of directed-edge-tuples.
  F     -- a function that takes a vertex, returns an integer.
  sequence -- the sequence of moved taken so far; starts with/defaults to
              an empty list, will contain tuples of the form (x,y)
              where x is removed and replaced with y.

  Returns the best recursively found solution.
  """

  #find all the integer values in the graph, remember which
  # values correspond to what vertices. Of the form {integer => {vertices}}.
  n2v = {}
  for x in V:
    n = F(x)

    #for each integer, make sure you have a set to put the vertices in.
    if n not in n2v:
      n2v[n] = set()

    #for each integer, add the vertex to the equivalent set.
    n2v[n].add(v)

  #record the best sequence/solution. You start with the current sequence,
  # and see if you can obtain anything better.
  best_solution = list(sequence)

  #Now you will try to combine a single pair of vertices, obtain a new
  # graph and then recursively play the game again from that graph. 

  #for each integer and equivalent set of vertices,
  for n,vset in n2v.iteritems():

    #pick a pair of vertices
    for x in vset:
      for y in vset:

        #no point if they are the same.
        if x == y:
          continue

        #If there is a path from x => y or y => x, then you will be
        # introducing a cycle, breaking a rule. So in that case, disregard
        # this pair.
        #However, the exception is when one is a direct child of the other;
        # in that case you can safely combine the vertices.
        if pathtest((V,E),x,y) and (x,y) not in E and (x,y) not in E:
          continue

        #combine the vertices (function is defined below), discard x,
        # replace it with y, obtain the new graph, (V',E').
        Vp,Ep = combine_vertex((V,E),x,y))

        #record the sequence for this move.
        sequencep = list(sequence) + [(x,y)]

        #recurse and play the game from this new graph.
        solution = play(Vp,Ep,F,sequencep)

        #if the returned solution is better than the current best,
        if len(solution) > len(best_solution):
          #record the new best solution
          best_solution = solution
  #return the best recorded solution
  return best_solution


def combine_vertex((V0,E0),x,y):
  """
  (V0,E0)   -- an initial digraph.
  V0        -- a set of vertices.
  E0        -- a set of directed-edge-tuples.
  x         -- vertex to discard.
  y         -- vertex to replace it with.

  returns a new digraph replacing all relationships to and from x to relate
   to y instead, and removing x from the graph entirely.
  """

  #the final vertex set will have everything except x
  V = set(V0)
  V.discard(x)

  #now you construct the edge set.
  E = set()

  #for every edge,
  for (u0,v0) in E0:
    #recreate the edge in the new graph, but replace any occurence
    # of x.  
    u,v = u0,v0
    #if x is in the edge: replace it
    if u == x:
      u = y
    if v == x:
      v == y

    #sometimes u=v=y and can now be pointing to itself, don't add that
    # edge
    if u == v:
      continue

    #add the new/replaced edge into the edge-set.
    E.add( (u,v) )
  return (V,E)

আমি সত্যিই এটি খুব কঠিন সমস্যা কিনা তা নিশ্চিত নই, তবে কয়েকটি গ্রাফ নিজে হাতে খেলে মনে হচ্ছে এটি খুব সংযুক্তিযুক্ত। এই সমস্যাটির জন্য যদি কিছু কঠিন হ্রাস করা যায়, বা আরও ভাল সময় সহ অ্যালগরিদম থাকে তবে আমি আগ্রহী।


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