程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

Moead implementation, decomposition based multi-objective evolution, Chebyshev method - (Python complete code)

編輯:Python

Determine a point near a point

answer : Each solution corresponds to a set of weights , That is, the sub problem , Four dots near the red dot , That is, how can its neighbors be sure ? Determined by weight , At the initialization stage of the algorithm, the neighbors corresponding to each weight are determined , That is, the neighbor subproblem of each subproblem . Weighted neighbors are judged by Euclidean distance . Take the nearest few .

Take the uniform distribution vector

https://www.cnblogs.com/Twobox/p/16408751.html

MOEAD Realization

Algorithm understanding and process

https://www.zhihu.com/question/263555181?sort=created
Two of the answers were very good
1. Input N m
# N Indicates the point density m Represents the problem dimension
1.1 Input T
# Means to take the nearest T As neighbors
2. Generate uniformly distributed weight vector
2.1 Calculate the Euler distance between each weight vector
3. The number of weight vectors is : Number of initial population
4. Initial population , Each individual corresponds to the weight one by one
4.1 More weighted distance , Take before T As neighbors person
5. EP = empty
# Maintain the best frontier
6. Calculate the initial global optimum Z
# Bring each into f1 f2 in , Minimum value z1 z2
7. Start the cycle N generation
7.1 For each individual , Select... In the field 2 Individuals cross mutate , get 2 A new individual
7.1.1 Update global solution z
7.2 Select randomly in the field 2 Individuals , Compare the new with the old
# The new individual brings in the sub goal problem , Direct comparison value is enough
7.3 If it's better , Replace the old individual dna
7.4 to update EP
# If there is a new solution not received , Combine the new solution with EP Compare each one , Delete the , If the new solution is not dominated by the old solution , Then join in EP

Code implementation design

# analysis 
Data structures to be maintained :
The most recent T Neighbors : Consider using an object list
Uniformly distributed weight vector : A two-dimensional ndarray The array can be
The weight vector corresponds to the individual : Individual objects , Directly save the weight vector array
Distance matrix between weight vectors : Start initialization , constant
EP list, The individual inside is the reference of the object
z list
Set of objective functions ,F list domain list # Interface design
class Person
attribute:
dns: A one-dimensional ndarray
weight_vector: A one-dimensional ndarray
neighbor: list<Person>
o_func:Objective_Function Objective function
function:
mutation
cross_get_two_new_dna: return 2 Duan Xin dna
compare# Compare with the offspring
accept_new_dna
choice_two_person:p1,p2

class Moead_Util
attribute:
N
M
T:
o_func:Objective_Function
pm: Mutation probability EP:[dna1,dna2,..]
weight_vectors: Two dimensional array
Euler_distance: Two dimensional array
pip_size
Z:[] # The elements here are one-dimensional ndarray Array , namely dna, Immediate solution function:
init_mean_vector: Two dimensional array
init_Euler_distance: Two dimensional array
init_population:[]
init_Z: One dimensional genus pig update_ep
update_Z class Objective_Function:
attribute:
F:[]
domain:[[0,1],[],[]]
function:
get_one_function:Objective_Function

Person.py

 1 import numpy as np
