Browse Source

Merge branch 'give_up_on_10k' of tarfeef101/cs486 into master

Tareef Dedhar 6 years ago
parent
commit
0a37a9b683
100 changed files with 1419 additions and 49 deletions
  1. 1 0
      a1/README.txt
  2. BIN
      a1/graph.pdf
  3. 104 49
      a1/sudoku.py
  4. 132 0
      a1/tsp.py
  5. 132 0
      a1/tsp_dumb.py
  6. 2 0
      a1/tsp_problems/1/instance_1.txt
  7. 2 0
      a1/tsp_problems/1/instance_10.txt
  8. 2 0
      a1/tsp_problems/1/instance_2.txt
  9. 2 0
      a1/tsp_problems/1/instance_3.txt
  10. 2 0
      a1/tsp_problems/1/instance_4.txt
  11. 2 0
      a1/tsp_problems/1/instance_5.txt
  12. 2 0
      a1/tsp_problems/1/instance_6.txt
  13. 2 0
      a1/tsp_problems/1/instance_7.txt
  14. 2 0
      a1/tsp_problems/1/instance_8.txt
  15. 2 0
      a1/tsp_problems/1/instance_9.txt
  16. 11 0
      a1/tsp_problems/10/instance_1.txt
  17. 11 0
      a1/tsp_problems/10/instance_10.txt
  18. 11 0
      a1/tsp_problems/10/instance_2.txt
  19. 11 0
      a1/tsp_problems/10/instance_3.txt
  20. 11 0
      a1/tsp_problems/10/instance_4.txt
  21. 11 0
      a1/tsp_problems/10/instance_5.txt
  22. 11 0
      a1/tsp_problems/10/instance_6.txt
  23. 11 0
      a1/tsp_problems/10/instance_7.txt
  24. 11 0
      a1/tsp_problems/10/instance_8.txt
  25. 11 0
      a1/tsp_problems/10/instance_9.txt
  26. 12 0
      a1/tsp_problems/11/instance_1.txt
  27. 12 0
      a1/tsp_problems/11/instance_10.txt
  28. 12 0
      a1/tsp_problems/11/instance_2.txt
  29. 12 0
      a1/tsp_problems/11/instance_3.txt
  30. 12 0
      a1/tsp_problems/11/instance_4.txt
  31. 12 0
      a1/tsp_problems/11/instance_5.txt
  32. 12 0
      a1/tsp_problems/11/instance_6.txt
  33. 12 0
      a1/tsp_problems/11/instance_7.txt
  34. 12 0
      a1/tsp_problems/11/instance_8.txt
  35. 12 0
      a1/tsp_problems/11/instance_9.txt
  36. 13 0
      a1/tsp_problems/12/instance_1.txt
  37. 13 0
      a1/tsp_problems/12/instance_10.txt
  38. 13 0
      a1/tsp_problems/12/instance_2.txt
  39. 13 0
      a1/tsp_problems/12/instance_3.txt
  40. 13 0
      a1/tsp_problems/12/instance_4.txt
  41. 13 0
      a1/tsp_problems/12/instance_5.txt
  42. 13 0
      a1/tsp_problems/12/instance_6.txt
  43. 13 0
      a1/tsp_problems/12/instance_7.txt
  44. 13 0
      a1/tsp_problems/12/instance_8.txt
  45. 13 0
      a1/tsp_problems/12/instance_9.txt
  46. 14 0
      a1/tsp_problems/13/instance_1.txt
  47. 14 0
      a1/tsp_problems/13/instance_10.txt
  48. 14 0
      a1/tsp_problems/13/instance_2.txt
  49. 14 0
      a1/tsp_problems/13/instance_3.txt
  50. 14 0
      a1/tsp_problems/13/instance_4.txt
  51. 14 0
      a1/tsp_problems/13/instance_5.txt
  52. 14 0
      a1/tsp_problems/13/instance_6.txt
  53. 14 0
      a1/tsp_problems/13/instance_7.txt
  54. 14 0
      a1/tsp_problems/13/instance_8.txt
  55. 14 0
      a1/tsp_problems/13/instance_9.txt
  56. 15 0
      a1/tsp_problems/14/instance_1.txt
  57. 15 0
      a1/tsp_problems/14/instance_10.txt
  58. 15 0
      a1/tsp_problems/14/instance_2.txt
  59. 15 0
      a1/tsp_problems/14/instance_3.txt
  60. 15 0
      a1/tsp_problems/14/instance_4.txt
  61. 15 0
      a1/tsp_problems/14/instance_5.txt
  62. 15 0
      a1/tsp_problems/14/instance_6.txt
  63. 15 0
      a1/tsp_problems/14/instance_7.txt
  64. 15 0
      a1/tsp_problems/14/instance_8.txt
  65. 15 0
      a1/tsp_problems/14/instance_9.txt
  66. 16 0
      a1/tsp_problems/15/instance_1.txt
  67. 16 0
      a1/tsp_problems/15/instance_10.txt
  68. 16 0
      a1/tsp_problems/15/instance_2.txt
  69. 16 0
      a1/tsp_problems/15/instance_3.txt
  70. 16 0
      a1/tsp_problems/15/instance_4.txt
  71. 16 0
      a1/tsp_problems/15/instance_5.txt
  72. 16 0
      a1/tsp_problems/15/instance_6.txt
  73. 16 0
      a1/tsp_problems/15/instance_7.txt
  74. 16 0
      a1/tsp_problems/15/instance_8.txt
  75. 16 0
      a1/tsp_problems/15/instance_9.txt
  76. 17 0
      a1/tsp_problems/16/instance_1.txt
  77. 17 0
      a1/tsp_problems/16/instance_10.txt
  78. 17 0
      a1/tsp_problems/16/instance_2.txt
  79. 17 0
      a1/tsp_problems/16/instance_3.txt
  80. 17 0
      a1/tsp_problems/16/instance_4.txt
  81. 17 0
      a1/tsp_problems/16/instance_5.txt
  82. 17 0
      a1/tsp_problems/16/instance_6.txt
  83. 17 0
      a1/tsp_problems/16/instance_7.txt
  84. 17 0
      a1/tsp_problems/16/instance_8.txt
  85. 17 0
      a1/tsp_problems/16/instance_9.txt
  86. 3 0
      a1/tsp_problems/2/instance_1.txt
  87. 3 0
      a1/tsp_problems/2/instance_10.txt
  88. 3 0
      a1/tsp_problems/2/instance_2.txt
  89. 3 0
      a1/tsp_problems/2/instance_3.txt
  90. 3 0
      a1/tsp_problems/2/instance_4.txt
  91. 3 0
      a1/tsp_problems/2/instance_5.txt
  92. 3 0
      a1/tsp_problems/2/instance_6.txt
  93. 3 0
      a1/tsp_problems/2/instance_7.txt
  94. 3 0
      a1/tsp_problems/2/instance_8.txt
  95. 3 0
      a1/tsp_problems/2/instance_9.txt
  96. 4 0
      a1/tsp_problems/3/instance_1.txt
  97. 4 0
      a1/tsp_problems/3/instance_10.txt
  98. 4 0
      a1/tsp_problems/3/instance_2.txt
  99. 4 0
      a1/tsp_problems/3/instance_3.txt
  100. 4 0
      a1/tsp_problems/3/instance_4.txt

