1

我解释说,我正在尝试开发一个程序来根据接收到的参数优化系统。我的程序将不得不改变这些参数以尝试找到最佳组合。

这是简化我的问题的代码:

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))

我更新了新代码。我的问题:我希望我的程序找到较小的数字

4

0 回答 0