2
3
4 class Person:
5 def __init__(self, dna):
6 self.dna = dna
7 self.weight_vector = None
8 self.neighbor = None
9 self.o_func = None # Objective function
10
11 self.dns_len = len(dna)
12
13 def set_info(self, weight_vector, neighbor, o_func):
14 self.weight_vector = weight_vector
15 self.neighbor = neighbor
16 self.o_func = o_func# Objective function
17
18 def mutation_dna(self, one_dna):
19 i = np.random.randint(0, self.dns_len)
20 low = self.o_func.domain[i][0]
21 high = self.o_func.domain[i][1]
22 new_v = np.random.rand() * (high - low) + low
23 one_dna[i] = new_v
24 return one_dna
25
26 def mutation(self):
27 i = np.random.randint(0, self.dns_len)
28 low = self.o_func.domain[i][0]
29 high = self.o_func.domain[i][1]
30 new_v = np.random.rand() * (high - low) + low
31 self.dna[i] = new_v
32
33 @staticmethod
34 def cross_get_two_new_dna(p1, p2):
35 # A single point of intersection
36 cut_i = np.random.randint(1, p1.dns_len - 1)
37 dna1 = p1.dna.copy()
38 dna2 = p2.dna.copy()
39 temp = dna1[cut_i:].copy()
40 dna1[cut_i:] = dna2[cut_i:]
41 dna2[cut_i:] = temp
42 return dna1, dna2
43
44 def compare(self, son_dna):
45 F = self.o_func.f_funcs
46 f_x_son_dna = []
47 f_x_self = []
48 for f in F:
49 f_x_son_dna.append(f(son_dna))
50 f_x_self.append(f(self.dna))
51 fit_son_dna = np.array(f_x_son_dna) * self.weight_vector
52 fit_self = np.array(f_x_self) * self.weight_vector
53 return fit_son_dna.sum() - fit_self.sum()
54
55 def accept_new_dna(self, new_dna):
56 self.dna = new_dna
57
58 def choice_two_person(self):
59 neighbor = self.neighbor
60 neighbor_len = len(neighbor)
61 idx = np.random.randint(0, neighbor_len, size=2)
62 p1 = self.neighbor[idx[0]]
63 p2 = self.neighbor[idx[1]]
64 return p1, p2

Objective_Function

 1 from collections import defaultdict
2
3 import numpy as np
4
5
6 def zdt4_f1(x_list):
7 return x_list[0]
8
9
10 def zdt4_gx(x_list):
11 sum = 1 + 10 * (10 - 1)
12 for i in range(1, 10):
13 sum += x_list[i] ** 2 - 10 * np.cos(4 * np.pi * x_list[i])
14 return sum
15
16
17 def zdt4_f2(x_list):
18 gx_ans = zdt4_gx(x_list)
19 if x_list[0] < 0:
20 print("????: x_list[0] < 0:", x_list[0])
21 if gx_ans < 0:
22 print("gx_ans < 0", gx_ans)
23 if (x_list[0] / gx_ans) <= 0:
24 print("x_list[0] / gx_ans<0:", x_list[0] / gx_ans)
25
26 ans = 1 - np.sqrt(x_list[0] / gx_ans)
27 return ans
28
29 def zdt3_f1(x):
30 return x[0]
31
32
33 def zdt3_gx(x):
34 if x[:].sum() < 0:
35 print(x[1:].sum(), x[1:])
36 ans = 1 + 9 / 29 * x[1:].sum()
37 return ans
38
39
40 def zdt3_f2(x):
41 g = zdt3_gx(x)
42 ans = 1 - np.sqrt(x[0] / g) - (x[0] / g) * np.sin(10 * np.pi * x[0])
43 return ans
44
45
46 class Objective_Function:
47 function_dic = defaultdict(lambda: None)
48
49 def __init__(self, f_funcs, domain):
50 self.f_funcs = f_funcs
51 self.domain = domain
52
53 @staticmethod
54 def get_one_function(name):
55 if Objective_Function.function_dic[name] is not None:
56 return Objective_Function.function_dic[name]
57
58 if name == "zdt4":
59 f_funcs = [zdt4_f1, zdt4_f2]
60 domain = [[0, 1]]
61 for i in range(9):
62 domain.append([-5, 5])
63 Objective_Function.function_dic[name] = Objective_Function(f_funcs, domain)
64 return Objective_Function.function_dic[name]
65
66 if name == "zdt3":
67 f_funcs = [zdt3_f1, zdt3_f2]
68 domain = [[0, 1] for i in range(30)]
69 Objective_Function.function_dic[name] = Objective_Function(f_funcs, domain)
70 return Objective_Function.function_dic[name]

Moead_Util.py

 1 import numpy as np
