日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

最小覆盖模型matlab_MATLAB求解最小球覆盖问题

發布時間:2023/12/15 循环神经网络 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最小覆盖模型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求解最小球覆盖问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。