2023年8月1日发(作者:)
遗传算法解决0-1背包问题(python)可选择的物品有50件,其价值v和重量w分别为v={220,208,198,192,180,180,165,162,160,158,155,130,125122,120,118,115,110,105,101,100,100,98,96,95,90,88,82,80,77,75,73,72,70,69,66,65,63,60,58,56,50,30,20,15,10,8, 5,3,1}w={80,82,85,70,72,70,66,50,55,25,50,55,40,48,50,32,22,60,30,32,40,38,35,32,25,28,30,22,50,30,45,30,60,50,20,65,20,25,30,10,20,25, 15,10,10,10,4,4,2,1}求背包的总量不能超过1000,求解背包所能装下的最⼤的价值是多少?python代码如下:import numpy as npimport randomimport as plt##初始化,N为种群规模,n为染⾊体长度def init(N,n): C = [] for i in range(N): c = [] for j in range(n): a = t(0,2) (a) (c) return C##评估函数# x(i)取值为1表⽰被选中,取值为0表⽰未被选中# w(i)表⽰各个分量的重量,v(i)表⽰各个分量的价值,w表⽰最⼤承受重量def fitness(C,N,n,W,V,w): S = []##⽤于存储被选中的下标 F = []##
⽤于存放当前该个体的最⼤价值 for i in range(N): s = [] h = 0 #
重量 f = 0 #
价值 for j in range(n): if C[i][j]==1: if h+W[j]<=w: h=h+W[j] f = f+V[j] (j) (s) (f) return S,F##适应值函数,B位返回的种族的基因下标,y为返回的最⼤值def best_x(F,S,N): y = 0 x = 0 B = [0]*N for i in range(N): if y 计算⽐率def rate(x):def rate(x): p = [0] * len(x) s = 0 for i in x: s += i for i in range(len(x)): p[i] = x[i] / s return p## 选择def chose(p, X, m, n): X1 = X r = (m) for i in range(m): k = 0 for j in range(n): k = k + p[j] if r[i] <= k: X1[i] = X[j] break return X1##交配def match(X, m, n, p): r = (m) k = [0] * m for i in range(m): if r[i] < p: k[i] = 1 u = v = 0 k[0] = k[0] = 0 for i in range(m): if k[i]: if k[u] == 0: u = i elif k[v] == 0: v = i if k[u] and k[v]: # print(u,v) q = t(n - 1) # print(q) for i in range(q + 1, n): X[u][i], X[v][i] = X[v][i], X[u][i] k[u] = 0 k[v] = 0 return X##变异def vari(X, m, n, p): for i in range(m): for j in range(n): q = () if q < p: X[i][j] = t(0,2) return Xm = 8##规模N = 800 ##迭代次数Pc = 0.8 ##交配概率Pm = 0.05##变异概率V =[220,208,198,192,180,180,165,162,160,158,155,130,125,122,120,118,115,110,105,101,100,100,98,96,95,90,88,82,80,77,75,73,72,70,69,66,65,63,60,58,56,50,30,20,15,10,8,5,3,1]W =[80,82,85,70,72,70,66,50,55,25,50,55,40,48,50,32,22,60,30,32,40,38,35,32,25,28,30,22,25,30,45,30,60,50,20,65,20,25,30,10,20,25,15,10,10,10,4,4,2,1]n = len(W)##染⾊体长度n = len(W)##染⾊体长度w = 1000C = init(m, n)S,F = fitness(C,m,n,W,V,w)B ,y = best_x(F,S,m)Y =[y]for i in range(N): p = rate(F) C = chose(p, C, m, n) C = match(C, m, n, Pc) C = vari(C, m, n, Pm) S, F = fitness(C, m, n, W, V, w) B1, y1 = best_x(F, S, m) if y1 > y: y = y1 (y)print("最⼤值为:",y)(Y)()运⾏结果如下:
2023年8月1日发(作者:)
遗传算法解决0-1背包问题(python)可选择的物品有50件,其价值v和重量w分别为v={220,208,198,192,180,180,165,162,160,158,155,130,125122,120,118,115,110,105,101,100,100,98,96,95,90,88,82,80,77,75,73,72,70,69,66,65,63,60,58,56,50,30,20,15,10,8, 5,3,1}w={80,82,85,70,72,70,66,50,55,25,50,55,40,48,50,32,22,60,30,32,40,38,35,32,25,28,30,22,50,30,45,30,60,50,20,65,20,25,30,10,20,25, 15,10,10,10,4,4,2,1}求背包的总量不能超过1000,求解背包所能装下的最⼤的价值是多少?python代码如下:import numpy as npimport randomimport as plt##初始化,N为种群规模,n为染⾊体长度def init(N,n): C = [] for i in range(N): c = [] for j in range(n): a = t(0,2) (a) (c) return C##评估函数# x(i)取值为1表⽰被选中,取值为0表⽰未被选中# w(i)表⽰各个分量的重量,v(i)表⽰各个分量的价值,w表⽰最⼤承受重量def fitness(C,N,n,W,V,w): S = []##⽤于存储被选中的下标 F = []##
⽤于存放当前该个体的最⼤价值 for i in range(N): s = [] h = 0 #
重量 f = 0 #
价值 for j in range(n): if C[i][j]==1: if h+W[j]<=w: h=h+W[j] f = f+V[j] (j) (s) (f) return S,F##适应值函数,B位返回的种族的基因下标,y为返回的最⼤值def best_x(F,S,N): y = 0 x = 0 B = [0]*N for i in range(N): if y 计算⽐率def rate(x):def rate(x): p = [0] * len(x) s = 0 for i in x: s += i for i in range(len(x)): p[i] = x[i] / s return p## 选择def chose(p, X, m, n): X1 = X r = (m) for i in range(m): k = 0 for j in range(n): k = k + p[j] if r[i] <= k: X1[i] = X[j] break return X1##交配def match(X, m, n, p): r = (m) k = [0] * m for i in range(m): if r[i] < p: k[i] = 1 u = v = 0 k[0] = k[0] = 0 for i in range(m): if k[i]: if k[u] == 0: u = i elif k[v] == 0: v = i if k[u] and k[v]: # print(u,v) q = t(n - 1) # print(q) for i in range(q + 1, n): X[u][i], X[v][i] = X[v][i], X[u][i] k[u] = 0 k[v] = 0 return X##变异def vari(X, m, n, p): for i in range(m): for j in range(n): q = () if q < p: X[i][j] = t(0,2) return Xm = 8##规模N = 800 ##迭代次数Pc = 0.8 ##交配概率Pm = 0.05##变异概率V =[220,208,198,192,180,180,165,162,160,158,155,130,125,122,120,118,115,110,105,101,100,100,98,96,95,90,88,82,80,77,75,73,72,70,69,66,65,63,60,58,56,50,30,20,15,10,8,5,3,1]W =[80,82,85,70,72,70,66,50,55,25,50,55,40,48,50,32,22,60,30,32,40,38,35,32,25,28,30,22,25,30,45,30,60,50,20,65,20,25,30,10,20,25,15,10,10,10,4,4,2,1]n = len(W)##染⾊体长度n = len(W)##染⾊体长度w = 1000C = init(m, n)S,F = fitness(C,m,n,W,V,w)B ,y = best_x(F,S,m)Y =[y]for i in range(N): p = rate(F) C = chose(p, C, m, n) C = match(C, m, n, Pc) C = vari(C, m, n, Pm) S, F = fitness(C, m, n, W, V, w) B1, y1 = best_x(F, S, m) if y1 > y: y = y1 (y)print("最⼤值为:",y)(Y)()运⾏结果如下:
发布评论