Advertisement
Guest User

Untitled

a guest
Mar 20th, 2018
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.94 KB | None | 0 0
  1. from random import sample
  2.  
  3.  
  4. class Item:
  5. def __init__(self, value, weight):
  6. self.value = value
  7. self.weight = weight
  8.  
  9.  
  10. class HillClimbingRucsac:
  11. def __init__(self, path):
  12. self.no_items = -1
  13. self.max_weight = -1
  14. self.items = []
  15. self.solution = []
  16. self.current_weight = 0
  17. self.current_value = 0
  18. self.read_data(path)
  19.  
  20. def read_data(self, path):
  21. file = open(path, "r")
  22. params = []
  23. for line in file:
  24. words = line.replace("\n", "").split(" ")
  25. params.append(int(words[0]))
  26. params.append(int(words[1]))
  27. file.close()
  28. self.no_items = params[0]
  29. self.max_weight = params[1]
  30.  
  31. i = 2
  32. while i < len(params):
  33. self.items.append(Item(params[i], params[i + 1]))
  34. i += 2
  35.  
  36. # initial solution
  37. self.solution = [0 for i in range(0, self.no_items)]
  38.  
  39. def run_hill_climbing(self):
  40. free_positions = []
  41. for i in range(0, self.no_items):
  42. if self.solution[i] == 0:
  43. free_positions.append(i)
  44.  
  45. while free_positions:
  46. position = sample(free_positions, 1)[0]
  47. free_positions.remove(position)
  48. new_sol = self.solution[:]
  49. new_sol[position] = 1
  50. value, weight = self.evaluate(new_sol)
  51. if value > self.current_value:
  52. self.current_value = value
  53. self.current_weight = weight
  54. self.solution = new_sol[:]
  55. print(self.current_value, self.current_weight, self.solution)
  56.  
  57. def evaluate(self, new_sol):
  58. w = 0
  59. v = 0
  60. for i in range(0, len(new_sol)):
  61. if new_sol[i] == 1:
  62. w += self.items[i].weight
  63. v += self.items[i].value
  64.  
  65. if w > self.max_weight:
  66. return -1, -1
  67. return v, w
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement