当前位置:首页 » 操作系统 » 交叉点算法

交叉点算法

发布时间: 2022-09-04 05:00:27

⑴ 遗传算法交叉点怎么定

比较简单的一个办法是随机生成一个整数(范围在1到编码长度之间),之后交换这个随机数对应的染色体和它后面的部分。
如何你的染色体编码是个矩阵的话,可以同时交叉 随机数 对应列和之后的所有部分。
(其实交叉的规则完全可以自己定,我说这个是比较常见操作比较简单的。)

⑵ 如何计算线段和圆的交点

先计算线段P1,P2的向量V(如果判断圆心在圆上,根据半径判断是否有交点,就很容易计算出交点F)

然后取得向量的垂向量G

用圆心O和垂向量G与这个线段做投影交点P

判断交点与圆心距离d.(小于半径则说明交点在圆内)

然后根据勾股定理用d和半径r,计算投影的交点P与线段和圆的交点的距离e.

用线段的向量V和投影点P加上距离e计算出与圆的交点F.

如果FP的距离大于FP1和FP2,这说明P1,P2都在圆内,无法形成交点

⑶ 多条直线的最多交点怎么计算

两条直线相交,1个交点;3条直线相交,3个交点,第3条直线分别和前两条相交最多新产生2个交点,交点总数为2+1=3;4条直线,6个交点,第4条直线分别和前3条相交最多新产生3个交点,交点总数为3+2+1=6;5条直线相交,10个交点,第5条直线分别和前4条相交新产生4个交点,交点总数为4+3+2+1=10个
如图:


10条直线相交时:
n×(n-1)÷2
=10×(10-1)÷2
=5×9
=45(个)
答:10条直线相交时,最多有45个交点.

⑷ matlab遗传算法中的交叉算子函数应该怎么编写

function [xv,fv]=myGA(fitness,a,b,NP,NG,Pc,Pm,eps)
L = ceil(log2((b-a)/eps+1)); %根据离散精度,确定二进制编码需要的码长
x = zeros(NP,L);
for i=1:NP

x(i,:) = Initial(L); %种群初始化

fx(i) = fitness(Dec(a,b,x(i,:),L)); %个体适应值

end
for k=1:NG

sumfx = sum(fx); %所有个体适应值之和

Px = fx/sumfx; %所有个体适应值的平均值
PPx = 0;

PPx(1) = Px(1);

for i=2:NP %用于轮盘赌策略的概率累加

PPx(i) = PPx(i-1) + Px(i);

end
for i=1:NP

sita = rand();

for n=1:NP

if sita <= PPx(n)

SelFather = n; %根据轮盘赌策略确定的父亲

break;

end

end

Selmother = floor(rand()*(NP-1))+1; %随机选择母亲

posCut = floor(rand()*(L-2)) + 1; %随机确定交叉点

r1 = rand();

if r1<=Pc %交叉

nx(i,1:posCut) = x(SelFather,1:posCut);

nx(i,(posCut+1):L) = x(Selmother,(posCut+1):L);

r2 = rand();

if r2 <= Pm %变异

posMut = round(rand()*(L-1) + 1);

nx(i,posMut) = ~nx(i,posMut);

end

else

nx(i,:) = x(SelFather,:);

end

end
x = nx;

for i=1:NP

fx(i) = fitness(Dec(a,b,x(i,:),L)); %子代适应值

end

end
fv = -inf;
for i=1:NP

fitx = fitness(Dec(a,b,x(i,:),L));

if fitx > fv

fv = fitx; %取个体中的最好值作为最终结果

xv = Dec(a,b,x(i,:),L);

end

end
function result = Initial(length) %初始化函数
for i=1:length
r = rand();
result(i) = round(r);
end
function y = Dec(a,b,x,L) %二进制编码转换为十进制编码
base = 2.^((L-1):-1:0);
y = dot(base,x);
y = a + y*(b-a)/(2^L-1);

⑸ 遗传算法中如何通过一个假设的交叉点找到另一个假设可能的交叉点

由于遗传算法是随机算法,所以变异点和交叉点可以随机产生,当然也可以加入一些判断经验。

⑹ 求助,两条三维直线求交点的算法,最好有C++

这里假设是点向式,给定直线上一点(x1,y1,z1)和向量(m1,n1,p1)确定一条直线
对于两条直线,就是求方程组:
[m1m2|x1-x2]
[n1n2|y1-y2]
[p1p2|z1-z2]
的解。
如果有解(t1,t2),那么(x1+m1*t1,y1+n1*t1,z1+p1*t1)就是一个交点
求解线性方程组有很多方法,这里因为只有三个方程,可以直接用克莱默法则解
#include<iostream>
std::pair<double,double>dd(doublea,doubleb,
doublec,doubled,doublem,doublen);
voidmain(){
doublem1,n1,p1,x1,y1,z1;
doublem2,n2,p2,x2,y2,z2;
std::cin>>m1>>n1>>p1>>x1>>y1>>z1;
std::cin>>m2>>n2>>p2>>x2>>y2>>z2;
std::pair<double,double>answer;
constdoubleepsilon=1E-2;
//求解直线(x-x1)/m1=(y-y1)/n1=(z-z1)/p1和(x-x2)/m2=(y-y2)/n2=(z-z2)/p2的交点
if(fabs(m2*n2-n1*m2)<epsilon&&fabs(m1*p2-p1*m2)<epsilon){
if(fabs(m1*(y1-y2)-n1*(x1-x2))<epsilon&&fabs(m1*(z1-z2)-p1*(x1-x2))<epsilon)
std::cout<<"直线平行完全重合"<<std::endl;
else
std::cout<<"直线平行不相交"<<std::endl;
}
elseif(fabs(m1*n2-n1*m2)>epsilon){
answer=dd(m1,n1,m2,n2,x1-x2,y1-y2);
if(p1*answer.first+p2*answer.second-(z1-z2)<epsilon){
std::cout<<answer.first<<" "<<answer.second<<std::endl;
std::cout<<"找到!x="<<x1+m1*answer.first<<"y="<<y1+n1*answer.second<<std::endl;
}
elsestd::cout<<"无解"<<std::endl;
}
elseif(fabs(m1*p2-p1*m2)>epsilon){
answer=dd(m1,p1,m2,p2,x1-x2,z1-z2);
if(fabs(n1*answer.first+n2*answer.second-(z1-z2))<epsilon){
std::cout<<"找到!x="<<x1+m1*answer.first<<"y="<<y1+n1*answer.second<<std::endl;
}
elsestd::cout<<"无解"<<std::endl;
}
elsestd::cout<<"出错"<<std::endl;
}
std::pair<double,double>dd(doublea,doubleb,
doublec,doubled,doublem,doublen){
returnstd::pair<double,double>((m*d-c*n)/(a*d-c*b),(a*n-b*m)/(a*d-c*b));
}

热点内容
php判断postget 发布:2025-05-14 15:34:24 浏览:357
linux查看电脑配置 发布:2025-05-14 15:32:07 浏览:317
军用压缩水 发布:2025-05-14 15:27:19 浏览:26
win7c盘加密 发布:2025-05-14 15:04:49 浏览:511
dm码编程 发布:2025-05-14 15:03:56 浏览:405
apache加密 发布:2025-05-14 14:49:13 浏览:970
安卓什么软件苹果不能用 发布:2025-05-14 14:49:03 浏览:772
jsoupjava 发布:2025-05-14 14:38:00 浏览:888
影豹选哪个配置最好 发布:2025-05-14 14:28:50 浏览:256
定期预算法的 发布:2025-05-14 14:24:08 浏览:895