2
3 from GA.MOEAD.Person import Person
4
5
6 def distribution_number(sum, m):
7 # take m Number , The sum of numbers is N
8 if m == 1:
9 return [[sum]]
10 vectors = []
11 for i in range(1, sum - (m - 1) + 1):
12 right_vec = distribution_number(sum - i, m - 1)
13 a = [i]
14 for item in right_vec:
15 vectors.append(a + item)
16 return vectors
17
18
19 class Moead_Util:
20 def __init__(self, N, m, T, o_func, pm):
21 self.N = N
22 self.m = m
23 self.T = T # Neighbor size limit
24 self.o_func = o_func
25 self.pm = pm # Mutation probability
26
27 self.Z = np.zeros(shape=m)
28
29 self.EP = [] # the front
30 self.EP_fx = [] # ep The corresponding target value
31 self.weight_vectors = None # Uniform weight vector
32 self.Euler_distance = None # Euler distance matrix
33 self.pip_size = -1
34
35 self.pop = None
36 # self.pop_dna = None
37
38 def init_mean_vector(self):
39 vectors = distribution_number(self.N + self.m, self.m)
40 vectors = (np.array(vectors) - 1) / self.N
41 self.weight_vectors = vectors
42 self.pip_size = len(vectors)
43 return vectors
44
45 def init_Euler_distance(self):
46 vectors = self.weight_vectors
47 v_len = len(vectors)
48
49 Euler_distance = np.zeros((v_len, v_len))
50 for i in range(v_len):
51 for j in range(v_len):
52 distance = ((vectors[i] - vectors[j]) ** 2).sum()
53 Euler_distance[i][j] = distance
54
55 self.Euler_distance = Euler_distance
56 return Euler_distance
57
58 def init_population(self):
59 pop_size = self.pip_size
60 dna_len = len(self.o_func.domain)
61 pop = []
62 pop_dna = np.random.random(size=(pop_size, dna_len))
63 # Of the original individual dna
64 for i in range(pop_size):
65 pop.append(Person(pop_dna[i]))
66
67 # Of the original individual weight_vector, neighbor, o_func
68 for i in range(pop_size):
69 # weight_vector, neighbor, o_func
70 person = pop[i]
71 distance = self.Euler_distance[i]
72 sort_arg = np.argsort(distance)
73 weight_vector = self.weight_vectors[i]
74 # neighbor = pop[sort_arg][:self.T]
75 neighbor = []
76 for i in range(self.T):
77 neighbor.append(pop[sort_arg[i]])
78
79 o_func = self.o_func
80 person.set_info(weight_vector, neighbor, o_func)
81 self.pop = pop
82 # self.pop_dna = pop_dna
83
84 return pop
85
86 def init_Z(self):
87 Z = np.full(shape=self.m, fill_value=float("inf"))
88 for person in self.pop:
89 for i in range(len(self.o_func.f_funcs)):
90 f = self.o_func.f_funcs[i]
91 # f_x_i: An individual , In the i Value on target
92 f_x_i = f(person.dna)
93 if f_x_i < Z[i]:
94 Z[i] = f_x_i
95
96 self.Z = Z
97
98 def get_fx(self, dna):
99 fx = []
100 for f in self.o_func.f_funcs:
101 fx.append(f(dna))
102 return fx
103
104 def update_ep(self, new_dna):
105 # Combine the new solution with EP Compare each one , Delete the
106 # If the new solution is not dominated by the old solution , The retention
107 new_dna_fx = self.get_fx(new_dna)
108 accept_new = True # Whether to add the new solution to EP
109 # print(f" Ready to start the cycle : EP length {len(self.EP)}")
110 for i in range(len(self.EP) - 1, -1, -1): # Go back and forth
111 old_ep_item = self.EP[i]
112 old_fx = self.EP_fx[i]
113 # old_fx = self.get_fx(old_ep_item)
114 a_b = True # The old ruling line
115 b_a = True # The new rules the old
116 for j in range(len(self.o_func.f_funcs)):
117 if old_fx[j] < new_dna_fx[j]:
118 b_a = False
119 if old_fx[j] > new_dna_fx[j]:
120 a_b = False
121 # T T : fx equal Do not change directly EP
122 # T F : The old rules the new Stay old , Never new , End of cycle .
123 # F T : The new rules the old Stay new , Don't be so old , Continue to cycle
124 # F F : Non dominant relationship Do not operate , Cycle to the next
125 # TF Why end the loop ,FT Why continue the cycle , You can think about
126 if a_b:
127 accept_new = False
128 break
129 if not a_b and b_a:
130 if len(self.EP) <= i:
131 print(len(self.EP), i)
132 del self.EP[i]
133 del self.EP_fx[i]
134 continue
135
136 if accept_new:
137 self.EP.append(new_dna)
138 self.EP_fx.append(new_dna_fx)
139 return self.EP, self.EP_fx
140
141 def update_Z(self, new_dna):
142 new_dna_fx = self.get_fx(new_dna)
143 Z = self.Z
144 for i in range(len(self.o_func.f_funcs)):
145 if new_dna_fx[i] < Z[i]:
146 Z[i] = new_dna_fx[i]
147 return Z

