Bladeren bron

modify graph coloring solution

highing666 3 jaren geleden
bovenliggende
commit
0df9fe1f0e
2 gewijzigde bestanden met toevoegingen van 21 en 23 verwijderingen
  1. 0 2
      app/api/routers/algorithms.py
  2. 21 21
      app/controllers/algorithms/graph_coloring.py

+ 0 - 2
app/api/routers/algorithms.py

@@ -16,6 +16,4 @@ async def get_graph_coloring_result(graph: GraphColoringRequest):
         'colored': colored
     }
 
-    logger.debug(solution)
-
     return solution

+ 21 - 21
app/controllers/algorithms/graph_coloring.py

@@ -1,4 +1,3 @@
-import random
 from queue import Queue
 from typing import Dict, List, Optional, Tuple
 
@@ -16,14 +15,15 @@ class ColoringProblemBFSSolution:
 
     def __init__(self, vertexes: List[Vertex]):
         self._vertexes = vertexes
-        self._is_solvable = False
+        self._is_solvable = True
 
-    def bfs(self, m=2):
+    def bfs(self, m=2) -> None:
+        m -= 1
         n = len(self._vertexes)
-        visited = [False for _ in range(n + 1)]
+        visited = [False for _ in range(n)]
         max_color_count = 1
 
-        for i in range(1, n + 1):
+        for i in range(n):
             if not visited[i]:
                 visited[i] = True
                 q = Queue()
@@ -38,31 +38,31 @@ class ColoringProblemBFSSolution:
 
                         max_color_count = max(max_color_count, max(self._vertexes[top].color, self._vertexes[j].color))
                         if max_color_count > m:
-                            return False
+                            self._is_solvable = False
+                            self._vertexes[j].color = 0
 
                         if not visited[j]:
                             visited[j] = True
                             q.put(j)
 
-        self._is_solvable = True
-
-        return True
-
-    def get_colored(self) -> Dict[str, int]:
+    def get_colored(self) -> Tuple[bool, Dict[str, int]]:
         colored = dict()
-        if self._is_solvable:
-            for v in self._vertexes:
-                colored.update({v.id: v.color})
-        else:
-            for v in self._vertexes:
-                colored.update({v.id: random.choice([0, 1])})
+        for v in self._vertexes:
+            colored.update({v.id: v.color})
 
-        return colored
+        return self._is_solvable, colored
 
 
 def reformat(graph: Dict[str, List]) -> List[Vertex]:
-    vertexes = []
+    vertex_idx_dic = dict()
+    idx = 0
+    for k in graph.keys():
+        vertex_idx_dic.update({k: idx})
+        idx += 1
+
+    vertexes = list()
     for v, edges in graph.items():
+        edges = [vertex_idx_dic[item] for item in edges]
         vertexes.append(Vertex(id=v, color=0, edges=set(edges)))
 
     return vertexes
@@ -72,6 +72,6 @@ def reformat(graph: Dict[str, List]) -> List[Vertex]:
 async def get_graph_coloring(graph: Dict[str, List]) -> Tuple[bool, Dict[str, int]]:
     vertexes = reformat(graph)
     solution = ColoringProblemBFSSolution(vertexes)
-    is_solvable = solution.bfs()
+    solution.bfs()
 
-    return is_solvable, solution.get_colored()
+    return solution.get_colored()