स्टैक में किसी वस्तु को किसी स्थिति में ले जाने के लिए न्यूनतम संख्या में चाल कैसे ज्ञात करें?


12

ढेर

N के साथ NXP स्टैक के एक सेट को देखते हुए स्टैक की संख्या, और P स्टैक की क्षमता होने के कारण, मैं स्थान A में कुछ नोड से कुछ मनमाने स्थान B पर जाने के लिए आवश्यक स्वैप की न्यूनतम संख्या की गणना कैसे कर सकता हूं? मैं एक गेम डिजाइन कर रहा हूं, और अंतिम लक्ष्य सभी ढेर को क्रमबद्ध करना है ताकि वे सभी एक ही रंग के हों।

# Let "-" represent blank spaces, and assume the stacks are
stacks = [
           ['R', 'R', 'R', 'R'], 
           ['Y', 'Y', 'Y', 'Y'], 
           ['G', 'G', 'G', 'G'], 
           ['-', '-', '-', 'B'], 
           ['-', 'B', 'B', 'B']
         ]

अगर मैं stacks[1][1]इस तरह से "बी" सम्मिलित करना चाहता हूं stacks[1] = ["-", "B", "Y", "Y"]। मैं ऐसा करने के लिए आवश्यक न्यूनतम कदम कैसे निर्धारित कर सकता हूं?

मैं कई दृष्टिकोणों को देख रहा हूं, मैंने आनुवंशिक एल्गोरिदम की कोशिश की है जो एक राज्य से सभी संभव चालें उत्पन्न करता है, उन्हें स्कोर करता है, और फिर सबसे अच्छा स्कोरिंग पथ नीचे जारी रखता है, मैंने समस्या पर पाथफाइंडिंग के लिए Djikstra के एल्गोरिथ्म को चलाने का भी प्रयास किया है । यह निराशाजनक रूप से सरल लगता है, फिर भी मैं इसे घातीय समय के अलावा किसी और चीज में चलाने का तरीका नहीं समझ सकता। क्या एक एल्गोरिथ्म मैं याद कर रहा हूँ जो यहाँ लागू है?

संपादित करें

मैंने यह फ़ंक्शन आवश्यक संख्याओं की न्यूनतम संख्या की गणना करने के लिए लिखा है: स्टैक: स्टैक में टुकड़ों का प्रतिनिधित्व करने वाले वर्णों की सूची, स्टैक [0] [0] स्टैक के शीर्ष [0] स्टैक_इंड: सूचकांक स्टैक कि टुकड़ा को__पीस में जोड़ा जाएगा: वह टुकड़ा जिसे स्टैक की जरूरत के लिए जोड़ा जाना चाहिए_इंडेक्स: वह इंडेक्स जहां टुकड़ा स्थित होना चाहिए

def calculate_min_moves(stacks, stack_ind, needs_piece, needs_index):
    # Minimum moves needed to empty the stack that will receive the piece so that it can hold the piece
    num_removals = 0
    for s in stacks[stack_ind][:needs_index+1]:
        if item != "-":
            num_removals += 1

    min_to_unlock = 1000
    unlock_from = -1
    for i, stack in enumerate(stacks):
        if i != stack_ind:
            for k, piece in enumerate(stack):
                if piece == needs_piece:
                    if k < min_to_unlock:
                        min_to_unlock = k
                        unlock_from = i

    num_free_spaces = 0
    free_space_map = {}

    for i, stack in enumerate(stacks):
        if i != stack_ind and i != unlock_from:
            c = stack.count("-")
            num_free_spaces += c
            free_space_map[i] = c

    if num_removals + min_to_unlock <= num_free_spaces:
        print("No shuffling needed, there's enough free space to move all the extra nodes out of the way")
    else:
        # HERE
        print("case 2, things need shuffled")

संपादित करें: स्टैक पर परीक्षण के मामले:

stacks = [
           ['R', 'R', 'R', 'R'], 
           ['Y', 'Y', 'Y', 'Y'], 
           ['G', 'G', 'G', 'G'], 
           ['-', '-', '-', 'B'], 
           ['-', 'B', 'B', 'B']
         ]

