交叉點演算法
⑴ 遺傳演算法交叉點怎麼定
比較簡單的一個辦法是隨機生成一個整數(范圍在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));
}