我解释说,我正在尝试开发一个程序来根据接收到的参数优化系统。我的程序将不得不改变这些参数以尝试找到最佳组合。
这是简化我的问题的代码:
parameters=[["toto1","toto2","toto3"],["tutu1","tutu2","tutu3"],["titi1","titi2","titi3"],["tata1","tata2","tata3"]]
def MySysteme(param1,param2,param3,param4):
result=0
for i in range(0,len(param1)):
result+=ord(param1[i])
for i in range(0,len(param2)):
result+=ord(param1[i])
for i in range(0,len(param3)):
result+=ord(param1[i])
for i in range(0,len(param4)):
result+=ord(param1[i])
return result
print(MySysteme(parameters[0][0],parameters[1][2],parameters[2][2],parameters[3][0]))
print(MySysteme(parameters[1][0],parameters[2][2],parameters[3][2],parameters[0][0]))
print(MySysteme(parameters[3][1],parameters[1][2],parameters[2][2],parameters[0][0]))
#how to find the highest value?
我尝试(尝试)找到最大的数字,而不是天真地测试所有参数。因此使用遗传算法。1参数是列表参数中包含的列表,列表的内容是我的参数的一个varariante
知道在我的函数/我的系统中,一个不应该有 2 次相同的参数,例如这不应该发生: print (MySystem (parameters [1] [0], parameters [1] [0])) 或这个 print (MySystem(参数[2] [1],参数[2] [0]))
另一方面,参数的数量包含在 1 和 4 中(可以有 1、2、3 或 4 个参数)
在这里解决我的问题是我考虑的数据: 个人:它是带有名称的参数的变体(“toto1”,“tata3”,“toto2 = 12”......等) 人口:变体的集合参数的适应度:它是根据参数的函数的结果一个电路:一组参数
但与商务旅行者不同的是,我没有起始数据 => 也就是说我没有 GPS 坐标。正是在这个级别上,我被困在解决我的问题上。
谁能帮我?
编辑:
我一直在寻找一些示例,说明如何使用 Python 中的遗传算法方法找到函数达到最大值的点。我看了这个教程 https://lethain.com/genetic-algorithms-cool-name-damn-simple/
我的目标是找到“mySysteme”函数的较小数字我设置了一个新代码:je re-explique mon questione plus simplement。J'ai 遇到了 un code plus complet,加上 clair avec un algo génétique。
from random import randint, random
from operator import add
from functools import reduce
parameters=[["toto123","toto27","toto3000"],["tu","tut","tutu378694245"],["t","choicezaert","titi3=78965"],["blabla","2","conjoncture_is_enable"]]
def individual(length, min, max):
return [ randint(min,max) for x in range(length) ]
def population(count, length, min, max):
return [ individual(length, min, max) for x in range(count) ]
def fitness(individual, target):
sum = reduce(add, individual, 0)
return abs(target-sum)
def grade(pop, target):
individu_number_parameters=randint(1, len(parameters)-1)
for j in range(0,individu_number_parameters):
position=randint(1, len(parameters)-1)
parameter=parameters[position]
if isinstance(parameter, list):
parameter=parameters[position][randint(1, len(parameters[position])-1)]
result=0
for i in range(0,len(parameter)):
result+=ord(parameter[i])
return result
def evolve(pop, target, retain=0.2, random_select=0.05, mutate=0.01):
graded = [ (fitness(x, target), x) for x in pop]
graded = [ x[1] for x in sorted(graded)]
retain_length = int(len(graded)*retain)
parents = graded[:retain_length]
for individual in graded[retain_length:]:
if random_select > random():
parents.append(individual)
for individual in parents:
if mutate > random():
pos_to_mutate = randint(0, len(individual)-1)
individual[pos_to_mutate] = randint(
min(individual), max(individual))
parents_length = len(parents)
desired_length = len(pop) - parents_length
children = []
while len(children) < desired_length:
male = randint(0, parents_length-1)
female = randint(0, parents_length-1)
if male != female:
male = parents[male]
female = parents[female]
half = int(len(male) / 2)
child = male[:half] + female[half:]
children.append(child)
parents.extend(children)
return parents
target = 0
p_count = 100
i_length = 6
i_min = 0
i_max = 100
p = population(p_count, i_length, i_min, i_max)
fitness_history = [grade(p, target),]
for i in range(1000):
p = evolve(p, target)
fitness_history.append(grade(p, target))
for datum in fitness_history:
print(datum)
print(len(fitness_history))
我更新了新代码。我的问题:我希望我的程序找到较小的数字