Realization .py

import random
import numpy as np
from GA.MOEAD.Moead_Util import Moead_Util
from GA.MOEAD.Objective_Function import Objective_Function
from GA.MOEAD.Person import Person import matplotlib.pyplot as plt def draw(x, y):
plt.scatter(x, y, s=10, c="grey") # s Size of points c The color of the point alpha transparency
plt.show() iterations = 1000 # The number of iterations
N = 400
m = 2
T = 40
o_func = Objective_Function.get_one_function("zdt3")
pm = 0.5 moead = Moead_Util(N, m, T, o_func, pm) moead.init_mean_vector()
moead.init_Euler_distance()
pop = moead.init_population()
moead.init_Z() for i in range(iterations):
print(i, len(moead.EP))
for person in pop:
p1, p2 = person.choice_two_person()
d1, d2 = Person.cross_get_two_new_dna(p1, p2) if np.random.rand() < pm:
p1.mutation_dna(d1)
if np.random.rand() < pm:
p1.mutation_dna(d2) moead.update_Z(d1)
moead.update_Z(d2)
t1, t2 = person.choice_two_person()
if t1.compare(d1) < 0:
t1.accept_new_dna(d1)
moead.update_ep(d1)
if t2.compare(d1) < 0:
t2.accept_new_dna(d2)
moead.update_ep(d1) # Output result drawing
EP_fx = np.array(moead.EP_fx) x = EP_fx[:, 0]
y = EP_fx[:, 1]
draw(x, y)

effect -ZDT4

The original author of this article : Xiangtan University - Wei Xiong , Reprint is prohibited without permission

