我正在用Python实现一个GA,需要存储一个1和0的序列,所以我将我的数据表示为二进制文件.那个最好的数据结构是什么?简单的字符串?
假设C引用一组容器{c1,c2,c3....cn},其中每个容器包含一组有限的整数{i1,i2,i3...im}.此外,假设整数可能存在于多个容器中.给定一组有限的整数S {s1,s2,s3...sz},找到C包含所有整数的最小子集的大小S.
请注意,可能有数千个容器,每个容器有数百个整数.因此,蛮力很难解决这个问题.
我尝试使用Greedy算法解决问题.也就是说,每次我选择集合中整数最多的容器时S,我都失败了!
有谁能建议这个问题的快速算法?
我正在使用genalg包进行遗传算法.基因是二元是自然的,结果将指定
基因的长度是269,很难理解哪个是难以理解的.有没有办法从中提取结果并将其放在数据框中?
cat(summary.rbga(GAmodel))
GA Settings
Type = binary chromosome
Population size = 100
Number of Generations = 100
Elitism = TRUE
Mutation Chance = 0
Search Domain
Var 1 = [,]
Var 0 = [,]
GA Results
Best Solution : 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 …Run Code Online (Sandbox Code Playgroud) 我正在尝试为 GA 编写代码以最小化系统的成本,问题是该解决方案收敛于局部最小值并陷入其中,因此我无法再改进我的解决方案。
可能是我的选择方法导致了这里的问题,这就是我所拥有的:
%----------------------------selection (fittest half) ----------------
probability=ones(1,population/2);
[,IX]=sort(cost(1:population))
dd=sum(1:population);
probability(1:(population/2))=[1:population/2];
probability=fliplr(probability)/dd;
Indexx=IX(1:population/2);
Run Code Online (Sandbox Code Playgroud)
然后我使用 Indexx 进行交叉等,有人可以提出解决方案吗?
我已经实施Roulette wheel selection了GA.
TotalFitness=sum(Fitness);
ProbSelection=zeros(PopLength,1);
CumProb=zeros(PopLength,1);
for i=1:PopLength
ProbSelection(i)=Fitness(i)/TotalFitness;
if i==1
CumProb(i)=ProbSelection(i);
else
CumProb(i)=CumProb(i-1)+ProbSelection(i);
end
end
SelectInd=rand(PopLength,1);
for i=1:PopLength
flag=0;
for j=1:PopLength
if(CumProb(j)<SelectInd(i) && CumProb(j+1)>=SelectInd(i))
SelectedPop(i,1:IndLength)=CurrentPop(j+1,1:IndLength);
flag=1;
break;
end
end
if(flag==0)
SelectedPop(i,1:IndLength)=CurrentPop(1,1:IndLength);
end
end
Run Code Online (Sandbox Code Playgroud)
现在我是想实现rank selection在GA.我了解到:
排名选择首先对人群进行排名,然后每个染色体从该排名中获得适应性.
最差的将是健身1,第二差2等等,最好的将具有适应度N(人口中的染色体数量).
首先,我将对人口的健身价值进行排序.
然后,如果人口数量是10,那么我将给予人口选择的概率,如0.1,0.2,0.3,...,1.0.
我的实施:
NewFitness=sort(Fitness);
NewPop=round(rand(PopLength,IndLength));
for i=1:PopLength
for j=1:PopLength
if(NewFitness(i)==Fitness(j))
NewPop(i,1:IndLength)=CurrentPop(j,1:IndLength);
break;
end
end
end
CurrentPop=NewPop;
ProbSelection=zeros(PopLength,1);
CumProb=zeros(PopLength,1);
for i=1:PopLength
ProbSelection(i)=i/PopLength;
if i==1
CumProb(i)=ProbSelection(i);
else
CumProb(i)=CumProb(i-1)+ProbSelection(i);
end …Run Code Online (Sandbox Code Playgroud) 我正在尝试了解遗传算法原理。我正在关注这个http://www.ai-junkie.com/ga/intro/gat2.html和本教程:第二个教程。这两个教程都提到了搜索空间(可能存在解决方案的空间)中的个体和染色体等术语。
在学习第二个教程时,我以某种方式从那里读到个体实际上与染色体相同。那么群体中的解决方案真的是染色体吗?如果是这样,为什么还要使用“个人”这个词呢?
我正在 Python 中使用 DEAP 包编写一个程序,用于使用进化算法(特别是遗传算法)进行优化。
我需要使用 python 中的列表类型创建染色体。该染色体应该有五个不同范围的浮动基因(等位基因)。
我的主要问题是创造这样的染色体。但是,如果我可以使用 deap 包的 tools.initRepeat 函数来实现这一点,那就更好了。
对于所有基因都在同一范围内的情况,我们可以使用以下代码:
import random
from deap import base
from deap import creator
from deap import tools
creator.create("FitnessMax", base.Fitness, weights=(1.0,))
creator.create("Individual", list, fitness=creator.FitnessMax)
IND_SIZE=10
toolbox = base.Toolbox()
toolbox.register("attr_float", random.random)
toolbox.register("individual", tools.initRepeat, creator.Individual,
toolbox.attr_float, n=IND_SIZE)
Run Code Online (Sandbox Code Playgroud)
我从这里得到的。
有没有办法在不使用任何外部库(Boost等)的情况下将std :: bitset <64>转换为double?我使用bitset来表示遗传算法中的基因组,我需要一种方法将一组位转换为double.
首先,这是家庭作业的一部分.
我正在尝试实现遗传算法.我很困惑选择父母交叉.
在我的笔记中(显然有些不对劲)这是作为例子所做的事情;
但是当应用第二步时,选择的染色体计数等于第一步中发现的结果.由于随机性,这并不总是得到保证.
所以这没有任何意义.我搜索选择父母进行交叉,但我发现的是交叉技术(单点,切割和切片等)以及如何在所选父母之间进行交叉(我对这些没有问题).我只是不知道哪个染色体应该选择交叉.有什么建议或简单的例子?
问题:
我在R中使用一个循环从两个("父")向量创建一个新向量,为新向量中的每个位置生成一个随机值,该值位于父对象在此位置的值范围内(它是为遗传算法中的交叉阶段).请注意,我不想要x和y的平均值,而是要求各个位置上的值范围内的随机值.
示例代码:
x = c(0.1, 0.7, 1, 0.8)
y = c(0, 0.9, 0.2, 1)
child = rep(NA, length(x))
for(i in 1:length(x)){
child[i] = sample(seq(min(x[i], y[i]),
max(x[i],y[i]), by=0.01), 1)
}
# This might yield, for example: 0.02 0.83 0.73 0.88
Run Code Online (Sandbox Code Playgroud)
题:
它工作正常,但我想也许有一种更有效的方法来做到这一点(因为我需要在数千次迭代中的每一次为100-1000个人做这件事).在R,有喜欢漂亮的快捷功能ifelse,colMeans,max.col,match,rollmean,等,在载体的工作,所以我想知道,是否有类似的东西,我的目的呢?(根据apply我的理解,这个团伙可能在这里帮不了多少).或者像这样的循环真的是我能做的最好的?