import copy
import time
def swap(X, i, j):
X1 = copy.deepcopy(X)
X1[i], X1[j] = X1[j], X1[i]
return X1
def is_better(r0, r1, r):
if r == True:
if r0 < r1:
return True
else:
return False
else:
if r0 > r1:
return True
else:
return False
# X是需要进行2_opt的可行解序列
# f是价值函数(评判X的标准),c是评判X是否可行的标准(True为可行解),e用来判定X[i]和X[j]是否等价(等价则直接跳过),r为目标(True为越大越好)
# 复杂度很大,至少为O(n3)
def two_opt(X, f, c, e, r, time_limit, **kwargs):
X_best = copy.deepcopy(X)
r_best = f(X, **kwargs)
flag = True
loop = 0
loop_yn = 0
t0 = time.perf_counter()
while flag == True:
flag = False
for i in range(len(X_best) - 1):
for j in range(i+1, len(X_best)):
if e(X_best[i], X_best[j]):
continue
X1 = swap(X_best, i, j)
if not c(X1):
continue
r1 = f(X1, **kwargs)
if is_better(r_best, r1, r):
X_best = X1
r_best = r1
flag = True
loop_yn += 1
break
loop += 1
if loop%10 == 0:
print("times of swap:", loop, "r_best:", r_best, "r1:", r1)
if time.perf_counter() - t0 > time_limit:
print("time_out")
return X_best
if r_best == 1:
print("find the best")
return X_best
if flag == True:
break
# print("times of swap:", loop)
# print("times of swap_yn:", loop_yn)
return X_best
if __name__ == '__main__':
X = [1,2,3,4,5]
def f(X):
return X[0]+X[1]
def c(X):
return True
def e(x,y):
if x == y:
return True
return False
X1 = two_opt(X, f, c, e, True, 100)
print(X1)