2012-05-29 4 views
0

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

например

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

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

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

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

+0

Может ли проблема свести к проблеме нахождения [минимального связующего дерева] (http://en.wikipedia.org/wiki/Minimum_spanning_tree) в связанном графе? – Andreas

ответ

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] 

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

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