void cross() { int i , j , k ; int mask1 , mask2; int a[SUM]; for(i = 0 ; i < SUM ; i++) a[i] = 0; k = 0; for(i = 0 ; i < SUM ; i++) { if( a[i] == 0) { for( ; ; )//随机找到一组未进行过交叉的染色体与a[i]交叉 { j = randbit(i + 1 , SUM - 1); if( a[j] == 0) break; } if(randsign(crossp) == 1) //按照crossp的概率对选择的染色体进行交叉操作 { mask1 = createmask(randbit(0 , 14)); //由ranbit选择交叉位 mask2 = ~mask1; //形成一个类似 111000 000111之类的二进制码编码 gen_new[k].info = (gen_group[i].info) & mask1 + (gen_group[j].info) & mask2; gen_new[k+1].info=(gen_group[i].info) & mask2 + (gen_group[j].info) & mask1; k = k + 2; } else //不进行交叉 { gen_new[k].info=gen_group[i].info; gen_new[k+1].info=gen_group[j].info; k=k+2; } a[i] = a[j] = 1; } } }
// 1>随机选择将要进行交叉的染色体对,保证种群中的每个染色体都有唯一一次交叉的机会 // 2>按crossp的概率对选择的染色体对进行交叉操作 // 3>未进行交叉的染色体直接复制作为子染色体 void cross() { // 将父种群按概率crossp做交叉操作 int i, j, k; int mask1, mask2; int a[SUM]; for (i = 0; i < SUM; i++) a[i] = 0; k = 0; for (i = 0; i < SUM; i++) { if (a[i] == 0) { for ( ; ; ) { // 随机找到一组未进行过交叉的染色体与a[i]交叉 j = randbit(i + 1, SUM - 1); if (a[j] == 0) break; } if (randsign(crossp) == 1) { mask1 = createmask(randbit(0, 14)); mask2 = -mask1; gen_new[k].info = (gen_group[i].info) & mask1 + (gen_group[j].info) & mask2; gen_new[k + 1].info = (gen_group[i].info) & mask2 + (gen_group[j].info) & mask1; k = k + 2; } else { gen_new[k].info = gen_group[i].info; gen_new[k + 1].info = gen_group[j].info; k = k + 2; } a[i] = a[j] = 1; } } }
/*----------------------------------------------------------------------------*/ int sobel_y_image(my1Image *src, my1Image *dst) { int coeff[] = { -1,-2,-1, 0,0,0, 1,2,1 }; my1Mask mask; if(createmask(&mask,3)==0x0) return -1; setmask(&mask,coeff); mask.orig_x = 1; mask.orig_y = 1; filter_image(src,dst,&mask); freemask(&mask); return 0; }
/*----------------------------------------------------------------------------*/ int laplace_image(my1Image *src, my1Image *dst) { int coeff[] = { 0,-1,0, -1,4,-1, 0,-1,0 }; my1Mask mask; if(createmask(&mask,3)==0x0) return -1; setmask(&mask,coeff); mask.orig_x = 1; mask.orig_y = 1; filter_image(src,dst,&mask); freemask(&mask); return 0; }
void VstXSynth::processReplacing(float **inputs, float **outputs, long sampleFrames) { float *out1 = outputs[0]; float *out2 = outputs[1]; float *in1 = inputs[0]; float *in2 = inputs[1]; short mask = createmask(SAVE); bool or = SAVE[kOr]>0.5f; bool and = SAVE[kAnd]>0.5f; bool sig = SAVE[kSig]>0.5f; for(long i=0;i<sampleFrames;i++) { out1[i] = process1(in1[i],mask,or,and,sig); out2[i] = process1(in2[i],mask,or,and,sig); } }