MATLAB求解最小球覆蓋問題

2022-03-10 07:11:47 字數 3520 閱讀 2669

目錄

三、**展示

四、結果展示

五、參考資料

1. 理論依據

定理:如果點p不在集合s的最小覆蓋球內,則p一定在s∪的最小覆蓋球上。

根據這個定理,我們可以分三次確定前i個點的最小覆蓋圓。

2. 偽**

圓 c;

for(i=1 to n)

; for(j=1 to i-1)

;for(k=1 to j-1)}}}}}

對於這個演算法只需要三個模式完全相同的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),則有:

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);

endend

endend

endend

endo=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]

小球稱重問題求解

題目論述 12個長相一樣的球中僅有 1個球與其他球質量不同,且不確定是重還是輕。請用天枰進行不超過三次的稱重,檢測出是哪個球與眾不同,並且要得出是重還是輕的結論。為敘述方做如下定義。定義1 與眾不同的球為x球,11個相同的球為 o球,若與眾不同的球比其他 11個球重,則為重球,否則為輕球。定義2 稱...

POJ 最小球覆蓋 模擬退火

最小球覆蓋 用半徑最小的球去覆蓋所有點。純粹的退火演算法,是搞不定的,精度不夠,不然就會tle,根本跑不出答案來。任取一點為球心,然後一點點靠近最遠點。其實這才是最主要的。因為 4個點確定乙個球,也就是說,這個球,會慢慢穩定,每次用乙個點到最遠的點的距離去靠近,怎麼靠近,玄學距離 再在這個基礎上乘以...

最小覆蓋問題

acm模版 最小路徑覆蓋o n 3 路徑覆蓋 就是在圖中找一些路經,使之覆蓋了圖中的所有頂點,且任何乙個頂點有且只有一條路徑與之關聯。最小路徑覆蓋 就是找出最少的路徑條數,使之成為p的乙個路徑覆蓋。路徑覆蓋與二分圖匹配的關係 最小路徑覆蓋 p 最大匹配數 其中最大匹配數的求法是把p中的每個頂點pi分...