+ 1 - 0
a1/README.txt

@@ -0,0 +1 @@
+To run the solvers, simply run "python3 sudoku.py", "python3 tsp.py" and "python3 tsp_dumb.py"

BIN
a1/graph.pdf


+ 104 - 49
a1/sudoku.py

@@ -1,19 +1,7 @@
-import sys
 import copy
 from contextlib import suppress
 from heapq import heappush, heappop
-
-board = sys.argv[1]
-algotype = sys.argv[2]
-
-# import board
-with open(board) as file:
-    board = file.read().splitlines()
-    board = board[:-1]
-
-# convert to list of list of ints
-for l in board:
-    board[board.index(l)] = list(map(lambda x: int(x), l.split()))
+import matplotlib.pyplot as plt
 
 # return a board that is like the board b, but has domains for each element of b (always 1-9)
 def genDomains(b):
@@ -59,7 +47,10 @@ def naive(start):
     assumptions = []
                     
     if(len(unassigned) == 0):
-        return True
+        return (working, 0)
+        
+    # count assignments
+    count = 0
     
     # while there are unassigned vars, keep going
     while(len(unassigned)):
@@ -69,8 +60,18 @@ def naive(start):
         # iterate over all values in the domain list
         while solution[index[0]][index[1]]:
             i = solution[index[0]][index[1]].pop()
+            count += 1
+            # took too long
+            if (count >= 10000):
+                print("took too long")
+                return 10000
+
             # check if this part of the domain(solution) is valid
             if (valid(working, index[0], index[1], i)):
+                #count += 1
+                #if (count >= 10000):
+                #  print("took too long")
+                #  return False
                 solution[index[0]][index[1]].append(i) # keep in the domain
                 working[index[0]][index[1]] = i
                 assumptions.append(index)
@@ -91,9 +92,9 @@ def naive(start):
     
     
     # if we exit without assigning everything, we should have failed
-    if (unassigned): return False
+    if (unassigned): return 10000
 
-    return working
+    return count
 
 
 # returns a board (domains) where inferences are made for the cell at row, col
@@ -130,42 +131,63 @@ def gen2Domains(b):
 
 
 # recursive solver for forward-checking
-def solve(working, domains, unassigned):
+def solve(working, domains, unassigned, count):
     if (not unassigned):
-        return working
-    
+        return (True, count)
+
     index = unassigned.pop()
     
     # for every value in the domain, check if using it works. if all fail, backtrack.
     for i in domains[index[0]][index[1]]:
         working[index[0]][index[1]] = i
         newdomains = infer(domains, working, index[0], index[1], i)
-        result = solve(working, newdomains, copy.deepcopy(unassigned))
-        if (result):
+        domains[index[0]][index[1]].remove(i)
+        count += 1
+        # took too long
+        if (count >= 10000):
+          print("took too long")
+          return (True, 10000)
+
+        # check for invalidated nodes (empty domains)
+        flag = True
+        result = False
+        for i in range(0, 9):
+          for j in range(0, 9):
+            if (len(newdomains[i][j]) <= 0):
+              flag = False
+        
+        if (flag): result = solve(working, newdomains, copy.deepcopy(unassigned), count)
+        if (not result):
+          return (False, count)
+        if (result[0]):
             return result
         else:
-            continue
+            #domains[index[0]][index[1]].remove(i)
+            count = result[1]
     
-    return False
+    return (False, count)
 
 # forward checking solver
 def forward(start):
     working = copy.deepcopy(start) # this is only "filled in values" and 0s
-    domains = gen2Domains(start)
+    domains = gen2Domains(working)
     # unassigned will be a list of positions we have to fill
     unassigned = []
     for i in range(0, 9):
         for j in range(0, 9):
             if (len(domains[i][j]) == 9):
                 unassigned.append((i, j))
-    
+   
     # forward-checking on pre-assigned values
     for i in range(0, 9):
         for j in range(0, 9):
             if (working[i][j] != 0):
                 domains = infer(domains, working, i, j, working[i][j])
             
-    return solve(working, domains, unassigned)
+    result = solve(working, domains, unassigned, 0)
+    return result[1]
+    #if (result[0]): return result[1]
+    #else: return 10000
 
 
 # returns size of domain for a given index
@@ -258,9 +280,9 @@ def genVal(domains, working, unassigned):
 
 
 # recursive solver that uses heuristics to decide what node to explore
-def solveh(working, domains, unassigned):
+def solveh(working, domains, unassigned, count):
     if (not unassigned):
-        return working
+        return (True, count)
     
     # while there are unassigned values keep trying
     while(unassigned):
@@ -270,26 +292,35 @@ def solveh(working, domains, unassigned):
         val = nextThing[1]
         working[index[0]][index[1]] = val
         unassigned.remove(index)
-    
+        
         # check for invalidated nodes (empty domain)
         flag = True
         result = False
         newdomains = infer(domains, working, index[0], index[1], val)
         for i in range(0, 9):
             for j in range(0, 9):
-                if (not domains[i][j]):
+                if (not newdomains[i][j]):
                     flag = False
         
+        count += 1
+        # took too long
+        if (count >= 10000):
+          print("took too long")
+          return (False, count)
+
         # success! recurse
-        if (flag): result = solveh(working, newdomains, copy.deepcopy(unassigned))
-        if (result):
+        if (flag): result = solveh(working, newdomains, copy.deepcopy(unassigned), count)
+        if (not result): pass
+        elif (result[0]):
             return result
         elif (len(domains[index[0]][index[1]]) > 1): # remove from domain, keep going
             working[index[0]][index[1]] = 0
             domains[index[0]][index[1]].remove(val)
             unassigned.append(index)
+            if (flag): count = result[1]
         else: # no values worked :( return false
-            return False
+            if (flag): return (False, result[1])
+            return (False, count)
 
 
 # forward checking solver with heuristics
@@ -309,25 +340,49 @@ def heuristic(start):
             if (working[i][j] != 0):
                 domains = infer(domains, working, i, j, working[i][j])
             
-    return solveh(working, domains, unassigned)
+    result = solveh(working, domains, unassigned, 0)
+    if (result[0]): return result[1]
+    else: return 10000
 
 
 def main():
-    print("###########")
-    print(*board, sep='\n')
-    print("##########")
-
-    if (algotype == str(0)):
-      result = naive(board)
-    elif (algotype == str(1)):
-      result = forward(board)
-    elif (algotype == str(2)):
-      result = heuristic(board)
-    else:
-      print("No valid algorithm selected. RIP.")
+    plt.ioff()
+    plt.switch_backend('agg')
+    averages = []
+    bverages = []
+    cverages = []
+    
+    for i in range(1, 72):
+        avgA = 0
+        avgB = 0
+        avgC = 0
+        for j in range(1, 11):
+            filepath = "sudoku_problems/" + str(i) + "/" + str(j) + ".sd"
+            
+            # import board
+            with open(filepath) as file:
+                board = file.read().splitlines()
+                board = board[:-1]
 
-    print("###########")
-    print(*result, sep='\n')
-    print("##########")
+            # convert to list of list of ints
+            for l in board:
+                board[board.index(l)] = list(map(lambda x: int(x), l.split()))
+            
+            avgA += naive(copy.deepcopy(board));print(i, j)
+            avgB += forward(copy.deepcopy(board));print(i, j)
+            avgC += heuristic(copy.deepcopy(board));print(i, j)
+            
+        averages.append(avgA / 10.0)
+        bverages.append(avgB / 10.0)
+        cverages.append(avgC / 10.0)
+        
+    figure, axes = plt.subplots(1, 1, True)
+    axes.plot(range(1, 72), averages, label='Naive Algorithm')
+    axes.plot(range(1, 72), bverages, label='Forward-Checking Algorithm')
+    axes.plot(range(1, 72), cverages, label='Heuristics')
+    axes.legend()
+    plt.xlabel("Number of Initial Valued Filled In")
+    plt.ylabel("Average Number of Variable Assignments in 10 Runs")
+    plt.savefig("graph.pdf")
     
 main()

+ 132 - 0
a1/tsp.py

@@ -0,0 +1,132 @@
+import sys
+import copy
+import math
+from heapq import heappush, heappop
+from random import randint
+import matplotlib.pyplot as plt
+
+distances = []
+n = 0
+
+# returns hueristic value
+def heuristic(source, target, dist):
+    #return 0
+    for i in range(0, min(n * 2, n ** 2)):
+        if (dist <= distances[i]):
+            return 0
+    return dist
+
+
+# returns weight(distance) between 2 vertices
+def weight(city1, city2):
+    return math.sqrt((city1[1] - city2[1]) ** 2 + (city1[2] - city2[2]) ** 2)
+
+
+# returns if going to city i from curnode is okay
+def valid(curnode, cities, i):
+    # can't revisit a city
+    if (i in curnode[2]):
+        return False
+    # if curnode hasn't visited everything else and we are going to the gaol
+    elif (len(curnode[2]) != (len(cities) - 1) and i == (len(cities) - 1)):
+        return False
+    else:
+        return True
+
+
+# returns the count of child states. updates frontier
+def explore(curnode, frontier, cities):
+    children = 0
+    
+    for i in range(1, len(cities)):
+        # can we go here?
+        if (valid(curnode, cities, i)):
+            children += 1
+            # add to frontier
+            dist = weight(curnode[1], cities[i])
+            metric = dist + heuristic(curnode[1], cities[i], dist)
+            heappush(frontier, [curnode[0] + metric, cities[i], copy.deepcopy(curnode[2])])
+    
+    return children
+
+
+# A* solver for TSP
+def solve(frontier, cities):
+    # number of child states
+    newnodes = 0
+    curnode = heappop(frontier)
+    
+    # while we are not on the goal node
+    while (curnode[1] != cities[-1]):
+        newnodes += explore(curnode, frontier, cities)
+        curnode = heappop(frontier)
+        curnode[2].append(cities.index(curnode[1]))
+        
+    return newnodes + 1
+
+
+def tsp(filename):
+    # import map
+    #prob = "instance_10.txt"
+    prob = filename
+    with open(prob) as file:
+        prob = file.read().splitlines()
+
+    n = int(prob[0])
+    cities = prob[1:]
+    counter = 0
+    # convert to list of list of ints
+    for l in cities:
+        temp = l.split()
+        temp[1] = int(temp[1])
+        temp[2] = int(temp[2])
+        temp.append(counter)
+        counter += 1
+        cities[cities.index(l)] = temp
+        
+    distances = []
+    
+    for i in range(0, len(cities) - 1):
+        for j in range(i, len(cities)):
+            dist = weight(cities[i], cities[j])
+            distances.append(dist)
+                
+    distances.sort()
+    
+    # add in goal state
+    cities.append(copy.deepcopy(cities[0]))
+    cities[-1][0] = "Goal"
+    
+    # create frontier
+    frontier = []
+    # add start state, list of visited, and distancesofar to frontier
+    heappush(frontier, [0, cities[0], [0]])
+
+    result = solve(frontier, cities)
+    print(result)
+    return result
+
+
+def main():
+    global distances
+    global n
+    plt.ioff()
+    plt.switch_backend('agg')
+    averages = []
+    
+    for i in range(1, 12):
+        average = 0
+        for j in range(1, 11):
+            filepath = "tsp_problems/" + str(i) + "/instance_" + str(j) + ".txt"
+            average += tsp(filepath)
+            
+        averages.append(average / 10.0)
+    
+    figure, axes = plt.subplots(1, 1, True)
+    axes.semilogy(range(1, 12), averages, label='TSP Solver (Heuristic)')
+    axes.legend()
+    plt.xlabel("Number of Cities")
+    plt.ylabel("Average Number of Nodes Generated in 10 Runs")
+    plt.savefig("tsph.pdf")
+    
+main()

+ 132 - 0
a1/tsp_dumb.py

@@ -0,0 +1,132 @@
+import sys
+import copy
+import math
+from heapq import heappush, heappop
+from random import randint
+import matplotlib.pyplot as plt
+
+#distances = []
+n = 0
+
+# returns hueristic value
+def heuristic(source, target, dist):
+    return 0
+    #for i in range(0, min(n * 2, n ** 2)):
+    #    if (dist <= distances[i]):
+    #        return 0
+    #return dist
+
+
+# returns weight(distance) between 2 vertices
+def weight(city1, city2):
+    return math.sqrt((city1[1] - city2[1]) ** 2 + (city1[2] - city2[2]) ** 2)
+
+
+# returns if going to city i from curnode is okay
+def valid(curnode, cities, i):
+    # can't revisit a city
+    if (i in curnode[2]):
+        return False
+    # if curnode hasn't visited everything else and we are going to the gaol
+    elif (len(curnode[2]) != (len(cities) - 1) and i == (len(cities) - 1)):
+        return False
+    else:
+        return True
+
+
+# returns the count of child states. updates frontier
+def explore(curnode, frontier, cities):
+    children = 0
+    
+    for i in range(1, len(cities)):
+        # can we go here?
+        if (valid(curnode, cities, i)):
+            children += 1
+            # add to frontier
+            dist = weight(curnode[1], cities[i])
+            metric = dist + heuristic(curnode[1], cities[i], dist)
+            heappush(frontier, [curnode[0] + metric, cities[i], copy.deepcopy(curnode[2])])
+    
+    return children
+
+
+# A* solver for TSP
+def solve(frontier, cities):
+    # number of child states
+    newnodes = 0
+    curnode = heappop(frontier)
+    
+    # while we are not on the goal node
+    while (curnode[1] != cities[-1]):
+        newnodes += explore(curnode, frontier, cities)
+        curnode = heappop(frontier)
+        curnode[2].append(cities.index(curnode[1]))
+        
+    return newnodes + 1
+
+
+def tsp(filename):
+    # import map
+    #prob = "instance_10.txt"
+    prob = filename
+    with open(prob) as file:
+        prob = file.read().splitlines()
+
+    n = int(prob[0])
+    cities = prob[1:]
+    counter = 0
+    # convert to list of list of ints
+    for l in cities:
+        temp = l.split()
+        temp[1] = int(temp[1])
+        temp[2] = int(temp[2])
+        temp.append(counter)
+        counter += 1
+        cities[cities.index(l)] = temp
+        
+    #distances = []
+    
+    #for i in range(0, len(cities) - 1):
+    #    for j in range(i, len(cities)):
+    #        dist = weight(cities[i], cities[j])
+    #        distances.append(dist)
+                
+    #distances.sort()
+    
+    # add in goal state
+    cities.append(copy.deepcopy(cities[0]))
+    cities[-1][0] = "Goal"
+    
+    # create frontier
+    frontier = []
+    # add start state, list of visited, and distancesofar to frontier
+    heappush(frontier, [0, cities[0], [0]])
+
+    result = solve(frontier, cities)
+    print(result)
+    return result
+
+
+def main():
+    #global distances
+    global n
+    plt.ioff()
+    plt.switch_backend('agg')
+    averages = []
+    
+    for i in range(1, 12):
+        average = 0
+        for j in range(1, 11):
+            filepath = "tsp_problems/" + str(i) + "/instance_" + str(j) + ".txt"
+            average += tsp(filepath)
+            
+        averages.append(average / 10.0)
+    
+    figure, axes = plt.subplots(1, 1, True)
+    axes.semilogy(range(1, 12), averages, label='TSP Solver (Heuristic)')
+    axes.legend()
+    plt.xlabel("Number of Cities")
+    plt.ylabel("Average Number of Nodes Generated in 10 Runs")
+    plt.savefig("tspdumb.pdf")
+    
+main()

+ 2 - 0
a1/tsp_problems/1/instance_1.txt

@@ -0,0 +1,2 @@
+1
+A 94 66

+ 2 - 0
a1/tsp_problems/1/instance_10.txt

@@ -0,0 +1,2 @@
+1
+A 78 34

+ 2 - 0
a1/tsp_problems/1/instance_2.txt

@@ -0,0 +1,2 @@
+1
+A 30 26

+ 2 - 0
a1/tsp_problems/1/instance_3.txt

@@ -0,0 +1,2 @@
+1
+A 84 22

+ 2 - 0
a1/tsp_problems/1/instance_4.txt

@@ -0,0 +1,2 @@
+1
+A 48 75

+ 2 - 0
a1/tsp_problems/1/instance_5.txt

@@ -0,0 +1,2 @@
+1
+A 32 86

+ 2 - 0
a1/tsp_problems/1/instance_6.txt

@@ -0,0 +1,2 @@
+1
+A 55 23

+ 2 - 0
a1/tsp_problems/1/instance_7.txt

@@ -0,0 +1,2 @@
+1
+A 37 91

+ 2 - 0
a1/tsp_problems/1/instance_8.txt

@@ -0,0 +1,2 @@
+1
+A 71 47

+ 2 - 0
a1/tsp_problems/1/instance_9.txt

@@ -0,0 +1,2 @@
+1
+A 10 49

+ 11 - 0
a1/tsp_problems/10/instance_1.txt

@@ -0,0 +1,11 @@
+10
+A 66 62
+B 89 26
+C 20 27
+D 17 56
+E 2 74
+F 37 40
+G 41 24
+H 55 72
+I 32 12
+J 94 22

+ 11 - 0
a1/tsp_problems/10/instance_10.txt

@@ -0,0 +1,11 @@
+10
+A 22 91
+B 69 99
+C 32 27
+D 52 61
+E 36 56
+F 37 8
+G 54 69
+H 88 80
+I 32 51
+J 47 73

+ 11 - 0
a1/tsp_problems/10/instance_2.txt

@@ -0,0 +1,11 @@
+10
+A 28 36
+B 30 61
+C 30 20
+D 60 38
+E 20 21
+F 64 54
+G 9 91
+H 31 80
+I 68 98
+J 87 50

+ 11 - 0
a1/tsp_problems/10/instance_3.txt

@@ -0,0 +1,11 @@
+10
+A 42 71
+B 67 22
+C 71 39
+D 32 70
+E 88 19
+F 67 22
+G 24 11
+H 87 11
+I 85 1
+J 91 65