Case 1: stacks[4][1] should be 'G'
Move 'B' from stacks[4][1] to stacks[3][2]
Move 'G' from stacks[2][0] to stacks[4][1]
num_removals = 0 # 'G' is directly accessible as the top of stack 2
min_to_unlock = 1 # stack 4 has 1 piece that needs removed
free_spaces = 3 # stack 3 has free spaces and no pieces need moved to or from it
moves = [[4, 3], [2, 4]]
min_moves = 2
# This is easy to calculate
Case 2: stacks[0][3] should be 'B'
Move 'B' from stacks[3][3] to stack[4][0]
Move 'R' from stacks[0][0] to stacks[3][3]
Move 'R' from stacks[0][1] to stacks[3][2]
Move 'R' from stacks[0][2] to stacks[3][1]
Move 'R' from stacks[0][3] to stacks[3][0]
Move 'B' from stacks[4][0] to stacks[0][3]
num_removals = 0 # 'B' is directly accessible 
min_to_unlock = 4 # stack 0 has 4 pieces that need removed
free_spaces = 3 # If stack 3 and 4 were switched this would be 1
moves = [[3, 4], [0, 3], [0, 3], [0, 3], [0, 3], [4, 0]]
min_moves = 6
#This is hard to calculate

वास्तविक कोड कार्यान्वयन वह हिस्सा नहीं है जो मुश्किल है, यह एक एल्गोरिदम को लागू करने का तरीका निर्धारित कर रहा है जो उस समस्या को हल करता है जिसके साथ मैं संघर्ष कर रहा हूं।

प्रति @ YonIif के अनुरोध के रूप में मैं एक बना लिया है सार समस्या के लिए।

जब यह चलता है, यह ढेर का एक यादृच्छिक सरणी उत्पन्न करता है, और एक यादृच्छिक टुकड़ा चुनता है जिसे यादृच्छिक स्थान पर यादृच्छिक स्टैक में डालने की आवश्यकता होती है।

इसे चलाने से कंसोल में इस प्रारूप का कुछ हिस्सा प्रिंट होता है।

All Stacks: [['-', '-', 'O', 'Y'], ['-', 'P', 'P', 'O'], ['-', 'P', 'O', 'Y'], ['Y', 'Y', 'O', 'P']]
Stack 0 is currently ['-', '-', 'O', 'Y']
Stack 0 should be ['-', '-', '-', 'P']

स्थिति अपडेट

मैं किसी भी तरह इस समस्या को हल करने के लिए बहुत दृढ़ हूं ।

ध्यान रखें कि इस तरह के मामलों को कम करने के तरीके हैं, जैसे कि @Hans Olsson ने टिप्पणियों में उल्लेख किया है। इस समस्या के लिए मेरा सबसे हालिया दृष्टिकोण, उल्लिखित नियमों के समान नियमों का एक समूह विकसित करना है, और उन्हें एक सामान्य एल्गोरिथ्म में नियोजित करना है।

नियम जैसे:

एक चाल कभी उल्टा मत करो। 1-> 0 से जाओ तो 0-> 1 (कोई मतलब नहीं है)

कभी भी एक पंक्ति में दो बार टुकड़ा न चलाएं। कभी 0 -> 1 से तो कभी 1 -> 3 से हटो

स्टैक्स [X] से स्टैक [Y] की कुछ चाल को देखते हुए, फिर कुछ संख्या में कदम, फिर स्टैक से एक कदम [Y] स्टैक से [Z], यदि स्टैक्स [Z] उसी अवस्था में है जैसा कि कदम था स्टैक [X] से स्टैक [Y] हुआ, स्टैक से हटकर एक चाल को समाप्त किया जा सकता था [X] सीधे स्टैक्स से [Z]

वर्तमान में, मैं पर्याप्त नियम बनाने के प्रयास के साथ इस समस्या से संपर्क कर रहा हूं, कि यह "वैध" चालों की संख्या को कम करता है, पर्याप्त है ताकि एक जेनेरिक एल्गोरिथम का उपयोग करके उत्तर की गणना की जा सके। यदि कोई अतिरिक्त नियमों के बारे में सोच सकता है, तो मैं उन्हें टिप्पणियों में सुनने में दिलचस्पी लूंगा।

अपडेट करें

@RootTwo के जवाब की बदौलत मुझे थोड़ी सफलता मिली है, जिसे मैं यहां बताऊंगा।

