我想使用GA解决以下问题:
我如何才能找到哪一组50像素大约是最好的像素(而不必尝试所有可能的组合)?我是GA的新手,我想问一下应该如何实现/实现这种优化?
答案 0 :(得分:1)
除了健身功能仅基于50分得分外,您是否还有其他有关健身功能性质的信息?如果不是这样,似乎没有任何理由通过尝试在编码上强加高阶抽象来使问题复杂化。这限制了遗传算法的优势,但也大大降低了维数。下面的示例在Python中。
个人只是坐标对的列表:
from random import SystemRandom
X_DIMENSION = 100
Y_DIMENSION = 100
N_PIXELS = 50
rng = SystemRandom()
def create_individual():
return [
(rng.randrange(X_DIMENSION), rng.randrange(Y_DIMENSION))
for i in range(N_PIXELS)
]
天真的交叉可以实现为两个人的直接拼接和连接。
def crossover(a, b):
location = rng.randrange(1, N_PIXELS - 1)
return a[:location] + b[location:], b[:location] + a[location:]
这是另一个随机的幼稚实现,这次是突变。它只是用新坐标随机替换坐标。请记住,LOCATION_MUTATION_RATE只是这种突变方法的产物,而不是一般个人的实际突变率(请参阅MUTATION_RATE)。
LOCATION_MUTATION_RATE = .1
def mutate(a):
for i in range(N_PIXELS):
if rng.random() < LOCATION_MUTATION_RATE:
a[i] = (rng.randrange(X_DIMENSION), rng.randrange(Y_DIMENSION))
以下是最终实现的大致概述。这里的一些功能显然被省略了,但是您可以了解要点。
POPULATION_SIZE = 10000
SELECTION_RATE = .8
CROSSOVER_RATE = .2
MUTATION_RATE = .03
def main():
population = [create_individual() for i in range(POPULATION_SIZE)]
normalized_fitnesses = normalize_fitnesses(calc_fitnesses(population))
print_stats(normalized_fitnesses)
while not completion_condition(normalized_fitnesses):
select(zip(population, normalized_fitnesses))
replace_dead(population)
crossover_all(population)
mutate_all(population)
normalized_fitnesses = normalize_fitnesses(calc_fitnesses(population))
print_stats(normalized_fitnesses)
def calc_fitnesses(population):
return [calc_fitness(individual) for individual in population]
编辑:
了解到应用程序是RF传播之后,我会说,唯一需要做的大改变是突变函数绝对应该只是随机移动坐标,而不是生成新点(因为选择已经完成了)。通常,假设某种梯度,它也可能更好。以下是基于x和y尺寸使用不同移动量的示例。它可能不是很直观,但是请想象您是否正在使用20 x 1000或类似的东西。另外,我个人会添加除基本金额(MUTATION_MOVEMENT_FACTOR)之外的其他因素,以根据个人相对于他人的表现差(因此归一化的适应度)来增加移动量。
import math
LOCATION_MUTATION_RATE = .3
MUTATION_MOVEMENT_FACTOR = .05
MOVEMENT_X = math.ceil(X_DIMENSION * MUTATION_MOVEMENT_FACTOR)
MOVEMENT_Y = math.ceil(Y_DIMENSION * MUTATION_MOVEMENT_FACTOR)
def mutate(a):
for i in range(N_PIXELS):
if rng.random() < LOCATION_MUTATION_RATE:
a[i][0] += rng.randrange(-MOVEMENT_X, MOVEMENT_X)
a[i][1] += rng.randrange(-MOVEMENT_Y, MOVEMENT_Y)
考虑到这是RF传播,您可以在执行遗传操作后进行一些优化以避免浪费计算时间。将显然太近的点合并到一个点(平均),然后想到一个新点。
答案 1 :(得分:0)
您的问题对于SO来说有点太广泛了。但是,这里是GA运作方式的摘要。关键部分是您已经具有健身功能。
f(image)
计算每个染色体的适应度。我希望这可以作为起点。也许您应该检查一些GA示例,开始编码,并在此处提出一些更具体的问题(如果需要)。
答案 2 :(得分:0)
添加Alvaro的答案:
要填充N个对象,这N个对象中的每一个都是有效图像,即分辨率为100 * 100的白色图像,始终具有50个黑色像素。
可以随机放置50个黑色像素(如果N大)或使用任何其他方法。这将设置大小为N的初始种群,每个染色体都是100x100的数据结构(基本上是您的图像)。
由于您已经具有健身功能,因此可以使用它来寻找下一代的最佳人选。
现在要增加人口,您将需要“交叉功能”和/或“突变功能”。
可以通过将某个黑色像素的位置(例如k,其中k <50)更改为一个白色像素来进行突变,以使染色体不会失去其基本属性,而仅会使原始图像发生少许突变。 / p>
对于交叉功能,请拍摄2张图像(染色体)并混合以形成新的染色体,请记住每个染色体可以恰好具有50个黑色像素(以及其他任何限制)。这可以通过从每个父图像中获取25个黑色像素来完成,如果它们重叠(父1中的黑色像素和父2中的黑色像素),则可以将其放在随机的白色位置,也可以选择最近的空白像素放置这个黑色像素。
重复产生最佳种群,交叉,突变,产生最佳种群,交叉,突变等步骤,直到收敛为止,或者确定一个编号。迭代次数。