Мутация для оптимизации сети трубопроводов

Я работаю над оптимизацией конвейерной сети и представляю хромосомы в виде строки чисел следующим образом.

пример

chromosome [1] = 3 4 7 2 8 9 6 5

где каждое число относится к скважине, а расстояние между скважинами определено. поскольку лунки не могут быть продублированы для одной хромосомы. Например

chromosome [1]' = 3 4 7 2 7 9 6 5 (not acceptable) 

какова лучшая мутация, которая может справиться с таким представлением? заранее спасибо.


person FSm    schedule 29.05.2012    source источник
comment
Можно ли свести задачу к задаче поиска минимального остовного дерева в связном графе?   -  person Andreas    schedule 31.05.2012


Ответы (1)


Не могу сказать «лучшая», но одна модель, которую я использовал для задач, подобных графу, такова: для каждого узла (номер лунки) вычислить набор смежных узлов/лунок из всей совокупности. например.,

population = [[1,2,3,4], [1,2,3,5], [1,2,3,6], [1,2,6,5], [1,2,6,7]]
adjacencies = { 
  1 : [2]         ,   #In the entire population, 1 is always only near 2
  2 : [1, 3, 6]   ,   #2 is adjacent to 1, 3, and 6 in various individuals
  3 : [2, 4, 5, 6],   #...etc...
  4 : [3]         ,
  5 : [3, 6]      , 
  6 : [3, 2, 5, 7],
  7 : [6]         
}
choose_from_subset = [1,2,3,4,5,6,7] #At first, entire population

Затем создайте нового человека/сеть:

 choose_next_individual(adjacencies, choose_from_subset) : 
   Sort adjacencies by the size of their associated sets
   From the choices in choose_from_subset, choose the well with the highest number of adjacent possibilities (e.g., either 3 or 6, both of which have 4 possibilities)
   If there is a tie (as there is with 3 and 6), choose among them randomly (let's say "3")
   Place the chosen well as the next element of the individual / network ([3])
   fewerAdjacencies = Remove the chosen well from the set of adjacencies (see below)
   new_choose_from_subset = adjacencies to your just-chosen well (i.e., 3 : [2,4,5,6])
   Recurse -- choose_next_individual(fewerAdjacencies, new_choose_from_subset)

Идея состоит в том, что узлы с большим числом смежностей созрели для рекомбинации (поскольку популяция не сошлась, например, 1->2), более низкое «счетчик смежности» (но ненулевое) подразумевает сходимость, а нулевой количество смежности - это (в основном) мутация.

Просто чтобы показать пример запуска ..

#Recurse: After removing "3" from the population
new_graph = [3]
new_choose_from_subset = [2,4,5,6] #from 3 : [2,4,5,6] 
adjacencies = { 
  1: [2]             
  2: [1, 6]      ,  
  4: []          ,
  5: [6]         , 
  6: [2, 5, 7]   ,
  7: [6]         
}


#Recurse: "6" has most adjacencies in new_choose_from_subset, so choose and remove
new_graph = [3, 6]
new_choose_from_subset = [2, 5,7]    
adjacencies = { 
  1: [2]             
  2: [1]         ,  
  4: []          ,
  5: []          , 
  7: []          
}


#Recurse: Amongst [2,5,7], 2 has the most adjacencies
new_graph = [3, 6, 2]
new_choose_from_subset = [1]
adjacencies = { 
  1: []              
  4: []          ,
  5: []          , 
  7: []          
]

#new_choose_from_subset contains only 1, so that's your next...
new_graph = [3,6,2,1]
new_choose_from_subset = []
adjacencies = {
  4: []          ,
  5: []          , 
  7: []          
]

#From here on out, you'd be choosing randomly between the rest, so you might end up with:
new_graph = [3, 6, 2, 1, 5, 7, 4] 

Санитарная проверка? 3->6 встречается в оригинале 1x, 6->2 встречается 2x, 2->1 встречается 5x, 1->5 появляется 0, 5->7 появляется 0, 7->4 появляется 0. Таким образом, вы сохранили наиболее распространенную смежность (2-> 1) и две другие «возможно важные» смежности. . В противном случае вы пробуете новые смежности в пространстве решений.

ОБНОВЛЕНИЕ: изначально я забыл о важном моменте, что при рекурсии вы выбираете наиболее подключенный к только что выбранному узлу. Это очень важно для сохранения сети фитнес-центров! Я обновил описание.

person Larry OBrien    schedule 29.05.2012