MOEAD Realization 、 Multi-objective evolution based on decomposition 、 Chebyshev method -(python Complete code ) More articles about

  1. 【 Graduation project 】 be based on Android Home school interactive platform development ( Contains complete code and all documentation )—— I love you ( What do you care about , We just pushed )

    * Write it at the front I promised you to contribute all the documents after graduation defense , Now the defense is over ,LZ Keep your promise , Open source all the documents to GitHub( This address contains all the code and documentation as well as PPT, The outer layer is simple code ). I hope you like it , No ...

  2. AAAI2019 | Target detection based on domain decomposition and integration Interpretation of the thesis

    Object Detection based on Region Decomposition and Assembly AAAI2019 | Target detection based on domain decomposition and integration Interpretation of the thesis author | Wen Yongliang learn ...

  3. The evolution of target detection technology based on deep learning :R-CNN、Fast R-CNN,Faster R-CNN

    The evolution of target detection technology based on deep learning :R-CNN.Fast R-CNN,Faster R-CNN object detection I understand it , Is to find the exact location of the object in a given picture , And mark the category of the object .obj ...

  4. #Deep Learning review # Object detection based on deep learning ( Read the summary )

    Link to the original text :https://www.52ml.net/20287.html This blog mainly talks about the development of deep learning in target detection . The blog first introduces the process of traditional target detection algorithm : Traditional target detection generally uses the frame of sliding window , Lord ...

  5. Section 19 、 Target detection and recognition based on traditional image processing ( The word bag model BOW+SVM The attached code )

    In the last section . We've already introduced the use of HOG and SVM Achieve target detection and recognition , In this section we will introduce the use of bag of words model BOW and SVM Achieve target detection and recognition . One The bag of words introduces The word bag model (Bag-Of-Word) The concept of computer vision wasn't originally aimed at ...

  6. Open source project (9-0) review -- Target tracking based on deep learning sort And deep-sort

    Target tracking based on deep learning sort And deep-sort https://github.com/Ewenwan/MVision/tree/master/3D_Object_Detection/Object_ ...

  7. An efficient web search method based on hierarchical representation | ICLR 2018

    This paper proposes an efficient evolutionary algorithm based on hierarchical representation to search the structure of neural network , Build a powerful convolution structure by stacking layers . The paper search method is simple , From the experimental results , Achieve very good accuracy , Worth learning source :[ Xiaofei's algorithm Engineering Notes ] official account ...

  8. [ Xin'an Presentation] Based on the GPU Parallel computing MD5 Password decryption method

    -------------------paper--------------------- Based on the GPU Parallel computing MD5 Password decryption method 0.abstract1.md5 Description of algorithm 2.md5 Security Analysis 3. The base ...

  9. Based on the RBAC Improved method of dynamic access control of model

    The invention relates to a method based on RBAC Improved method of dynamic access control of model , It belongs to the field of access control . To the original RBAC The model improves the permissions and constraints , Specifically, the permissions are divided into static permissions and dynamic permissions , Static permissions are non workflow permissions , Dynamic permissions are ...

  10. be based on Delphi The implementation method of three-tier database system based on

    be based on Delphi The implementation method of three-tier database system based on   1  introduction In the current database application system , According to its structure, it can be divided into two categories , One is a two-tier database system , The other is multi tier database application system . The database application system of two-tier structure includes guest ...

Random recommendation

  1. 3.Java The foundation Date object

    Mr. Bi Xiangdong Java Basic study notes ——Date object Learning today Java Medium Date After the object , I feel that this object has the following main uses for us . 1. Get the time and date and display them in their own format . 2. Show time in website design .   know ...

  2. Bayes of classification algorithm (Bayes) classifier

    Abstract : Wang Jianyong of Tsinghua University data mining : Theory and algorithm Lesson , It's very detailed , Better a good memory than a bad pen , Record your learning content here , Convenient to review later .   One : Introduction to Bayesian classifier 1) Bayesian classifier is a kind of classifier based on statistics ...

  3. cannot import name &#39;_imaging&#39; And No module named PIL resolvent

    Today I will learn from Liao Xuefeng python Third-party module pillow chapter . Use it directly from PIL import Image Will be submitted to the "No module named PIL", Obviously this is not installed pi ...

  4. How to modify DEDECMS Article title length

    Method 1 :      First you have to go into dedecms backstage , System —— Basic parameters of the system —— The other options —— Maximum length of document title —— Change it here to 200 Or bigger ( Actually 200 It should be enough ). Method 2 :      Get into phpmyadm ...

  5. install vmware-tools error :Execution aborted!!!

    Environmental Science :VMware10+RedHat5( Virtualization components were selected for installation ). install vmware-tools The following error occurred during the process : This configuration program is to be exe ...

  6. collection and collections

    Han Meng Feisha   Han Yafei  [email protected]  yue31313  han_meng_fei_sha collection It's a collection . aggregate yes The superior interface of the collection class , such as set and l ...

  7. Lexical analyzer Lexer

    Lexical analysis In computer science, lexical analysis, lexing or tokenization is the process of converting a se ...

  8. perl Related knowledge

    turn :http://www.runoob.com/perl/perl-cgi-programming.html Perl yes Practical Extraction and Report Langua ...

  9. 【java】File Use : Write out the string to a local file , size 0kb Why

    Implementation method : Write a method for the time being , Write out the string to a local file , More methods can be added in the future : public static void main(String[] args) { /** * ============== ...

  10. ( turn ) Using parameter SQL_SLAVE_SKIP_COUNTER Handle mysql slave Synchronization error discussion

    Using parameter SQL_SLAVE_SKIP_COUNTER Handle mysql slave Synchronization error discussion Link address of this article :http://blog.chinaunix.net/uid-31396856-id-57532 ...


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved