Имитация отжига для сопоставления строк с Python - PullRequest
0 голосов
/ 03 апреля 2020

У меня проблема с реализацией алгоритма сопоставления строк с SA. После того, как все итерации сделаны, я не подхожу даже ближе к желаемой строке! Я пытался уменьшить изменение температуры, но ничего не изменилось.

Мне кажется, что проблема в том, что p не уменьшается постоянно. Я думаю, что причина в том, что de меняется "случайно". Я прав? Если так, как это исправить?

Цель состоит в том, чтобы в конце счет достиг 0. Счет суммирует все расстояния между случайными буквами и фактическими. change_cur_solution меняет только одну случайную букву каждый раз.

def eval_current_sol(target,cur_sol): 
  dist = 0
  for i in range(len(target)): 
    c = cur_sol[i] 
    t = target[i] 
    dist += abs(ord(c) - ord(t)) 
  return dist 


t = 10000
# loop until match the target
it = 0
while True: 
    if t == 0:
       break
    print('Current best score ', bestScore, 'Solution', "".join(bestSol)) 

    if bestScore == 0: 
      break

    newSol = list(bestSol) 

    change_cur_solution(newSol)
    score = eval_current_sol(newSol,targetSol) 
    de =  score - bestScore

    if de < 0:                  ## score < bestScore i.e. (score of new solution < score of previous solution) ===> #better
        bestSol = newSol 
        bestScore = score
    else:
        r = random.random()
        try:
            p = math.exp(-(de / t))
        except:
            p = 0
        print("p is %f de is %d t is %d" %(p, de,t))
        if p > r:
            bestSol = newSol
            bestScore = score
    it += 1
    t -= 0.5

print('Found after, ',it, 'Iterations' ) 

Вот пример кода, работающего, когда t около 700

Here is a sample of the code running when t is about 700

Вот еще один пример выполнения в конце:

Here is another sample run at the end

Примечание: аналогичный код был выполнен при восхождении на холм и работал нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...