最小覆盖模型matlab_MATLAB求解最小球覆盖问题
@
一、題目描述
最小圓覆蓋是尋找能夠覆蓋平面給定的n個離散點的最小圓。該問題存在線性時間算法,即復雜度是O(n)。提供參考文獻。編程實現三維最小球覆蓋的一個算法。
二、算法分析
1. 理論依據
定理:如果點p不在集合S的最小覆蓋球內,則p一定在S∪{p}的最小覆蓋球上。
根據這個定理,我們可以分三次確定前i個點的最小覆蓋圓。
1.令前i?1個點的最小覆蓋球為C
2.如果第i個點在C內,則前i個點的最小覆蓋球也是C
3.如果不在,那么第i個點一定在前i個點的最小覆蓋球上,接著確定前i?1個點中還有哪兩個在最小覆蓋球上。因此,設當前球心為Pi,半徑為0,做固定了第i個點的前i個點的最小球覆蓋。
4.固定了一個點:不停地在范圍內找到第一個不在當前最小球上的點Pj,設當前球心為(Pi+Pj)/2,半徑為∣PiPj∣/2,做固定了兩個點的,前j個點外加第i個點的最小球覆蓋。
5.固定了兩個點:不停地在范圍內找到第一個不在當前最小球上的點Pk,設當前球為Pi,Pj,Pk的外接球。
2. 偽代碼
圓 C;
for(i=1 to n)
{
if(P[i] 不在 C 內)
{
C = {P[i], 0};
for(j=1 to i-1)
{
if(P[j] 不在 C 內)
{
C = {0.5*(P[i]+P[j]), 0.5*dist(P[i], P[j])};
for(k=1 to j-1)
{
if(P[k] 不在 C 內)
{
C = 外接球(P[i], P[j], P[k]);
}
}
}
}
}
}
對于這個算法只需要三個模式完全相同的for循環就可以搞定,還有一個問題是如何求外接球。
3. 外接球算法分析
對于已知的三個點A,B,C,需求其最小外接球。如果三角形ABC為鈍角三角形或直角三角形,球心M即為最長邊的中點,半徑R為最長邊的一半。
如果三角形ABC為銳角三角形,其球心M為任意兩邊中垂線的交點。
求銳角三角形的球心M,需要得到中垂線的直線方程。
設A,B,C均為1*3的行向量,則AB中點為P=(A+B)/2,BC中點為Q=(B+C)/2。
設平面ABC的一個法向量為L,且L=(A-B)×(B-C)。(兩向量的叉乘是兩向量的法向量)
設PF=L×(A-B),則PF與AB垂直且PF平行于平面ABC;設QF=L×(B-C),則QF與BC垂直且QF平行于平面ABC。
所以PF與QF分別為AB和BC在平面ABC內的中垂線的平行向量。
因此可以得到中垂線方程:
(Mx-Px)/PFx=(My-Py)/PFy=(Mz-Pz)/PFz
(Mx-Qx)/QFx=(My-Qy)/QFy=(Mz-Qz)/QFz
可以得到球心M(Mx,My,Mz),半徑R=|MA|。
4. 復雜度分析
由于一堆點最多只有3個點確定了最小覆蓋求,因此n個點中每個點參與確定最小覆蓋圓的概率不大于3/n
所以,每一層循環在第i個點處調用下一層的概率不大于3/i
那么設算法的三個循環的復雜度分別為T1(n),T2(n),T3(n),則有:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-wgZBp0Jo-1588649026859)(C:\Users\crjia\AppData\Roaming\Typora\typora-user-images\image-20200504224806385.png)]
不難解得,T1(n)=T2(n)=T3(n)=O(n)
三、代碼展示
min_ball.m(框架部分)
function min_ball
syms a b c;
ooo=[a b c];
o=[0 0 0]; %球心
R=0; %球的半徑
n=input(‘請輸入你想要生成的離散點個數:‘);
t=input(‘請輸入你想要生成的點的范圍(上限):‘);
A=rand(n,3);
B=(2*A-1)*t;
%隨機產生n個離散點,儲存在pot里面
pot=fix(B)+1;
%生成最小球
for i=1:n
if norm(pot(i,:)-o)>R
o = pot(i,:);
R=0;
for j=1:i-1
if norm(pot(j,:)-o)>R
o = (pot(i,:)+pot(j,:))/2;
R=norm(pot(j,:)-o);
for k=1:j-1
if norm(pot(k,:)-o)>R
%最小外接球(補充ball函數)
%ball函數輸入三個點坐標,返回這三個點的最小球的球心坐標
x=pot(i,:);
y=pot(j,:);
z=pot(k,:);
if norm(z-y)^2+4*R^2<=(norm(z-x))^2
ooo=(z+x)/2;
R=norm(z-ooo);
elseif norm(z-x)^2+4*R^2<=(norm(z-y))^2
ooo=(z+y)/2;
R=norm(z-ooo);
else %三個點構成銳角三角形的情況
ooo=ballcenter(x,y,z);
R=norm(z-ooo);
o = ooo;
R=norm(pot(k,:)-o);
end
end
end
end
end
end
end
o=double(o); %保證小數防止mesh出bug
R=double(R);
[q, w, e]=sphere(30);
Q=R*q+o(1);
W=R*w+o(2);
E=R*e+o(3);
subplot(1,3,1)
mesh(Q,W,E)
hold on
%畫n個點
x1=pot(:,1);
y1=pot(:,2);
z1=pot(:,3);
subplot(1,3,2)
scatter3(x1,y1,z1,‘r‘);
hold on
subplot(1,3,3)
mesh(Q,W,E);
alpha(0.8) %設置透明度
shading flat %去掉那道些線
hold on
scatter3(x1,y1,z1,‘r‘);
ballcenter.m(求最小球球心)
function p = ballcenter(x, y, z)
syms a b c;
% 圓的法向量
pf= cross(x-y, x-z);
p12 = (x + y)/2;
p23 = (y + z)/2;
% 求兩條在三角形面內的中垂線的向量
p12f = cross(pf, x-y);
p23f = cross(pf, y-z);
eq1=(a-p12(1))*p12f(2)-(b-p12(2))*p12f(1);
eq2=(a-p12(1))*p12f(3)-(c-p12(3))*p12f(1);
eq3=(a-p23(1))*p23f(2)-(b-p23(2))*p23f(1);
eq4=(a-p23(1))*p23f(3)-(c-p23(3))*p23f(1);
[a,b,c]=solve(eq1,eq2,eq3,eq4,a,b,c);
p=[a b c];
end
四、結果展示
20個點,范圍[-10,10]
30個點,范圍[-20,20]
30個點,范圍[-50,50]
40個點,范圍[-100,100]
五、參考資料
[2] LINEAR-TIME ALGORITHMS FOR LINEAR PROGRAMMING IN R3 AND RELATED PROBLEMS*
NIMROD MEGIDDOt
原文:https://www.cnblogs.com/rorschach2/p/12829990.html
總結
以上是生活随笔為你收集整理的最小覆盖模型matlab_MATLAB求解最小球覆盖问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一些做“飞卡智能车”时候的总结
- 下一篇: 基于matlab的目标检测的基本思路