tabu search on example
This commit is contained in:
parent
abacac22f7
commit
76e424c837
71
main.py
Normal file
71
main.py
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
#/bin/python
|
||||||
|
|
||||||
|
# edges = [[None, 6, 9, 18, None],
|
||||||
|
# [6, None, 2, None, 8],
|
||||||
|
# [9, 2, None, 0, None],
|
||||||
|
# [18, None, 0, None, 12],
|
||||||
|
# [None, 8, None, 12, None]]
|
||||||
|
|
||||||
|
costs = {"x1":6, "x2":9, "x3":18, "x4":2, "x5":0, "x6":8, "x7":12}
|
||||||
|
solution = {"x1":1, "x2":0, "x3":0, "x4":1, "x5":1, "x6":1, "x7":0}
|
||||||
|
|
||||||
|
def check_constraint(solution):
|
||||||
|
penalty = 0
|
||||||
|
if solution["x1"] and not solution["x3"]:
|
||||||
|
penalty += 50
|
||||||
|
if solution["x1"] + solution["x2"] + solution["x6"] > 1:
|
||||||
|
penalty +=50
|
||||||
|
return penalty
|
||||||
|
|
||||||
|
def check_validity(solution):
|
||||||
|
return (sum(solution.values()) == 4) and not ((solution["x1"] and solution["x2"] and solution["x4"]) or (solution["x2"] and solution["x3"] and solution["x5"]) or (solution["x4"] and solution["x5"] and solution["x7"] and solution["x6"]) or (solution["x1"] and solution["x3"] and solution["x6"] and solution["x7"]) or (solution["x1"] and solution["x3"] and solution["x4"] and solution["x5"]))
|
||||||
|
|
||||||
|
def neighbors(solution):
|
||||||
|
neighbors = list()
|
||||||
|
dict_0 = {k: v for k, v in solution.items() if v == 0}
|
||||||
|
dict_1 = {k: v for k, v in solution.items() if v == 1}
|
||||||
|
for i in dict_0.keys():
|
||||||
|
for j in dict_1.keys():
|
||||||
|
copy = solution.copy()
|
||||||
|
copy[i]=1
|
||||||
|
copy[j]=0
|
||||||
|
neighbors.append(copy)
|
||||||
|
return neighbors
|
||||||
|
|
||||||
|
def calculate_cost(solution):
|
||||||
|
return check_constraint(solution) + sum(costs[key] for key in solution if solution[key] == 1)
|
||||||
|
|
||||||
|
def tabu_search(initial_solution, n_max):
|
||||||
|
solution = initial_solution
|
||||||
|
best = initial_solution
|
||||||
|
cost = calculate_cost(initial_solution)
|
||||||
|
cost_best = cost
|
||||||
|
tabu = [solution,]
|
||||||
|
n = 0
|
||||||
|
while n <= n_max:
|
||||||
|
neighbors_list = []
|
||||||
|
for s in neighbors(solution):
|
||||||
|
if check_validity(s) and s not in tabu:
|
||||||
|
neighbors_list.append((s, calculate_cost(s)))
|
||||||
|
new = min(neighbors_list, key=lambda x: x[1])
|
||||||
|
if cost - new[1] >= 0:
|
||||||
|
n = 0
|
||||||
|
solution = new[0]
|
||||||
|
cost = new[1]
|
||||||
|
if cost_best - new[1] >= 0:
|
||||||
|
best = new[0]
|
||||||
|
cost_best = new[1]
|
||||||
|
else:
|
||||||
|
solution = new[0]
|
||||||
|
cost = new[1]
|
||||||
|
n += 1
|
||||||
|
tabu.append(solution)
|
||||||
|
|
||||||
|
return (best, cost_best)
|
||||||
|
|
||||||
|
print("when not degrading the current solution:")
|
||||||
|
print(tabu_search(solution, 0))
|
||||||
|
print("tabu search accepting 1 degradation:")
|
||||||
|
print(tabu_search(solution, 1))
|
||||||
|
print("tabu search accepting 2 degradations:")
|
||||||
|
print(tabu_search(solution, 2))
|
Loading…
x
Reference in New Issue
Block a user