+ 11 - 0
a1/tsp_problems/10/instance_4.txt

@@ -0,0 +1,11 @@
+10
+A 65 85
+B 14 87
+C 95 35
+D 5 46
+E 83 22
+F 24 83
+G 7 51
+H 7 58
+I 58 32
+J 50 89

+ 11 - 0
a1/tsp_problems/10/instance_5.txt

@@ -0,0 +1,11 @@
+10
+A 85 94
+B 62 33
+C 82 38
+D 88 37
+E 22 47
+F 63 7
+G 88 94
+H 1 23
+I 10 16
+J 46 53

+ 11 - 0
a1/tsp_problems/10/instance_6.txt

@@ -0,0 +1,11 @@
+10
+A 94 43
+B 12 44
+C 67 97
+D 23 36
+E 83 92
+F 7 25
+G 46 72
+H 91 89
+I 48 65
+J 81 15

+ 11 - 0
a1/tsp_problems/10/instance_7.txt

@@ -0,0 +1,11 @@
+10
+A 2 97
+B 8 46
+C 28 26
+D 46 14
+E 48 8
+F 92 8
+G 97 68
+H 99 95
+I 86 77
+J 73 75

+ 11 - 0
a1/tsp_problems/10/instance_8.txt

@@ -0,0 +1,11 @@
+10
+A 89 81
+B 12 97
+C 22 51
+D 74 37
+E 62 19
+F 21 36
+G 98 34
+H 65 17
+I 27 43
+J 56 25

+ 11 - 0
a1/tsp_problems/10/instance_9.txt

@@ -0,0 +1,11 @@
+10
+A 32 16
+B 83 84
+C 81 84
+D 60 23
+E 30 76
+F 73 99
+G 99 51
+H 29 19
+I 43 61
+J 23 70

+ 12 - 0
a1/tsp_problems/11/instance_1.txt

@@ -0,0 +1,12 @@
+11
+A 9 50
+B 71 1
+C 69 34
+D 56 10
+E 84 62
+F 71 62
+G 17 99
+H 74 90
+I 17 77
+J 56 27
+K 41 50

+ 12 - 0
a1/tsp_problems/11/instance_10.txt

@@ -0,0 +1,12 @@
+11
+A 7 13
+B 68 55
+C 28 11
+D 42 67
+E 3 61
+F 94 63
+G 31 47
+H 98 19
+I 38 26
+J 6 74
+K 40 31

+ 12 - 0
a1/tsp_problems/11/instance_2.txt

@@ -0,0 +1,12 @@
+11
+A 50 71
+B 20 55
+C 62 30
+D 53 86
+E 62 79
+F 43 99
+G 24 50
+H 42 76
+I 96 46
+J 51 91
+K 75 17

+ 12 - 0
a1/tsp_problems/11/instance_3.txt

@@ -0,0 +1,12 @@
+11
+A 70 8
+B 95 96
+C 42 99
+D 65 27
+E 49 85
+F 29 81
+G 49 62
+H 87 40
+I 83 94
+J 68 71
+K 44 40

+ 12 - 0
a1/tsp_problems/11/instance_4.txt

@@ -0,0 +1,12 @@
+11
+A 51 87
+B 99 24
+C 8 19
+D 10 83
+E 87 34
+F 79 64
+G 9 79
+H 10 65
+I 15 88
+J 96 76
+K 34 19

+ 12 - 0
a1/tsp_problems/11/instance_5.txt

@@ -0,0 +1,12 @@
+11
+A 54 24
+B 76 77
+C 96 73
+D 40 3
+E 28 60
+F 36 41
+G 96 50
+H 41 60
+I 2 74
+J 42 4
+K 21 28

+ 12 - 0
a1/tsp_problems/11/instance_6.txt

@@ -0,0 +1,12 @@
+11
+A 24 43
+B 47 15
+C 85 17
+D 67 7
+E 49 66
+F 20 56
+G 87 50
+H 58 94
+I 31 24
+J 92 41
+K 14 98

+ 12 - 0
a1/tsp_problems/11/instance_7.txt

@@ -0,0 +1,12 @@
+11
+A 22 55
+B 23 14
+C 70 44
+D 85 30
+E 31 98
+F 16 84
+G 33 13
+H 62 6
+I 46 28
+J 45 14
+K 84 31

+ 12 - 0
a1/tsp_problems/11/instance_8.txt

@@ -0,0 +1,12 @@
+11
+A 70 49
+B 79 68
+C 52 80
+D 68 5
+E 35 76
+F 94 8
+G 74 71
+H 25 14
+I 66 16
+J 14 10
+K 8 54

+ 12 - 0
a1/tsp_problems/11/instance_9.txt

@@ -0,0 +1,12 @@
+11
+A 78 17
+B 25 24
+C 96 9
+D 49 7
+E 8 12
+F 18 55
+G 84 38
+H 93 51
+I 2 38
+J 56 23
+K 78 57

+ 13 - 0
a1/tsp_problems/12/instance_1.txt

@@ -0,0 +1,13 @@
+12
+A 95 10
+B 70 2
+C 71 25
+D 42 51
+E 84 7
+F 87 39
+G 79 45
+H 85 74
+I 93 58
+J 21 72
+K 99 20
+L 57 97

+ 13 - 0
a1/tsp_problems/12/instance_10.txt

@@ -0,0 +1,13 @@
+12
+A 61 72
+B 53 60
+C 22 4
+D 32 38
+E 1 92
+F 54 43
+G 97 54
+H 19 39
+I 70 62
+J 34 69
+K 10 72
+L 66 90

+ 13 - 0
a1/tsp_problems/12/instance_2.txt

@@ -0,0 +1,13 @@
+12
+A 50 30
+B 3 3
+C 20 20
+D 3 73
+E 77 11
+F 6 52
+G 63 94
+H 3 56
+I 63 4
+J 4 74
+K 64 24
+L 49 67

+ 13 - 0
a1/tsp_problems/12/instance_3.txt

@@ -0,0 +1,13 @@
+12
+A 37 27
+B 96 35
+C 90 17
+D 85 31
+E 38 51
+F 9 57
+G 74 18
+H 58 52
+I 49 13
+J 57 50
+K 20 43
+L 85 18

+ 13 - 0
a1/tsp_problems/12/instance_4.txt

@@ -0,0 +1,13 @@
+12
+A 53 92
+B 30 37
+C 94 57
+D 57 43
+E 83 8
+F 55 64
+G 53 38
+H 37 11
+I 47 89
+J 74 90
+K 51 4
+L 89 21

+ 13 - 0
a1/tsp_problems/12/instance_5.txt

@@ -0,0 +1,13 @@
+12
+A 17 55
+B 33 92
+C 22 14
+D 17 95
+E 6 47
+F 25 46
+G 42 43
+H 7 52
+I 54 48
+J 97 69
+K 11 82
+L 75 4

+ 13 - 0
a1/tsp_problems/12/instance_6.txt

@@ -0,0 +1,13 @@
+12
+A 22 95
+B 46 63
+C 93 87
+D 72 36
+E 42 21
+F 63 80
+G 95 1
+H 65 80
+I 49 74
+J 60 36
+K 42 13
+L 20 36

+ 13 - 0
a1/tsp_problems/12/instance_7.txt

@@ -0,0 +1,13 @@
+12
+A 61 42
+B 70 67
+C 67 61
+D 23 81
+E 92 82
+F 9 76
+G 44 92
+H 59 21
+I 41 19
+J 90 43
+K 25 99
+L 8 1

+ 13 - 0
a1/tsp_problems/12/instance_8.txt

@@ -0,0 +1,13 @@
+12
+A 10 85
+B 18 36
+C 67 46
+D 63 2
+E 34 46
+F 52 78
+G 86 52
+H 81 36
+I 23 1
+J 67 93
+K 74 20
+L 47 85

+ 13 - 0
a1/tsp_problems/12/instance_9.txt

@@ -0,0 +1,13 @@
+12
+A 42 90
+B 76 4
+C 63 93
+D 30 67
+E 62 91
+F 87 84
+G 81 14
+H 4 32
+I 76 68
+J 36 64
+K 2 35
+L 62 16

+ 14 - 0
a1/tsp_problems/13/instance_1.txt

@@ -0,0 +1,14 @@
+13
+A 40 84
+B 86 17
+C 16 72
+D 74 3
+E 79 14
+F 93 76
+G 28 41
+H 50 74
+I 86 63
+J 18 12
+K 87 7
+L 35 10
+M 33 24

+ 14 - 0
a1/tsp_problems/13/instance_10.txt

@@ -0,0 +1,14 @@
+13
+A 13 53
+B 94 50
+C 2 74
+D 78 80
+E 97 33
+F 58 29
+G 86 33
+H 69 67
+I 94 5
+J 62 53
+K 72 74
+L 88 33
+M 92 5

+ 14 - 0
a1/tsp_problems/13/instance_2.txt

@@ -0,0 +1,14 @@
+13
+A 62 55
+B 54 60
+C 37 69
+D 64 7
+E 65 45
+F 53 12
+G 22 70
+H 23 83
+I 87 43
+J 12 72
+K 3 96
+L 99 58
+M 92 30

+ 14 - 0
a1/tsp_problems/13/instance_3.txt

@@ -0,0 +1,14 @@
+13
+A 28 79
+B 37 1
+C 10 14
+D 32 97
+E 53 32
+F 14 21
+G 9 97
+H 69 4
+I 51 85
+J 73 41
+K 41 61
+L 38 29
+M 88 88

+ 14 - 0
a1/tsp_problems/13/instance_4.txt

@@ -0,0 +1,14 @@
+13
+A 46 16
+B 26 44
+C 54 80
+D 37 80
+E 82 22
+F 50 28
+G 84 67
+H 9 90
+I 46 80
+J 2 41
+K 36 79
+L 49 35
+M 64 37

+ 14 - 0
a1/tsp_problems/13/instance_5.txt

@@ -0,0 +1,14 @@
+13
+A 48 93
+B 83 88
+C 14 25
+D 25 11
+E 1 68
+F 18 95
+G 3 74
+H 58 42
+I 50 30
+J 11 83
+K 69 16
+L 17 83
+M 41 44

+ 14 - 0
a1/tsp_problems/13/instance_6.txt

@@ -0,0 +1,14 @@
+13
+A 67 6
+B 5 17
+C 20 46
+D 58 71
+E 64 12
+F 77 87
+G 27 17
+H 77 86
+I 95 77
+J 43 85
+K 53 4
+L 54 11
+M 64 15

+ 14 - 0
a1/tsp_problems/13/instance_7.txt

@@ -0,0 +1,14 @@
+13
+A 76 73
+B 28 9
+C 21 87
+D 62 39
+E 56 94
+F 16 13
+G 6 57
+H 59 81
+I 68 19
+J 53 63
+K 92 25
+L 35 80
+M 34 29

+ 14 - 0
a1/tsp_problems/13/instance_8.txt

@@ -0,0 +1,14 @@
+13
+A 94 16
+B 28 10
+C 35 88
+D 67 59
+E 23 65
+F 48 44
+G 46 76
+H 5 63
+I 30 39
+J 17 97
+K 59 47
+L 99 17
+M 93 30

+ 14 - 0
a1/tsp_problems/13/instance_9.txt

@@ -0,0 +1,14 @@
+13
+A 95 48
+B 15 64
+C 98 62
+D 84 86
+E 48 83
+F 49 15
+G 94 45
+H 89 13
+I 58 29
+J 15 31
+K 53 67
+L 30 4
+M 20 20

+ 15 - 0
a1/tsp_problems/14/instance_1.txt

@@ -0,0 +1,15 @@
+14
+A 33 26
+B 33 16
+C 65 7
+D 75 30
+E 91 88
+F 37 13
+G 64 89
+H 7 79
+I 1 89
+J 11 70
+K 62 74
+L 65 74
+M 15 31
+N 24 91

+ 15 - 0
a1/tsp_problems/14/instance_10.txt

@@ -0,0 +1,15 @@
+14
+A 37 36
+B 67 6
+C 90 71
+D 40 71
+E 49 53
+F 90 38
+G 3 34
+H 27 15
+I 20 8
+J 81 40
+K 85 3
+L 59 63
+M 74 44
+N 99 37

+ 15 - 0
a1/tsp_problems/14/instance_2.txt

@@ -0,0 +1,15 @@
+14
+A 92 92
+B 1 65
+C 27 67
+D 53 84
+E 92 19
+F 95 35
+G 57 5
+H 77 89
+I 4 13
+J 90 34
+K 31 63
+L 7 16
+M 64 9
+N 94 72

+ 15 - 0
a1/tsp_problems/14/instance_3.txt

@@ -0,0 +1,15 @@
+14
+A 53 79
+B 5 63
+C 51 78
+D 12 86
+E 77 41
+F 22 1
+G 83 52
+H 89 8
+I 93 66
+J 60 3
+K 30 94
+L 4 34
+M 4 88
+N 18 66

+ 15 - 0
a1/tsp_problems/14/instance_4.txt

@@ -0,0 +1,15 @@
+14
+A 30 50
+B 10 55
+C 64 68
+D 25 46
+E 28 8
+F 23 58
+G 55 37
+H 80 7
+I 12 3
+J 53 63
+K 82 43
+L 10 70
+M 91 52
+N 82 48

+ 15 - 0
a1/tsp_problems/14/instance_5.txt

@@ -0,0 +1,15 @@
+14
+A 25 44
+B 25 6
+C 43 86
+D 2 30
+E 8 18
+F 62 40
+G 76 94
+H 54 94
+I 69 26
+J 55 49
+K 60 18
+L 71 5
+M 13 81
+N 93 26

+ 15 - 0
a1/tsp_problems/14/instance_6.txt

@@ -0,0 +1,15 @@
+14
+A 87 93
+B 54 69
+C 37 29
+D 8 74
+E 22 46
+F 28 72
+G 31 21
+H 89 74
+I 16 50
+J 3 4
+K 22 41
+L 86 45
+M 15 31
+N 70 32

+ 15 - 0
a1/tsp_problems/14/instance_7.txt

@@ -0,0 +1,15 @@
+14
+A 25 83
+B 84 62
+C 37 74
+D 17 48
+E 41 39
+F 35 18
+G 54 96
+H 12 24
+I 41 29
+J 71 49
+K 17 88
+L 70 82
+M 16 40
+N 91 54

+ 15 - 0
a1/tsp_problems/14/instance_8.txt

@@ -0,0 +1,15 @@
+14
+A 12 13
+B 73 34
+C 57 68
+D 67 70
+E 61 51
+F 46 58
+G 69 89
+H 16 81
+I 92 47
+J 5 17
+K 26 63
+L 64 83
+M 93 30
+N 91 4

+ 15 - 0
a1/tsp_problems/14/instance_9.txt

@@ -0,0 +1,15 @@
+14
+A 47 37
+B 74 52
+C 61 94
+D 39 54
+E 11 45
+F 65 86
+G 77 18
+H 19 74
+I 62 80
+J 44 50
+K 45 55
+L 49 90
+M 53 54
+N 84 69

+ 16 - 0
a1/tsp_problems/15/instance_1.txt

@@ -0,0 +1,16 @@
+15
+A 62 27
+B 75 34
+C 14 20
+D 54 65
+E 99 90
+F 96 40
+G 69 9
+H 98 51
+I 74 18
+J 17 4
+K 52 42
+L 83 25
+M 61 19
+N 34 9
+O 22 33

+ 16 - 0
a1/tsp_problems/15/instance_10.txt

@@ -0,0 +1,16 @@
+15
+A 38 23
+B 6 87
+C 86 72
+D 88 52
+E 56 95
+F 21 28
+G 46 4
+H 15 60
+I 61 32
+J 68 96
+K 72 9
+L 48 87
+M 58 91
+N 5 23
+O 82 80

+ 16 - 0
a1/tsp_problems/15/instance_2.txt

@@ -0,0 +1,16 @@
+15
+A 98 24
+B 18 72
+C 79 84
+D 54 64
+E 29 61
+F 2 88
+G 24 91
+H 92 54
+I 71 54
+J 66 59
+K 61 78
+L 83 7
+M 45 96
+N 93 84
+O 92 78

+ 16 - 0
a1/tsp_problems/15/instance_3.txt

@@ -0,0 +1,16 @@
+15
+A 61 32
+B 51 45
+C 92 49
+D 54 31
+E 63 81
+F 83 73
+G 19 36
+H 65 18
+I 20 66
+J 83 63
+K 73 75
+L 2 48
+M 7 43
+N 36 45
+O 16 19

+ 16 - 0
a1/tsp_problems/15/instance_4.txt

@@ -0,0 +1,16 @@
+15
+A 76 76
+B 10 23
+C 74 74
+D 27 98
+E 10 49
+F 4 71
+G 46 12
+H 23 59
+I 20 35
+J 18 31
+K 96 39
+L 84 32
+M 71 18
+N 75 11
+O 38 70

+ 16 - 0
a1/tsp_problems/15/instance_5.txt

@@ -0,0 +1,16 @@
+15
+A 56 8
+B 11 86
+C 35 80
+D 2 40
+E 59 6
+F 76 6
+G 92 4
+H 50 20
+I 29 72
+J 39 15
+K 53 53
+L 93 27
+M 42 48
+N 45 78
+O 99 86

+ 16 - 0
a1/tsp_problems/15/instance_6.txt

@@ -0,0 +1,16 @@
+15
+A 60 6
+B 21 15
+C 94 42
+D 72 24
+E 40 35
+F 17 65
+G 51 86
+H 75 18
+I 22 20
+J 24 61
+K 76 8
+L 90 61
+M 73 63
+N 93 43
+O 65 93

+ 16 - 0
a1/tsp_problems/15/instance_7.txt

@@ -0,0 +1,16 @@
+15
+A 22 33
+B 12 79
+C 31 9
+D 95 64
+E 5 61
+F 96 49
+G 30 92
+H 20 70
+I 81 44
+J 73 20
+K 75 79
+L 72 66
+M 24 93
+N 98 2
+O 3 50

+ 16 - 0
a1/tsp_problems/15/instance_8.txt

@@ -0,0 +1,16 @@
+15
+A 6 58
+B 48 53
+C 67 30
+D 31 26
+E 55 99
+F 82 64
+G 59 37
+H 71 83
+I 95 96
+J 89 11
+K 85 22
+L 83 77
+M 24 82
+N 94 34
+O 62 38

+ 16 - 0
a1/tsp_problems/15/instance_9.txt

@@ -0,0 +1,16 @@
+15
+A 46 96
+B 94 78
+C 9 12
+D 98 93
+E 2 81
+F 49 92
+G 57 98
+H 58 76
+I 90 91
+J 40 65
+K 82 58
+L 73 38
+M 90 49
+N 23 85
+O 45 70

+ 17 - 0
a1/tsp_problems/16/instance_1.txt

@@ -0,0 +1,17 @@
+16
+A 14 82
+B 90 67
+C 21 69
+D 42 29
+E 69 28
+F 62 19
+G 56 1
+H 19 13
+I 53 9
+J 82 11
+K 29 44
+L 42 77
+M 6 44
+N 54 60
+O 46 40
+P 87 99

+ 17 - 0
a1/tsp_problems/16/instance_10.txt

@@ -0,0 +1,17 @@
+16
+A 93 48
+B 67 72
+C 66 44
+D 99 65
+E 18 90
+F 47 17
+G 84 8
+H 16 67
+I 9 57
+J 76 28
+K 72 69
+L 53 65
+M 91 26
+N 61 49
+O 26 56
+P 15 73

+ 17 - 0
a1/tsp_problems/16/instance_2.txt

@@ -0,0 +1,17 @@
+16
+A 37 3
+B 6 80
+C 48 60
+D 67 94
+E 24 4
+F 59 72
+G 11 72
+H 76 22
+I 12 10
+J 56 51
+K 92 70
+L 16 5
+M 19 60
+N 82 98
+O 3 59
+P 96 38

+ 17 - 0
a1/tsp_problems/16/instance_3.txt

@@ -0,0 +1,17 @@
+16
+A 97 96
+B 18 93
+C 38 59
+D 71 86
+E 13 19
+F 88 98
+G 98 88
+H 45 78
+I 79 30
+J 58 59
+K 60 28
+L 12 88
+M 12 61
+N 43 44
+O 66 87
+P 36 41

+ 17 - 0
a1/tsp_problems/16/instance_4.txt

@@ -0,0 +1,17 @@
+16
+A 87 61
+B 40 4
+C 29 39
+D 89 99
+E 72 10
+F 67 28
+G 83 12
+H 64 75
+I 74 11
+J 29 78
+K 32 46
+L 35 88
+M 17 38
+N 64 74
+O 8 26
+P 13 51

+ 17 - 0
a1/tsp_problems/16/instance_5.txt

@@ -0,0 +1,17 @@
+16
+A 42 68
+B 57 56
+C 11 66
+D 69 43
+E 87 1
+F 73 96
+G 4 19
+H 11 41
+I 36 19
+J 65 21
+K 85 11
+L 31 85
+M 85 88
+N 59 48
+O 80 99
+P 72 66

+ 17 - 0
a1/tsp_problems/16/instance_6.txt

@@ -0,0 +1,17 @@
+16
+A 65 56
+B 57 17
+C 38 22
+D 35 95
+E 19 36
+F 65 21
+G 88 14
+H 59 55
+I 80 91
+J 60 52
+K 26 64
+L 56 29
+M 52 50
+N 3 32
+O 1 69
+P 53 23

+ 17 - 0
a1/tsp_problems/16/instance_7.txt

@@ -0,0 +1,17 @@
+16
+A 37 18
+B 8 68
+C 77 92
+D 56 5
+E 1 87
+F 56 60
+G 13 46
+H 43 27
+I 13 12
+J 40 27
+K 12 95
+L 53 24
+M 95 60
+N 62 71
+O 38 53
+P 82 96

+ 17 - 0
a1/tsp_problems/16/instance_8.txt

@@ -0,0 +1,17 @@
+16
+A 17 16
+B 67 99
+C 10 87
+D 62 81
+E 28 93
+F 47 14
+G 86 44
+H 29 61
+I 59 6
+J 34 67
+K 58 18
+L 60 52
+M 60 64
+N 45 61
+O 1 17
+P 51 9

+ 17 - 0
a1/tsp_problems/16/instance_9.txt

@@ -0,0 +1,17 @@
+16
+A 68 79
+B 55 35
+C 46 78
+D 65 73
+E 28 78
+F 48 25
+G 45 80
+H 9 32
+I 66 38
+J 60 92
+K 43 38
+L 84 52
+M 23 44
+N 5 35
+O 80 55
+P 80 52

+ 3 - 0
a1/tsp_problems/2/instance_1.txt

@@ -0,0 +1,3 @@
+2
+A 13 59
+B 60 56

+ 3 - 0
a1/tsp_problems/2/instance_10.txt

@@ -0,0 +1,3 @@
+2
+A 73 70
+B 58 22

+ 3 - 0
a1/tsp_problems/2/instance_2.txt

@@ -0,0 +1,3 @@
+2
+A 18 51
+B 51 18

+ 3 - 0
a1/tsp_problems/2/instance_3.txt

@@ -0,0 +1,3 @@
+2
+A 54 80
+B 23 26

+ 3 - 0
a1/tsp_problems/2/instance_4.txt

@@ -0,0 +1,3 @@
+2
+A 53 26
+B 71 95

+ 3 - 0
a1/tsp_problems/2/instance_5.txt

@@ -0,0 +1,3 @@
+2
+A 41 32
+B 62 34

+ 3 - 0
a1/tsp_problems/2/instance_6.txt

@@ -0,0 +1,3 @@
+2
+A 11 63
+B 41 50

+ 3 - 0
a1/tsp_problems/2/instance_7.txt

@@ -0,0 +1,3 @@
+2
+A 35 97
+B 12 26

+ 3 - 0
a1/tsp_problems/2/instance_8.txt

@@ -0,0 +1,3 @@
+2
+A 79 17
+B 59 77

+ 3 - 0
a1/tsp_problems/2/instance_9.txt

@@ -0,0 +1,3 @@
+2
+A 63 60
+B 46 56

+ 4 - 0
a1/tsp_problems/3/instance_1.txt

@@ -0,0 +1,4 @@
+3
+A 52 65
+B 60 14
+C 56 41

+ 4 - 0
a1/tsp_problems/3/instance_10.txt

@@ -0,0 +1,4 @@
+3
+A 16 39
+B 28 44
+C 47 85

+ 4 - 0
a1/tsp_problems/3/instance_2.txt

@@ -0,0 +1,4 @@
+3
+A 36 93
+B 80 43
+C 76 5

+ 4 - 0
a1/tsp_problems/3/instance_3.txt

@@ -0,0 +1,4 @@
+3
+A 98 17
+B 7 42
+C 21 17

+ 4 - 0
a1/tsp_problems/3/instance_4.txt

@@ -0,0 +1,4 @@
+3
+A 69 77
+B 23 81
+C 58 34

Some files were not shown because too many files changed in this diff