Backtracking Problem

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Backtracking Problem

    Hallo Leute, ich hoffe ihr könnt mir weiterhelfen.

    Ich will einen Algo in Ruby schreiben, der mir die beste Zugfolge für ein Spiel ausgibt.

    Das Prob ist dabei, dass die wichtigen Variablen, wenn sie in einem Rekursionspfad geändert werden, dass in ALLEn Rekursionspfaden passiert.....?

    der soll sich im Prinzip durchschachteln und stelle für stelle probieren ob die entsprechende Zahl funktioniert und dann wenn keine Zahl mehr gewählt werden kann, die Summe ausrechnen und gucken ob das besser ist, als die bisherigen Ergebnisse.

    (Das Spiel funzt so: man hat eine Zahlenfolge von 1-N. Man kann pro zug 1 Zahl auswählen. Diese Zahl muss aber min. 1 Teiler haben. Wenn man eine Zahl gewählt hat, wird diese aus der Liste gestrichen, sowie deren Teiler. Kann keine Zahl mehr gewählt werden, ist das Spiel vorbei. Bei einer Folge von [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] wäre also [2, 6, 8, 10] möglich. Aber auch [10, 9, 8]. Je höher die Summe, desto besser^^)

    Quellcode

    1. def x_in_a(a, x)
    2. ap = a.index(x)
    3. if ap == nil
    4. return false
    5. else
    6. return true
    7. end
    8. end
    9. def teiler_check(a, zahl)
    10. teiler = []
    11. pos= a.index(zahl)
    12. if pos == nil
    13. pos = a.length-1
    14. end
    15. ii = 0
    16. for i in 0..pos
    17. if (zahl%a[i])==0
    18. if not a[i]==zahl
    19. teiler[ii]=a[i]
    20. ii += 1
    21. end
    22. end
    23. end
    24. return teiler
    25. end
    26. def move(a, u, t, z, x, teiler)
    27. a.delete(x)
    28. for i in 0..(teiler.length-1)
    29. a.delete(teiler[i])
    30. end
    31. up=u.length
    32. u[up]=x
    33. t = t + teiler
    34. end
    35. def ausgeben(u, t)
    36. score = 0
    37. for i in 0..(u.length-1)
    38. if not u[i]==nil
    39. score = score + u[i]
    40. end
    41. end
    42. if @score<score
    43. @score = score
    44. @way = u
    45. p "********"
    46. print "score: "
    47. p score
    48. print "way: "
    49. p @way
    50. p "********"
    51. end
    52. end
    53. def possible(a)
    54. is = 0
    55. i = 0
    56. state = false
    57. until is == 1 or i>=(a.length) do
    58. teiler = teiler_check(a, a[i])
    59. if teiler.length>0
    60. is = 1
    61. state = true
    62. else
    63. i+=1
    64. end
    65. end
    66. return state
    67. end
    68. def taxman(a, t, u, z, stacklvl)
    69. if possible(a)==true
    70. for i in 1..(a.length)
    71. print "stack: "
    72. p stacklvl
    73. x = i
    74. print "x: "
    75. p x
    76. if x_in_a(a, x)==true
    77. teiler=teiler_check(a, x)
    78. print "teiler: "
    79. p teiler
    80. if teiler.length>0
    81. move(a, u, t, z, x, teiler)
    82. print "u: "
    83. p u
    84. p "*****"
    85. taxman(a, t, u, z, stacklvl+1)
    86. end
    87. end
    88. p "********"
    89. end
    90. end
    91. ausgeben(u, t)
    92. end
    93. def setup(l)
    94. a = []
    95. z = []
    96. u = []
    97. t = []
    98. for i in 0..(l-1)
    99. a[i] = (i+1)
    100. z[i] = (i+1)
    101. end
    102. @score = 10
    103. @way = []
    104. taxman(a, t, u, z, 1)
    105. end
    106. setup(10)
    Alles anzeigen
  • Das Prob ist dabei, dass die wichtigen Variablen, wenn sie in einem Rekursionspfad geändert werden, dass in ALLEn Rekursionspfaden passiert.....?

    Ich schätze mal, dass Ruby Objekte standardmäßig als Referenz übergibt und nicht als Kopie.
    Entweder musst du Kopien übergeben oder jede Funktion muss den ausgeführten Zug vor der Rückkehr wieder rückgängig machen. Letztere Methode ist meistens besser weil weniger Speicher benötigt wird.