Advertisement
Guest User

Untitled

a guest
Jul 6th, 2024
870
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.30 KB | None | 0 0
  1.  
  2. from collections import defaultdict
  3. import matplotlib.pyplot as plt
  4.  
  5. # 1-SAT Lahendaja
  6. def solve_1sat_problem(clauses):
  7. assignment = set()
  8. for clause in clauses:
  9. if -clause in assignment:
  10. return [] # Konflikt leitud, lahendust ei eksisteeri
  11. assignment.add(clause)
  12. return list(assignment)
  13.  
  14. # Tarjani algoritm SCC-de jaoks
  15. def tarjan_scc(graph, n):
  16. index = 0
  17. indices = [-1] * (2 * n + 1)
  18. lowlink = [-1] * (2 * n + 1)
  19. on_stack = [False] * (2 * n + 1)
  20. stack = []
  21. sccs = []
  22.  
  23. def strong_connect(v):
  24. nonlocal index
  25. indices[v] = index
  26. lowlink[v] = index
  27. index += 1
  28. stack.append(v)
  29. on_stack[v] = True
  30.  
  31. for w in graph[v]:
  32. if indices[w] == -1:
  33. strong_connect(w)
  34. lowlink[v] = min(lowlink[v], lowlink[w])
  35. elif on_stack[w]:
  36. lowlink[v] = min(lowlink[v], indices[w])
  37.  
  38. if lowlink[v] == indices[v]:
  39. scc = []
  40. while True:
  41. w = stack.pop()
  42. on_stack[w] = False
  43. scc.append(w)
  44. if w == v:
  45. break
  46. sccs.append(scc)
  47.  
  48. for v in range(-n, n + 1):
  49. if v != 0 and indices[v] == -1:
  50. strong_connect(v)
  51.  
  52. return sccs
  53.  
  54. # 2-SAT Lahendaja
  55. def solve_2sat_problem(clauses):
  56. n = max(abs(literal) for clause in clauses for literal in clause)
  57. graph = defaultdict(list)
  58.  
  59. def add_implication(u, v):
  60. graph[-u].append(v)
  61. graph[-v].append(u)
  62.  
  63. for u, v in clauses:
  64. add_implication(u, v)
  65.  
  66. sccs = tarjan_scc(graph, n)
  67. assignment = [-1] * (n + 1)
  68. scc_index = {v: i for i, scc in enumerate(sccs) for v in scc}
  69.  
  70. for i in range(1, n + 1):
  71. if scc_index[i] == scc_index[-i]:
  72. return [] # Lahendust ei eksisteeri
  73. assignment[i] = scc_index[-i] > scc_index[i]
  74.  
  75. return [i if assignment[i] else -i for i in range(1, n + 1)]
  76.  
  77. # 3-SAT Lahendaja koos Kihistamisega
  78. def solve_3sat_problem(clauses):
  79. n = max(abs(literal) for clause in clauses for literal in clause)
  80. graph = defaultdict(list)
  81.  
  82. def add_implication(u, v, w):
  83. graph[-u].append(v)
  84. graph[-v].append(w)
  85. graph[-w].append(u)
  86.  
  87. for u, v, w in clauses:
  88. add_implication(u, v, w)
  89.  
  90. sccs = tarjan_scc(graph, n)
  91. assignment = [-1] * (n + 1)
  92. scc_index = {v: i for i, scc in enumerate(sccs) for v in scc}
  93.  
  94. for i in range(1, n + 1):
  95. if scc_index[i] == scc_index[-i]:
  96. return [] # Lahendust ei eksisteeri
  97. assignment[i] = scc_index[-i] > scc_index[i]
  98.  
  99. return [i if assignment[i] else -i for i in range(1, n + 1)]
  100.  
  101. # Visualiseerimisfunktsioon 2-SAT lahenduste jaoks
  102. def visualize_2sat_solution(clauses, solution, is_valid):
  103. fig, ax = plt.subplots(figsize=(10, 8))
  104. ax.set_title(f"2-SAT Probleemi Lahendus\nKehtiv: {is_valid}")
  105. ax.set_xlabel("Klauslid")
  106. ax.set_ylabel("Literaalide Arv")
  107.  
  108. sample_size = min(50, len(clauses))
  109. sample_clauses = clauses[:sample_size]
  110.  
  111. literals = [literal for clause in sample_clauses for literal in clause]
  112. counts = defaultdict(int)
  113. for literal in literals:
  114. counts[literal] += 1
  115.  
  116. literals, occurrences = zip(*sorted(counts.items()))
  117.  
  118. ax.bar(literals, occurrences)
  119. plt.show()
  120.  
  121. # 2-SAT lahenduse valideerimine
  122. def validate_2sat_solution(clauses, solution):
  123. if not solution:
  124. return False
  125.  
  126. assignment = {abs(lit): (lit > 0) for lit in solution}
  127.  
  128. for u, v in clauses:
  129. if (u > 0 and not assignment[abs(u)]) and (v > 0 and not assignment[abs(v)]):
  130. return False
  131. if (u < 0 and assignment[abs(u)]) and (v < 0 and assignment[abs(v)]):
  132. return False
  133.  
  134. return True
  135.  
  136. # 3-SAT lahenduse valideerimine (hüpoteetiline, ainult illustreerimiseks)
  137. def validate_3sat_solution(clauses, solution):
  138. if not solution:
  139. return False
  140.  
  141. assignment = {abs(lit): (lit > 0) for lit in solution}
  142.  
  143. for u, v, w in clauses:
  144. if not ((assignment[abs(u)] if u > 0 else not assignment[abs(u)]) or
  145. (assignment[abs(v)] if v > 0 else not assignment[abs(v)]) or
  146. (assignment[abs(w)] if w > 0 else not assignment[abs(w)])):
  147. return False
  148.  
  149. return True
  150.  
  151. # 3-SAT klauslite kihistamine
  152. def layer_clauses_3sat(clauses):
  153. layers = defaultdict(list)
  154. for clause in clauses:
  155. layer_key = abs(clause[0])
  156. layers[layer_key].append(clause)
  157. return layers
  158.  
  159. # Näide 3-SAT kasutusest koos kihistamisega
  160. clauses_3sat = [
  161. (1, -2, 3), (-1, 2, -3), (2, 3, -4), (-2, -3, 4),
  162. (4, -5, 6), (-4, 5, -6), (5, 6, -7), (-5, -6, 7)
  163. ]
  164.  
  165. layers = layer_clauses_3sat(clauses_3sat)
  166.  
  167. for layer in layers:
  168. print(f"Layer {layer}:")
  169. solution_3sat_layered = solve_3sat_problem(layers[layer])
  170. is_valid_3sat_layered = validate_3sat_solution(layers[layer], solution_3sat_layered)
  171. print(f"3-SAT Solution for Layer {layer}:", solution_3sat_layered)
  172. print(f"Is the 3-SAT solution valid for Layer {layer}?", is_valid_3sat_layered)
  173. print()
  174.  
  175. # Näide 1-SAT kasutusest
  176. clauses_1sat = [1, -2, 3, 4, -5, 6, -7, 8, 9, -10, 11, -12]
  177. solution_1sat = solve_1sat_problem(clauses_1sat)
  178. print("1-SAT Solution:", solution_1sat)
  179.  
  180. # Näide 2-SAT kasutusest
  181. clauses_2sat = [
  182. (1, -2), (2, 3), (-3, 4), (-1, -4), (5, -6), (-5, 7), (6, -7), (8, -9),
  183. (-8, 10), (9, -10), (11, 12), (-11, -12), (13, -14), (-13, 14), (-15, 16),
  184. (15, -16), (17, -18), (-17, 18), (19, -20), (-19, 20), (21, -22), (-21, 22),
  185. (23, -24), (-23, 24), (25, -26), (-25, 26), (27, -28), (-27, 28), (29, -30),
  186. (-29, 30), (31, -32), (-31, 32), (33, -34), (-33, 34), (35, -36), (-35, 36),
  187. (37, -38), (-37, 38), (39, -40), (-39, 40), (41, -42), (-41, 42), (43, -44),
  188. (-43, 44), (45, -46), (-45, 46), (47, -48), (-47, 48), (49, -50), (-49, 50)
  189. ]
  190. solution_2sat = solve_2sat_problem(clauses_2sat)
  191. print("2-SAT Solution:", solution_2sat)
  192.  
  193. # 2-SAT lahenduse valideerimine ja visualiseerimine
  194. is_valid_2sat = validate_2sat_solution(clauses_2sat, solution_2sat)
  195. print("Is the 2-SAT solution valid?", is_valid_2sat)
  196. visualize_2sat_solution(clauses_2sat, solution_2sat, is_valid_2sat)
  197.  
  198. # Hüpoteetiline 3-SAT kasutus koos kihistamisega
  199. clauses_3sat = [
  200. (1, -2, 3), (-1, 2, -3), (2, 3, -4), (-2, -3, 4),
  201. (4, -5, 6), (-4, 5, -6), (5, 6, -7), (-5, -6, 7),
  202. (8, -9, 10), (-8, 9, -10), (9, 10, -11), (-9, -10, 11),
  203. (12, -13, 14), (-12, 13, -14), (13, 14, -15), (-13, -14, 15)
  204. ]
  205.  
  206. layers = layer_clauses_3sat(clauses_3sat)
  207.  
  208. for layer in layers:
  209. print(f"Layer {layer}:")
  210. solution_3sat_layered = solve_3sat_problem(layers[layer])
  211. is_valid_3sat_layered = validate_3sat_solution(layers[layer], solution_3sat_layered)
  212. print(f"3-SAT Solution for Layer {layer}:", solution_3sat_layered)
  213. print(f"Is the 3-SAT solution valid for Layer {layer}?", is_valid_3sat_layered)
  214. visualize_3sat_solution(layers[layer], solution_3sat_layered, is_valid_3sat_layered)
  215. print()
  216.  
  217. # Näide 3-SAT lahenduse visualiseerimisest (valikuline)
  218. def visualize_3sat_solution(clauses, solution, is_valid):
  219. fig, ax = plt.subplots(figsize=(10, 8))
  220. ax.set_title(f"3-SAT Probleemi Lahendus\nKehtiv: {is_valid}")
  221. ax.set_xlabel("Klauslid")
  222. ax.set_ylabel("Literaalide Arv")
  223.  
  224. sample_size = min(50, len(clauses))
  225. sample_clauses = clauses[:sample_size]
  226.  
  227. literals = [literal for clause in sample_clauses for literal in clause]
  228. counts = defaultdict(int)
  229. for literal in literals:
  230. counts[literal] += 1
  231.  
  232. literals, occurrences = zip(*sorted(counts.items()))
  233.  
  234. ax.bar(literals, occurrences)
  235. plt.show()
  236.  
  237. # 3-SAT lahenduse valideerimine ja visualiseerimine iga kihi jaoks
  238. for layer in layers:
  239. solution_3sat_layered = solve_3sat_problem(layers[layer])
  240. is_valid_3sat_layered = validate_3sat_solution(layers[layer], solution_3sat_layered)
  241. print(f"3-SAT Solution for Layer {layer}:", solution_3sat_layered)
  242. print(f"Is the 3-SAT solution valid for Layer {layer}?", is_valid_3sat_layered)
  243. visualize_3sat_solution(layers[layer], solution_3sat_layered, is_valid_3sat_layered)
  244. print()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement