Javascript 如何进行随机突变

Javascript 如何进行随机突变,javascript,Javascript,我正在做一个有趣的细胞自然选择项目。每个代码都有“dna”,这只是一组指令。dna既可以清除废物,消化食物,也可以修复细胞壁。我不会详细说明他们做什么,因为那会花太长时间。但进化真正发生的唯一原因是基因突变。我想知道这在javascript中是否可行,以及如何实现。例如,起始细胞有5条dna链。但如果它繁殖,孩子可以有4个或6个。一些dna链可以被改变。这是我目前的代码: var strands = ["DIGEST FOOD", "REPAIR WALL", "REMOVE WASTE"];

我正在做一个有趣的细胞自然选择项目。每个代码都有“dna”,这只是一组指令。dna既可以清除废物,消化食物,也可以修复细胞壁。我不会详细说明他们做什么,因为那会花太长时间。但进化真正发生的唯一原因是基因突变。我想知道这在javascript中是否可行,以及如何实现。例如,起始细胞有5条dna链。但如果它繁殖,孩子可以有4个或6个。一些dna链可以被改变。这是我目前的代码:

var strands = ["DIGEST FOOD", "REPAIR WALL", "REMOVE WASTE"];
var dna = [];

for (let i = 0; i < 5; i++) {
    if (parent) {
        // something about the parents dna, and the mutation chance
    }
    else {
        dna.push(strands[Math.floor(Math.random() * 3)]); // if cell doesn't have parent
    }
}
var-threads=[“消化食物”、“修复墙壁”、“清除垃圾”];
var dna=[];
for(设i=0;i<5;i++){
如果(家长){
//关于父母的dna和突变机会
}
否则{
dna.push(threads[Math.floor(Math.random()*3)];//如果细胞没有父代
}
}
我只是想知道这在javascript中是否可行,以及如何成功地做到这一点。如果问题不太清楚,对不起。 编辑:让我重新措辞一下。我试图实现的是新细胞的基因突变。比如:

if (parent) {
dna.push(parent);
if (Math.random() < 0.5) {
changeStrand(num);
}
if (Math.random() < 0.5) {
addStrand(num);
}
if (Math.random() < 0.5) {
removeStrand(num);
}
}
function changeStrand() {
// change the strand
}
function newStrand(num) {
// add random strands
}
function removeStrand(num) {
// remove random strands
}
if(父级){
dna.push(父代);
if(Math.random()<0.5){
交换链(num);
}
if(Math.random()<0.5){
addStrand(num);
}
if(Math.random()<0.5){
removeStrand(num);
}
}
函数changeStrand(){
//换股
}
函数newStrand(num){
//添加随机股
}
函数removeStrand(num){
//移除随机股
}

或者类似的东西

如果你想要随机数,你可以用它。在链接页面中,还有一些获取x和y之间值的示例,例如:

// Source https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random 
function getRandomInt(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min)) + min; 
}

我不确定这是您试图实现的目标-因为您已经使用了Math.random()函数。

对于遗传算法,您基本上希望从每个父代中取出两片并将其缝合在一起,同时确保最终结果仍然是有效的dna链

对于一个固定大小的DNA序列(如N个皇后位置),该技术将是选择一个随机切片点(1-3 | 4-8),然后将这些来自父母的切片组合成一个子序列

对于您的用例,您需要两个大小之和加起来为4-6的随机切片。所以可能有两片2-3号的。你可以从前面取一个,从后面取另一个。否则,您可以首先选择一个随机输出大小,然后为任一父级填充两个随机序列

Array.slice()和Array.splice()可能是您想要使用的函数

您还可以在最终结果中添加随机突变。处于活基因进化速度极限的病毒平均每个转录有1个突变。这意味着一些转录不会有突变,这相当于允许父代中的一些父母存活下来

您还可以尝试不同的变体。将这些作为特性标志来实现,并查看在实践中什么最有效

与Beam Search相比,Beam Search本质上保留了每一代中N个最佳结果的副本。你可能想也可能不想保留父母一代最好的东西,以便不变异地生存下来

另一个想法是计算个体之间的距离度量,并增加与群体中现有成员过于接近的成本,这将选择遗传多样性

在标准模型中,变异是通过字母序列中的点突变和“交叉”(即子代的DNA是通过组合来自每个父代的DNA长片段而产生的)发生的

已经描述了与局部搜索算法的类比;随机波束搜索和进化之间的主要区别在于有性生殖的使用,其中的后代是由多个生物体而不是一个生物体产生的。然而,进化的实际机制比大多数遗传算法所允许的要丰富得多。例如,突变可能涉及大片段DNA的反转、复制和移动;有些病毒从一个有机体中借用DNA并将其插入另一个有机体中,而转座基因除了在基因组中自我复制数千次外,什么也不做。甚至还有一些基因会毒害不携带该基因的潜在配偶的细胞,从而增加它们自身复制的机会。最重要的是,基因本身编码着基因组复制和转化为生物体的机制。在遗传算法中,这些机制是一个单独的程序,不在被操纵的字符串中表示

  • 人工智能:一种现代方法。(第三版)斯图尔特·拉塞尔和彼得·诺维格

你说得对——还不太清楚。你有太多关于生物学的信息,而对你想要达到的数学知识却不够。这是一个非常好的答案!不幸的是,我想要无性繁殖。但我会做无性生殖后,所以谢谢!