सफलता पर

लक्ष्य की ऊंचाई को परिभाषित करें क्योंकि लक्ष्य टुकड़ा को गहराई से गंतव्य स्टैक में रखा जाना चाहिए।

जब भी कुछ गोल टुकड़ा इंडेक्स <= stack_height - गोल ऊंचाई पर रखा जाता है, तो हमेशा clear_path () पद्धति के माध्यम से जीत का सबसे छोटा रास्ता होगा।

Let S represent some solid Piece.

अर्थात

Stacks = [ [R, R, G], [G, G, R], [-, -, -] ]
Goal = Stacks[0][2] = R
Goal Height = 2.
Stack Height - Goal Height = 0

कुछ ऐसे स्टैक को देखते हुए stack[0] = R, खेल को जीत लिया जाता है।

                       GOAL
[ [ (S | -), (S | -), (S | -) ], [R, S, S], [(S | - ), (S | -), (S | -)] ]

चूंकि यह ज्ञात है कि उनके पास हमेशा कम से कम स्टैक_हाइट रिक्त स्थान उपलब्ध होते हैं, इसलिए सबसे खराब संभव मामला होगा:

 [ [ S, S, !Goal ], [R, S, S], [-, -, -]

चूँकि हम जानते हैं कि लक्ष्य का टुकड़ा लक्ष्य गंतव्य में नहीं हो सकता है या खेल जीत गया है। जिस स्थिति में आवश्यक कदमों की न्यूनतम संख्या होगी, वे हैं:

(0, 2), (0, 2), (0, 2), (1, 0)

Stacks = [ [R, G, G], [-, R, R], [-, -, G] ]
Goal = Stack[0][1] = R
Stack Height - Goal Height = 1

कुछ ऐसे स्टैक को देखते हुए stack[1] = R, खेल को जीत लिया जाता है।

              GOAL
[ [ (S | -), (S | -), S], [ (S | -), R, S], [(S | -), (S | -), (S | -)]

हम जानते हैं कि कम से कम 3 रिक्त स्थान उपलब्ध हैं, इसलिए सबसे खराब स्थिति यह होगी:

[ [ S, !Goal, S], [S, R, S], [ -, -, - ]

इस मामले में चाल की न्यूनतम संख्या चाल होगी:

(1, 2), (0, 2), (0, 2), (1, 0)

यह सभी मामलों के लिए होगा।

इस प्रकार, लक्ष्य की ऊंचाई पर या उसके ऊपर गोल टुकड़े को रखने के लिए आवश्यक न्यूनतम चालों को खोजने की समस्या को कम किया गया है।

यह समस्या को उप-समस्याओं की एक श्रृंखला में विभाजित करता है:

  1. जब गंतव्य स्टैक का अपना सुलभ टुकड़ा होता है! = लक्ष्य टुकड़ा, यह निर्धारित करते हुए कि उस टुकड़े के लिए एक वैध स्थान है, या यदि टुकड़ा वहाँ रहना चाहिए, जबकि दूसरा टुकड़ा स्वैप किया गया हो।

  2. जब गंतव्य स्टैक में अपना सुलभ टुकड़ा == गोल टुकड़ा होता है, तो यह निर्धारित करते हुए कि क्या इसे हटाया जा सकता है और आवश्यक लक्ष्य ऊंचाई पर रखा जा सकता है, या यदि टुकड़ा दूसरे के स्वैप रहने के दौरान रहना चाहिए।

  3. जब उपरोक्त दो मामलों में एक और टुकड़े की अदला-बदली की आवश्यकता होती है, तो यह निर्धारित करने के लिए कि किस टुकड़े को स्वैप करना है ताकि गोल टुकड़ा के लिए लक्ष्य ऊंचाई तक पहुंचने के लिए संभव हो सके।

गंतव्य स्टैक को हमेशा अपने मामलों का पहले मूल्यांकन करना चाहिए।

अर्थात

stacks = [ [-, R, G], [-, R, G], [-, R, G] ]

Goal = stacks[0][1] = G

लक्ष्य स्टैक की जाँच पहले होती है:

(0, 1), (0, 2), (1, 0), (2, 0) = 4 Moves

लक्ष्य की अनदेखी:

(1, 0), (1, 2), (0, 1), (0, 1), (2, 0) = 5 Moves

2
क्या आपने A * की कोशिश की है ? यह काफी हद तक दिक्जस्ट्रा के एल्गोरिथ्म के समान है लेकिन कभी-कभी यह काफी तेज होता है।
योनलिफ़

1
क्या आप कृपया गिथुब रेपो लिंक साझा कर सकते हैं? अगर यह ठीक है तो मैं खुद प्रयोग करना चाहूंगा। @ ट्रिस्टन
योनलिफ

1
पहली नज़र में, यह समस्या एनपी-हार्ड लगती है। यह शायद एनपी (एनपी-पूर्ण नहीं) के भीतर नहीं है, क्योंकि यहां तक ​​कि अगर मैं आपको एक इष्टतम समाधान देता हूं, तो आप इसे आसानी से सत्यापित भी नहीं कर सकते। यह क्रमपरिवर्तन पर अनुकूलन समस्याओं के लिए कुख्यात है। मैं सीएस पर समस्या को पार करने का सुझाव दूंगा । इस समस्या के लिए अनुमानित एल्गोरिदम में देखें। यह एक बहुत कठिन समस्या है, लेकिन एक सभ्य सन्निकटन मौजूद होना चाहिए। यह समान है: हनोई के मनमाने टावर्स
डारियोहेट

1
@DarioHett वह था जिसकी मुझे चिंता थी! मैंने अपनी उंगलियां पार कर ली थीं कि यह एनपी-हार्ड समस्या नहीं होगी, लेकिन मुझे यह भी महसूस हो रहा था कि यह एक हो सकता है। मैं एक आनुवंशिक एल्गोरिथ्म के साथ बेहतर भाग्य रहा है, और कुछ विशेष स्कोरिंग फ़ंक्शन भी हैं जो चालों को स्कोर करते हैं। मैं हनोई के मनमाने टावर्स पर एक नज़र डालूंगा! सलाह के लिये धन्यवाद।
ट्रिस्टन

1
यदि आप पहेली को बेतरतीब ढंग से उत्पन्न करने की कोशिश करते हैं - तो स्पष्ट रूप से निरर्थक चालें हटाने के लिए याद रखें (आगे बढ़ने के बाद कुछ वापस ले जाना या दो चरणों में एक चाल करना जब एक पर्याप्त होगा; और संभवतः असंबंधित चालों के साथ संयोजन में भी)।
हंस ओलसन

जवाबों:


1

मैं दो विकल्पों के साथ आया था, लेकिन उनमें से कोई भी समय पर केस 2 को हल करने में सक्षम नहीं है। पहला विकल्प A * का उपयोग स्ट्रिंग के नाप के साथ आपके h (n) के रूप में कर रहा है, दूसरा विकल्प IDA * है। मैंने कई स्ट्रिंग समानता उपायों का परीक्षण किया, मैंने अपने दृष्टिकोण पर स्मिथ-वॉटरमैन का उपयोग किया। मैंने आपकी समस्या को तेजी से ठीक करने के लिए आपकी धारणा को बदल दिया है। मैंने यह जांचने के लिए प्रत्येक अंक के अंत में नंबर जोड़े हैं कि क्या एक टुकड़ा दो बार ले जाया गया था।

यहां ऐसे मामले हैं जिन पर मैंने परीक्षण किया है:

start = [
 ['R1', 'R2', 'R3', 'R4'], 
 ['Y1', 'Y2', 'Y3', 'Y4'], 
 ['G1', 'G2', 'G3', 'G4'], 
 ['B1'], 
 ['B2', 'B3', 'B4']
]

case_easy = [
 ['R', 'R', 'R', 'R'], 
 ['Y', 'Y', 'Y', 'Y'], 
 ['G', 'G', 'G'], 
 ['B', 'B'], 
 ['B', 'B', 'G']
]


case_medium = [
 ['R', 'R', 'R', 'R'], 
 ['Y', 'Y', 'Y', 'B'], 
 ['G', 'G', 'G'], 
 ['B'],
 ['B', 'B', 'G', 'Y']
]

case_medium2 = [
 ['R', 'R', 'R' ], 
 ['Y', 'Y', 'Y', 'B'], 
 ['G', 'G' ], 
 ['B', 'R', 'G'],
 ['B', 'B', 'G', 'Y']
]

case_hard = [
 ['B'], 
 ['Y', 'Y', 'Y', 'Y'], 
 ['G', 'G', 'G', 'G'], 
 ['R','R','R', 'R'], 
 ['B','B', 'B']
]

यहाँ ए * कोड है:

from copy import deepcopy
from heapq import *
import time, sys
import textdistance
import os

def a_star(b, goal, h):
    print("A*")
    start_time = time.time()
    heap = [(-1, b)]
    bib = {}
    bib[b.stringify()] = b

    while len(heap) > 0:
        node = heappop(heap)[1]
        if node == goal:
            print("Number of explored states: {}".format(len(bib)))
            elapsed_time = time.time() - start_time
            print("Execution time {}".format(elapsed_time))
            return rebuild_path(node)

        valid_moves = node.get_valid_moves()
        children = node.get_children(valid_moves)
        for m in children:
          key = m.stringify()
          if key not in bib.keys():
            h_n = h(key, goal.stringify())
            heappush(heap, (m.g + h_n, m)) 
            bib[key] = m

    elapsed_time = time.time() - start_time
    print("Execution time {}".format(elapsed_time))
    print('No Solution')

यहाँ आईडीए * कोड है:

#shows the moves done to solve the puzzle
def rebuild_path(state):
    path = []
    while state.parent != None:
        path.insert(0, state)
        state = state.parent
    path.insert(0, state)
    print("Number of steps to solve: {}".format(len(path) - 1))
    print('Solution')

def ida_star(root, goal, h):
    print("IDA*")
    start_time = time.time()
    bound = h(root.stringify(), goal.stringify())
    path = [root]
    solved = False
    while not solved:
        t = search(path, 0, bound, goal, h)
        if type(t) == Board:
            solved = True
            elapsed_time = time.time() - start_time
            print("Execution time {}".format(elapsed_time))
            rebuild_path(t)
            return t
        bound = t

def search(path, g, bound, goal, h):

    node = path[-1]
    time.sleep(0.005)
    f = g + h(node.stringify(), goal.stringify())

    if f > bound: return f
    if node == goal:
        return node

    min_cost = float('inf')
    heap = []
    valid_moves = node.get_valid_moves()
    children = node.get_children(valid_moves)
    for m in children:
      if m not in path:
        heappush(heap, (m.g + h(m.stringify(), goal.stringify()), m)) 

    while len(heap) > 0:
        path.append(heappop(heap)[1])
        t = search(path, g + 1, bound, goal, h)
        if type(t) == Board: return t
        elif t < min_cost: min_cost = t
        path.pop()
    return min_cost

class Board:
  def __init__(self, board, parent=None, g=0, last_moved_piece=''):
    self.board = board
    self.capacity = len(board[0])
    self.g = g
    self.parent = parent
    self.piece = last_moved_piece

  def __lt__(self, b):
    return self.g < b.g

  def __call__(self):
    return self.stringify()

  def __eq__(self, b):
    if self is None or b is None: return False
    return self.stringify() == b.stringify()

  def __repr__(self):
    return '\n'.join([' '.join([j[0] for j in i]) for i in self.board])+'\n\n'

  def stringify(self):
    b=''
    for i in self.board:
      a = ''.join([j[0] for j in i])
      b += a + '-' * (self.capacity-len(a))

    return b

  def get_valid_moves(self):
    pos = []
    for i in range(len(self.board)):
      if len(self.board[i]) < self.capacity:
        pos.append(i)
    return pos

  def get_children(self, moves):
    children = []
    for i in range(len(self.board)):
      for j in moves:
        if i != j and self.board[i][-1] != self.piece:
          a = deepcopy(self.board)
          piece = a[i].pop()
          a[j].append(piece)
          children.append(Board(a, self, self.g+1, piece))
    return children

उपयोग:

initial = Board(start)
final1 = Board(case_easy)
final2 = Board(case_medium)
final2a = Board(case_medium2)
final3 = Board(case_hard)

x = textdistance.gotoh.distance

a_star(initial, final1, x)
a_star(initial, final2, x)
a_star(initial, final2a, x)

ida_star(initial, final1, x)
ida_star(initial, final2, x)
ida_star(initial, final2a, x)

0

टिप्पणियों में आपने कहा कि क्षमता P के साथ N ढेर हैं, और हमेशा P खाली स्थान हैं। यदि ऐसा है, तो ऐसा लगता है कि यह एल्गोरिथ्म elseआपके कोड (यानी जब num_removals + min_to_unlock > num_free_spaces) में खंड में काम करेगा :

  1. वांछित टुकड़ा खोजें जो एक ढेर के शीर्ष के सबसे करीब है।
  2. वांछित टुकड़े के ऊपर से सभी टुकड़ों को इस तरह से हिलाएं कि एक ढेर हो (गंतव्य ढेर नहीं) जिसके ऊपर एक खाली जगह है। यदि आवश्यक हो, तो गंतव्य स्टैक या किसी अन्य स्टैक से टुकड़े ले जाएं। यदि एकमात्र खुली जगह गंतव्य स्टैक के शीर्ष पर है, तो किसी अन्य स्टैक के शीर्ष को खोलने के लिए एक टुकड़े को वहां स्थानांतरित करें। यह हमेशा संभव है, क्योंकि वांछित स्थान से ऊपर जाने के लिए पी खुली जगह और अधिकांश पी -1 टुकड़े हैं।
  3. एक स्टैक के शीर्ष पर खाली जगह पर वांछित टुकड़ा ले जाएं।
  4. गंतव्य स्टैक से टुकड़ों को हटाएं जब तक कि गंतव्य खुला न हो।
  5. वांछित टुकड़े को गंतव्य पर ले जाएं।

मैंने पिछले दो घंटे इस जवाब में खोदने में बिताए हैं, और मुझे लगता है कि वहाँ कुछ हो सकता है। यदि संभव हो, तो क्या आप थोड़ी और जानकारी प्रदान कर सकते हैं कि आप वांछित टुकड़े से ऊपर जाने वाले टुकड़ों के बारे में कैसे जाना चाहते हैं? आप कैसे निर्धारित करते हैं कि उन्हें किस चरण में ले जाना है? शायद psuedocode / कोड का एक सा। यह निश्चित रूप से निकटतम है जो मैंने अब तक इसे हल करने के लिए महसूस किया है।
ट्रिस्टन

0

हालाँकि मुझे इस गणितीय रूप से साबित करने का समय नहीं मिला है, फिर भी मैंने इसे पोस्ट करने का फैसला किया; आशा है ये मदद करेगा। दृष्टिकोण एक पैरामीटर पी को परिभाषित करने के लिए है जो अच्छी चाल के साथ घटता है और खेल समाप्त होने पर शून्य तक पहुंचता है। कार्यक्रम में केवल अच्छी चाल या तटस्थ चाल (जो कि पी अपरिवर्तित छोड़ते हैं) पर विचार करता है और खराब चाल (पी वृद्धि) के बारे में भूल जाता है।

तो पी क्या है? प्रत्येक स्तंभ के लिए p को उन ब्लॉकों की संख्या के रूप में परिभाषित करें जिन्हें अभी भी हटाया जाना है, क्योंकि उस कॉलम के सभी रंग वांछित रंग हैं। तो मान लीजिये कि हम चाहते हैं कि लाल ब्लॉक बाईं ओर के कॉलम में समाप्त हो जाए (मैं बाद में वापस आऊंगा), और मान लीजिए कि नीचे एक लाल ब्लॉक है, तो उसके ऊपर एक पीला, उसके ऊपर एक और ब्लॉक वह, और फिर एक खाली जगह। फिर इस कॉलम के लिए p = 2 (सभी को लाल होने से पहले हटाने के लिए दो ब्लॉक)। सभी स्तंभों के लिए p की गणना करें। स्तंभ के लिए जो खाली होना चाहिए, पी उन ब्लॉकों की संख्या के बराबर है जो इसमें हैं (उनमें से सभी को जाना चाहिए)। पी वर्तमान स्थिति के लिए सभी कॉलमों के लिए सभी पी का योग है।

जब पी = 0, सभी स्तंभों का रंग समान है और एक कॉलम खाली है, तो खेल समाप्त हो गया है।

P को कम करने वाली चालें चुनकर (या कम से कम p नहीं बढ़ाएं) हम सही दिशा में आगे बढ़ रहे हैं, यह मेरी राय में सबसे कम पथ एल्गोरिदम के साथ महत्वपूर्ण अंतर है: दिज्क्स्त्र को इस बात का कोई अंदाजा नहीं था कि क्या वह सही दिशा में आगे बढ़ रहा है वह जांच कर रहा था।

तो हम कैसे निर्धारित करते हैं कि प्रत्येक रंग कहां समाप्त होना चाहिए? मूल रूप से हर संभावना के लिए पी निर्धारित करके। इसलिए उदा लाल / पीले / हरे / खाली, पी की गणना के साथ शुरू करें, फिर लाल / पीले / खाली / हरे, गणना पी, आदि पर जाएं। सबसे कम पी के साथ शुरुआती स्थिति लें। यह n लेता है! गणना। N = 8 के लिए यह 40320 है, जो उचित है। बुरी खबर यह है कि आपको सभी शुरुआती पदों को समान निम्नतम p के साथ जांचना होगा। अच्छी खबर यह है कि आप बाकी को भूल सकते हैं।

यहां दो गणितीय अनिश्चितताएं हैं। एक: क्या यह संभव है कि कोई छोटा रास्ता है जो खराब चाल का उपयोग करता है? लगता है, मैं एक प्रतिसाद नहीं मिला है, लेकिन मैं एक सबूत भी नहीं मिला है। दो: क्या यह संभव है कि जब एक गैर-इष्टतम शुरुआती स्थिति के साथ शुरू हो (यानी सबसे कम पी नहीं) तो सभी इष्टतम शुरुआती पदों की तुलना में एक छोटा रास्ता होगा। फिर से: कोई पलटवार नहीं, लेकिन कोई सबूत भी नहीं।

कुछ कार्यान्वयन सुझाव। प्रत्येक कॉलम के लिए निष्पादन के दौरान पी का ट्रैक रखना मुश्किल नहीं है, लेकिन निश्चित रूप से किया जाना चाहिए। एक और पैरामीटर जो प्रत्येक कॉलम के लिए रखा जाना चाहिए, खुले स्थानों की संख्या है। यदि 0 है, तो यह कॉलम पल-पल किसी भी ब्लॉक को स्वीकार नहीं कर सकता है, इसलिए इसे लूप से बाहर रखा जा सकता है। जब एक कॉलम के लिए p = 0, यह पॉप के लिए योग्य नहीं है। हर संभव पॉप के लिए, जांच करें कि क्या कोई अच्छी चाल है, यानी एक जो समग्र पी को घटाता है। यदि एकाधिक हैं, तो सभी की जांच करें। यदि कोई नहीं है, तो सभी तटस्थ चाल पर विचार करें।

यह सब आपके गणना समय को बहुत कम कर देना चाहिए।


1
मुझे लगता है कि आपने सवाल गलत समझा! हालांकि यह सवाल के पीछे की प्रेरणा है। सवाल यह है कि किसी एक स्थान पर, किसी एक टुकड़े को स्थानांतरित करने के लिए न्यूनतम संख्या में चालें ज्ञात करें। सवाल यह था कि स्टैक को छांटने के लिए न्यूनतम संख्या में चाल नहीं थी, हालांकि यह सवाल के पीछे की प्रेरणा है। हालांकि, पी के उस स्कोरिंग के साथ, आप गलत होंगे। ऐसे कई उदाहरण हैं जहां "खराब चाल" हैं जो पहले पी को बढ़ाते हैं, और फिर बाद में इसे तेज दर से कम करते हैं। इसके साथ ही कहा, शायद प्रश्न को फिर से पढ़ें क्योंकि आपके उत्तर की कोई प्रासंगिकता नहीं है।
ट्रिस्टन

1
मेरी क्षमा याचना ट्रिस्टन, मैंने वास्तव में प्रश्न को ध्यान से नहीं पढ़ा। मैं इसके गणितीय पहलू पर मोहित था और पार्टी के लिए देर से जा रहा था, जवाब देने के लिए बहुत जल्दी। मैं अगली बार ज्यादा सावधान रहूंगा। उम्मीद है कि आपको इसका जवाब मिल जाएगा।
पॉल रेने
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.