遗传动态背包模板笔试
import random
pop_size = 1000
pop = []
# 适应度
pop_fitness = []
# n length
chrom_len = 6
itrator = 1
# 总金额
sum_mony = 1000
# 价格列表
price_degree = [200, 600, 100, 180, 300, 450]
# 热度列表
hot_degree = [6, 10, 3, 4, 5, 8]
def cross(p1, p2):
for i in range(len(p1)):
if random.random() < 0.3:
r1 = random.random()
r2 = 1 - r1
y1 = r1 * p1[i] + r2 * p2[i]
y2 = r2 * p1[i] + r1 * p2[i]
p1[i] = y1
p2[i] = y2
return p1, p2
def create():
gene = []
for i in range(chrom_len):
gene.append(random.random())
return gene
# 计算价格,基因0-1,>0.5选中
def call(gene):
sum_v = 0
for i, g in enumerate(gene):
if g > 0.5:
sum_v += hot_degree[i]
return sum_v
def check(gene):
sum_v = 0
for i, g in enumerate(gene):
if g > 0.5:
sum_v += price_degree[i]
return sum_v < sum_mony
# 突变
def mutate(p1):
for i in range(len(p1)):
if random.random() < 0.05:
r1 = random.random() * -0.2 + 0.1
y1 = p1[i] + r1
if y1 > 1: y1 = 1
if y1 < 0: y1 = 0
p1[i] = y1
return p1
# 进化
def revolution():
global pop_fitness
global pop
global pop_size
for i in range(pop_size):
p = create()
pop.append(p)
pop_fitness.append(call(p))
best_gene = []
max_fitness = 0
for i in range(itrator):
pop_fitness = []
for i in range(pop_size):
p = pop[i]
p_fit = call(p)
pop_fitness.append(p_fit)
if p_fit > max_fitness and check(p):
max_fitness = p_fit
best_gene = p.copy()
print(i, max_fitness)
for ii in range(pop_size):
jj = random.randint(0, pop_size - 1)
k = random.randint(0, pop_size - 1)
pj = pop[jj]
pk = pop[k]
n_pj, n_pk = cross(pj, pk)
n_pj = mutate(n_pj)
n_pk = mutate(n_pk)
pop[jj] = n_pj[:]
pop[k] = n_pk[:]
return best_gene
if __name__ == '__main__':
gene = revolution()
print(gene)