@

一、题目描述

最小圆覆盖是寻找能够覆盖平面给定的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求解最小球覆盖问题相关推荐

  1. python调用求解器SCIP求解设施选址覆盖问题

    文章目录 1. 设施选址集合覆盖问题 2. 算法实现 2.1 测试数据集 OR-Library 2.2 python调用SCIP求解设施选址覆盖问题完整代码: 2.3 数据结果 参考文献 1. 设施选 ...

  2. POJ 2069最小球覆盖 HDU3007最小圆覆盖【模拟淬火算法】

    POJ 2069最小球覆盖 1.给定N个三维点,要求覆盖这些点的最小球半径: 2.采用模拟淬火算法,随机选取一个点作为初始解,然后不断向当前最远的点靠近: 3.这是一个不断调整的过程,对应模拟淬火算法 ...

  3. POJ-2069 Super Star(最小球覆盖)

    POJ-2069 Super Star 题意: 给你n个点,求覆盖所有点的最小球的半径 4<=n<=30 题解: 求最小球覆盖的步骤: (1)对于一个点:球心就是这个点,且半径无穷小. ( ...

  4. matlab模拟退火最小球覆盖,【模板】模拟退火 费马点以及最小球覆盖

    最近学了一波模拟退火.个人感觉,就是随机算法,然后我们的目标点,一开始温度T高的时候会移动的剧烈,T小的时候移动的缓和(所以这就是为什么每一次移动的距离都是乘T).然后真正的模拟退火是如果当前的tem ...

  5. 【转】动态模型及其求解介绍–番外篇

    上一篇文章(中篇)里 面,我用的示意图是因子图,而里面也出现了Psi函数,本来应该当时就解释清楚的,但实在没有精力写那么多东西,所以就想放到下篇讲的.后来发现,讲条件 随机场要结合有向无向图和inde ...

  6. GAMS系列分享12—GAMS基础知识——模型和求解

    介绍模型及求解的相关问题 目录 1,模型的分类 2,模型声明和定义语法 3,solve语句 4 有多个solve语句的程序 4.1一个简单的形式:文件中建立3个模型,并用3个solve语句进行求解. ...

  7. 数学建模:整数规划示例模型 (Python 求解)

    目录 例 1 : 选课策略模型 1. 为了选修课程门数最少, 应学习哪些课程? 建立 0-1 规划模型 Python 求解 2. 选修课程最少时, 为了学分尽量多, 应学习哪些课程? 例 2 : 装箱 ...

  8. 目标规划模型:求解思路、序贯式算法

    目录 1.线性规划的局限性 2.实际决策中,衡量方案优劣考虑多个目标 3.目标规划(Goal Programming) 4.求解思路      (1)加权系数法          (2)优先等级法  ...

  9. 古诺双寡头模型MATLAB求解(博弈论)

    古诺双寡头模型MATLAB求解(博弈论) 基本概念 古诺竞争模型(也称古诺模型)是早期的寡头垄断模型.它是法国经济学家古诺于1838年提出的. 古诺模型的假定是:市场上有A.B两个厂商生产和销售相同的 ...

最新文章

  1. No such file or directory: jupyter-1.0.0.dist-info\\METADATA
  2. java里冒泡排序编程案例_java编程题:用Java实现一个冒泡排序算法
  3. L2-001 紧急救援-团体程序设计天梯赛GPLT
  4. java中的Calendar
  5. python算法书推荐-你也能看得懂的Python算法书
  6. ce测试数据文章ce测试数据文章ce测试数据文章
  7. Mysql数据库的简单备份与还原_史上最简单的MySQL数据备份与还原教程
  8. 为什么那么好的女孩子还单身?
  9. Bdsyn百度手机助手是何物,它是怎样神不知鬼不觉地安装到你的电脑里的?
  10. fl如何保存再次打开_「Excel技巧」Excel2016如何将自己设计的图表存为模板反复使用?...
  11. HTML5中本地储存概念是什么,什么优点 ,与cookie有什么区别?
  12. react实现上传文件进度条功能_React.js 可拖放文件的上传表单(支持多文件和进度显示)...
  13. 关于 Unity 版本升级后可能会引起偶发光照图错乱的问题
  14. debian9.8与主机共享问题
  15. c++ ado操作mysql_利用ADO在C++下操作access数据库
  16. 分享一篇SCCM软件更新的故障排除
  17. 《机器人学导论》-《计算多体动力学》两本教材角速度传递的理解
  18. 网络编程中,同步传输和异步传输有什么区别
  19. 在百度上班也太太太太太太……还行吧!
  20. 三网融合不可忽视的互联网力量

热门文章

  1. Cent OS几个好玩的命令
  2. 小鸡手柄android,简便易懂的连接方式_小鸡 Gamesir-G3_DIY攒机手柄-中关村在线
  3. HDU - 7125 Master of Shuangpin
  4. SpringBoot设置默认主页
  5. iOS开发中一些有用的小代码
  6. 陪审团问题_Oraclevs谷歌–陪审团僵局? 部分裁决? str?
  7. jsp页面之间传值总结
  8. Docker超详细的入门学习通俗易懂(第三讲)
  9. 基于小程序的小区物业管理平台开发笔记
  10. 一篇文章普及各种ios基本知识