function probabolity(N,i) PF=p(N-i)/Psum;%适应度概率 disp(PF); for jj=1:N distance(jj)=abs(P(jj)-P(i)); end num=0; for ii=1:N if distance(ii)<minD num=num+1; end end PD=num/N; %个体浓度 PR=a*PF+(1-a)*PD; %替换概率 end end
时间: 2024-04-13 22:26:05 浏览: 93
这段代码是一个函数,用于计算个体的适应度概率PF、个体浓度PD和替换概率PR。
函数名为`probability`,接受两个参数:`N`表示总粒子数,`i`表示当前粒子的索引。
在函数内部,首先计算适应度概率PF。根据代码`PF=p(N-i)/Psum`,将个体最优适应度值p(N-i)除以个体最优适应度值之和Psum,得到适应度概率PF。
接下来,使用循环计算当前粒子与其他粒子之间的距离。通过代码`for jj=1:N; distance(jj)=abs(P(jj)-P(i)); end`,计算每个粒子与当前粒子之间适应度值的差的绝对值。
然后,使用循环统计距离小于minD的粒子个数。通过代码`for ii=1:N; if distance(ii)<minD; num=num+1; end; end`,统计距离小于minD的粒子个数,并将其除以总粒子数N,得到个体浓度PD。
最后,根据给定的因子a,计算替换概率PR。通过代码`PR=a*PF+(1-a)*PD`,将适应度概率PF与个体浓度PD的线性组合作为替换概率PR。
这个函数可以在免疫程序中使用,用于计算每个粒子的适应度概率、个体浓度和替换概率。
相关问题
if t>DS if mod(t,DS)==0 && (Pbest(t-DS+1)-Pbest(t))<1e-020 %如果连续DS代数,群体中的最优没有明显变优,则进行免疫. %在函数测试的过程中发现,经过一定代数的更新,个体最优不完全相等,但变化非常非常小, for i=1:N %先计算出个体最优的和 Psum=Psum+p(i); end for i=1:N %免疫程序 for j=1:N %计算每个个体与个体i的距离 distance(j)=abs(p(j)-p(i)); end num=0; for j=1:N %计算与第i个个体距离小于minD的个数 if distance(j)<minD num=num+1; end end PF(i)=p(N-i+1)/Psum; %计算适应度概率 PD(i)=num/N; %计算个体浓度 a=rand; %随机生成计算替换概率的因子 PR(i)=a*PF(i)+(1-a)*PD(i); %计算替换概率 end
这部分代码是粒子群优化算法中的免疫程序,用于在连续一定代数内群体中的最优解没有明显变优时进行免疫操作。
首先,代码中通过判断条件 `mod(t,DS)==0 && (Pbest(t-DS+1)-Pbest(t))<1e-020` 来确定是否进行免疫操作。条件中,DS表示一定的连续代数,Pbest(t)表示第t次迭代时的全局最优适应度值。
如果满足条件,则进行免疫操作。免疫操作的具体步骤如下:
1. 计算个体最优适应度值之和:使用循环遍历每个粒子的个体最优适应度值p(i),并将其累加到Psum变量中。
2. 免疫程序:对每个粒子进行免疫操作。具体步骤如下:
a. 计算个体与其他个体之间的距离:使用循环计算每个粒子与第i个粒子之间的距离,距离定义为适应度值之间的差的绝对值。
b. 计算与第i个粒子距离小于minD的个数:使用循环统计距离小于minD的粒子个数,其中minD是一个阈值。
c. 计算适应度概率PF:将个体最优适应度值按照降序排列,并将p(N-i+1)除以个体最优适应度值之和Psum,得到适应度概率PF(i)。
d. 计算个体浓度PD:将距离小于minD的粒子个数num除以总粒子数N,得到个体浓度PD(i)。
e. 计算替换概率PR:随机生成一个因子a,并计算替换概率PR(i)。替换概率是适应度概率PF和个体浓度PD的线性组合,可以根据具体情况调整a的取值范围。
通过免疫程序,可以根据个体最优解的变化情况和个体之间的距离来调整粒子的替换概率,以提高算法的多样性和全局搜索能力。
def load_action_data(self): return get_item_base_data(self.table_name) # 求皮尔逊相关系数 def sim_pearson(self, p1, p2): # 得到双方都曾评价过的物品列表 si = {item: 1 for item in p1 if item in p2} n = len(si) if n == 0: return 0 # 对所有偏好求和 sum1 = sum(p1[it] for it in si) sum2 = sum(p2[it] for it in si) # 求平方和 sum1sq = sum(pow(p1[it], 2) for it in si) sum2sq = sum(pow(p2[it], 2) for it in si) # 求乘积之和 pSum = sum(p1[it] * p2[it] for it in si) # 计算皮尔逊评价值 num = pSum - (sum1 * sum2 / n) den = sqrt((sum1sq - pow(sum1, 2) / n) * (sum2sq - pow(sum2, 2) / n)) if den == 0: return 0 r = num / den return r
这段代码看起来是一个推荐系统中用来计算皮尔逊相关系数的函数。它接受两个用户的评分数据(p1和p2),找到它们共同评价过的物品列表(si),并计算它们之间的相关性(r)。在计算过程中,它首先计算出每个用户对共同评价过的物品的偏好值的平均值(sum1和sum2),然后计算它们的平方和(sum1sq和sum2sq),以及它们的乘积之和(pSum)。最后,它计算出相关性系数r,并返回它。
阅读全文