线性规划求解点云最大内接圆

欢迎关注更多精彩
关注我,学习常用算法与数据结构,一题多解,降维打击。

本期话题:利用线性规划求解点云最大内接圆

参考资料:

  • Tschebyscheff approximation for the calculation of maximum inscribed minimum circumscribed geometry elements and form deviations 利用切比雪夫范数优化最值
  • General solution for Tsebyshev approximation of form elements in coordinate measurement 将优化最值问题转化成线性规划问题

内容简介

  • 问题提出
  • 模型建立
  • 算法调研
  • 算法实现
  • 测试

问题提出

在2D平面上给定一些点,整体形状类似于圆。求一个圆心在点云内部使得所有点都在圆外面,要求半径最大的圆。
在这里插入图片描述
虚线为点云,实线为要求的圆。

模型建立

给定圆心(x0, y0), 所有点到圆心的距离最小值就是圆的半径。

能量方程 R = f ( x 0 , y 0 ) = M I N i = 1 n    d i 能量方程R=f(x0,y0) = \overset n{\underset {i=1}{MIN}}\;d_i 能量方程R=f(x0,y0)=i=1MINndi

d i = ( x i − x 0 ) 2 + ( y i − y 0 ) 2 d_i = \sqrt{(x_i-x_0)^2+(y_i-y_0)^2} di=(xix0)2+(yiy0)2

求解过程就是优化x0,y0使得R最大。

算法调研

上述能量方程复杂的地方在于最小值不好直接表示。

切比雪夫范数方法

在Tschebyscheff approximation for the calculation of maximum inscribed minimum circumscribed geometry elements and form deviations 提到可以使用切比雪夫范数来表示。

具体如下

M I N i = 1 n    d i 近似于 [ ∑ i = 1 n d i 1 / p ] p , p 是一个比较大的值。 \overset n{\underset {i=1}{MIN}}\;d_i 近似于 \left [ \displaystyle \sum_{i=1}^nd_i^{1/p} \right]^p, p是一个比较大的值。 i=1MINndi近似于[i=1ndi1/p]p,p是一个比较大的值。

该方法可以使用梯度下降法等方法求解最值,过程可能比较复杂个人不喜欢。

线性规划

沿着上述文章的引用找了很多文章,发现了一个比较优美的方法。

General solution for Tsebyshev approximation of form elements in coordinate measurement 将优化最值问题转化成线性规划问题

文章中介绍了通过一阶泰勒展开,引入极小量的方式,将问题转化为线性规划问题,从而使用单纯形法进行迭代求解。

化整为零

设 a = ( x 0 , y 0 ) , d i = F ( x i ;   a ) , 引入 Γ = M I N i = 1 n    d i 设a=(x_0, y_0), d_i=F(x_i;\ a), 引入\Gamma=\overset n{\underset {i=1}{MIN}}\;d_i a=(x0,y0),di=F(xi; a),引入Γi=1MINndi

根据上述定义,可以将原来的最值问题转化为下述条件

对于所有点应该满足

F ( x i ;   a ) ≥ Γ F(x_i;\ a)\ge \Gamma F(xi; a)Γ

我们可以通过小量迭代慢慢增大Γ

增量基本原理

设 a = ( a 0 , a 1 , . . . , a n ) 、 Γ 是待求解变量, a ^ , Γ ^ 是初始给定值, a = a ^ + Δ a , Γ = Γ ^ + Δ Γ .   Δ a 、 Δ Γ 是我们每次迭代后移动的量 设 a=(a_0, a_1,...,a_n)、\Gamma 是待求解变量,\widehat {a}, \widehat {\Gamma} 是初始给定值,a = \widehat {a} +\Delta a, \Gamma = \widehat {\Gamma} +\Delta \Gamma. \ \Delta a、 \Delta \Gamma 是我们每次迭代后移动的量 a=(a0,a1,...,an)Γ是待求解变量,a ,Γ 是初始给定值,a=a +Δa,Γ=Γ +ΔΓ. ΔaΔΓ是我们每次迭代后移动的量

定义距离函数为 F ( x , a ) , d i = F ( x i , a ) , 进行泰勒 1 阶展开, F ( x , a ) = F ( x , a ^ ) + ∂ F ∂ a ^ Δ a = F ( x , a ^ ) + J Δ a 定义距离函数为 F(x, a), d_i = F(x_i, a), 进行泰勒1阶展开, F(x, a) = F(x, \widehat a) + \frac {\partial F}{\partial \widehat a}\Delta a = F(x, \widehat a) + J\Delta a 定义距离函数为F(x,a),di=F(xi,a),进行泰勒1阶展开,F(x,a)F(x,a )+a FΔa=F(x,a )+JΔa

每次迭代,其实就是希望通过调整 Δ a , Δ Γ ≥ 0 使得 F ( x , a ^ ) + J Δ a ≥ Γ ^ + Δ Γ . 每次迭代,其实就是希望通过调整\Delta a, \Delta \Gamma\ge0 使得 F(x, \widehat a) + J\Delta a \ge \widehat {\Gamma} +\Delta \Gamma. 每次迭代,其实就是希望通过调整Δa,ΔΓ0使得F(x,a )+JΔaΓ +ΔΓ.

J = [ ∂ F ( x 0 , a ^ ) ∂ a 0 ∂ F ( x 0 , a ^ ) ∂ a 1 . . . ∂ F ( x 0 , a ^ ) ∂ a n ∂ F ( x 1 , a ^ ) ∂ a 0 ∂ F ( x 1 , a ^ ) ∂ a 1 . . . ∂ F ( x 1 , a ^ ) ∂ a n . . . . . . . . . . . . ∂ F ( x n , a ^ ) ∂ a 0 ∂ F ( x n , a ^ ) ∂ a 1 . . . ∂ F ( x n , a ^ ) ∂ a n ] J = \begin {bmatrix} \frac {\partial F(x_0, \widehat {a})} {\partial a_0} & \frac {\partial F(x_0, \widehat {a})} {\partial a_1} & ...& \frac {\partial F(x_0, \widehat {a})} {\partial a_n} \\ \\ \frac {\partial F(x_1, \widehat {a})} {\partial a_0} & \frac {\partial F(x_1, \widehat {a})} {\partial a_1} & ...& \frac {\partial F(x_1, \widehat {a})} {\partial a_n} \\\\ ... & ... & ...& ... \\ \\ \frac {\partial F(x_n, \widehat {a})} {\partial a_0} & \frac {\partial F(x_n, \widehat {a})} {\partial a_1} & ...& \frac {\partial F(x_n, \widehat {a})} {\partial a_n} \end {bmatrix} J= a0F(x0,a )a0F(x1,a )...a0F(xn,a )a1F(x0,a )a1F(x1,a )...a1F(xn,a )............anF(x0,a )anF(x1,a )...anF(xn,a )

F ( x , a ^ ) = [ d 1 d 2 . . . d m ] F(x, \widehat a) = \begin {bmatrix} d_1 \\ d_2 \\... \\ d_m \end {bmatrix} F(x,a )= d1d2...dm

整体问题就转化为线性规划问题

m a x      Δ Γ s . t .     F ( x i , a ) + J Δ a ≥ Γ + Δ Γ , ( i = 1 , 2... n ) Δ Γ ≥ 0 \begin {array}{c}max \ \ \ \ \Delta {\Gamma}\\ s.t.\ \ \ F(x_i, a) + J\Delta a \ge \Gamma +\Delta \Gamma, (i=1,2...n)\\ \Delta \Gamma \ge0\end{array} max    ΔΓs.t.   F(xi,a)+JΔaΓ+ΔΓ,(i=1,2...n)ΔΓ0

求解出以后更新a, Γ。

算法描述

将线性规划模型应用于圆拟合

m a x      Δ Γ s . t .     F ( x i , { x 0 , y 0 } ) + J ⋅ ( Δ x 0 , Δ y 0 ) ≥ Γ + Δ Γ , ( i = 1 , 2... n ) Δ Γ ≥ 0 \begin {array}{c}max \ \ \ \ \Delta {\Gamma}\\ s.t.\ \ \ F(x_i, \{x_0, y_0\}) + J \cdot (\Delta x_0, \Delta y_0) \ge \Gamma +\Delta \Gamma, (i=1,2...n)\\ \Delta \Gamma \ge0\end{array} max    ΔΓs.t.   F(xi,{x0,y0})+J(Δx0,Δy0)Γ+ΔΓ,(i=1,2...n)ΔΓ0

上述条件还不能直接用单纯形求解,要转化为线性规划点击前往问题

需要对 Δ x 0 , Δ y 0 拆解,要求变量都要大于等于 0 需要对\Delta x_0, \Delta y_0 拆解,要求变量都要大于等于0 需要对Δx0,Δy0拆解,要求变量都要大于等于0

m a x      Δ Γ s . t .     J i ⋅ ( Δ x 0 + - Δ x 0 - , Δ y 0 + - Δ y 0 - ) − Δ Γ ≥ Γ - d i , ( i = 1 , 2... n ) Δ x 0 + , Δ x 0 − , Δ y 0 + , Δ y 0 − , Δ Γ ≥ 0 \begin {array}{c}max \ \ \ \ \Delta {\Gamma}\\ s.t.\ \ \ J_i \cdot (\Delta x_0^+-\Delta x_0^-, \Delta y_0^+-\Delta y_0^-) -\Delta \Gamma\\\ge \Gamma-d_i, (i=1,2...n)\\ \Delta x_0^+, \Delta x_0^-, \Delta y_0^+, \Delta y_0^-,\Delta \Gamma \ge0\end{array} max    ΔΓs.t.   Ji(Δx0+Δx0,Δy0+Δy0)ΔΓΓdi,(i=1,2...n)Δx0+,Δx0,Δy0+,Δy0,ΔΓ0

Ji, di的计算。
d i = ( x i − x 0 ) 2 + ( y i − y 0 ) 2 d_i = \sqrt{(x_i-x_0)^2+(y_i-y_0)^2} di=(xix0)2+(yiy0)2

对2个未知数求导结果如下:

∂ d i ∂ x 0 = 1 2 ( x i − x 0 ) 2 + ( y i − y 0 ) 2 ⋅ ( x i − x 0 ) ⋅ − 1 = − ( x i − x 0 ) / d i \frac {\partial d_i} {\partial x_0}=\frac {1} {2 \sqrt{(x_i-x_0)^2 + (y_i-y_0)^2}}\cdot(x_i-x_0)\cdot -1 = -(x_i-x_0)/d_i x0di=2(xix0)2+(yiy0)2 1(xix0)1=(xix0)/di

∂ d i ∂ y 0 = 1 2 ( x i − x 0 ) 2 + ( y i − y 0 ) 2 ⋅ ( y i − y 0 ) ⋅ − 1 = − ( y i − y 0 ) / d i \frac {\partial d_i} {\partial y_0}=\frac {1} {2 \sqrt{(x_i-x_0)^2 + (y_i-y_0)^2}}\cdot(y_i-y_0)\cdot -1 = -(y_i-y_0)/d_i y0di=2(xix0)2+(yiy0)2 1(yiy0)1=(yiy0)/di

求解上述方程后,更新解

x 0 = x 0 + Δ x 0 + - Δ x 0 - y 0 = y 0 + Δ y 0 + - Δ y 0 - Γ = Γ + Δ Γ \begin {array}{l}x_0 = x_0 +\Delta x_0^+-\Delta x_0^-\\ y_0 = y_0 +\Delta y_0^+-\Delta y_0^-\\ \Gamma=\Gamma+\Delta \Gamma \end{array} x0=x0+Δx0+Δx0y0=y0+Δy0+Δy0Γ=Γ+ΔΓ

初始值确定可以使用高斯拟合2D圆点击前往

算法实现

代码链接:https://gitcode.com/chenbb1989/3DAlgorithm/tree/master/CBB3DAlgorithm/Fitting

算法步骤

  • 高斯拟合初始值
  • 求解d, J
  • 构建线性规划方程
  • 求解后更新解
  • 迭代致收敛

代码框架基类设计

参考高斯拟合框架点击前往

一次迭代实现

添加了线性规划求解过程


	Eigen::VectorXd FittingBase::findNext(const std::vector<Eigen::Vector3d>& points)
	{
		using namespace Eigen;
		Eigen::VectorXd xp;
		Eigen::VectorXd D = getDArray(points);
		Matrix J = Jacobi(points);
		if (ft == FittingType::CHEBYSHEV) {
			BasicTools::Simplex::LPS lps;
			int n = J.rows(), m = J.cols() * 2 + 1;
			std::vector<double> c(m,0); 
			c[m-1] = 1;// 令最后一位为gamma
			
			lps.InitProb(m, c, BasicTools::Simplex::MAX);
			// 添加条件
			std::vector<double> x(m, -1);
			for (int i = 0; i < n; ++i) {
				// 系数 J(i, 0), -J(i, 0),J(i, 1), -J(i, 1), ...,-1
				for (int j = 0; j < J.cols(); ++j) {
					x[j * 2] = J(i, j);
					x[j * 2 + 1] = -x[j * 2];
				}
				lps.AddCondition(x, gamma - D(i), BasicTools::Simplex::GE);
			}
			auto res = lps.solve();
			xp.resize(J.cols()+1);
			xp.setZero();
			/*std::cout << res.Z << std::endl;
			std::cout << res.rt << std::endl;*/
			if (res.rt == BasicTools::Simplex::NoSolution || res.rt == BasicTools::Simplex::NoUpBound) return xp;
				xp(J.cols()) = res.x.back();
				for (int i = 0; i < J.cols(); ++i) xp(i) = res.x[i * 2] - res.x[i * 2 + 1];
			//}
		}
		else {
			// 求解 Jp = -D  https://blog.csdn.net/ABC_ORANGE/article/details/104489257/
			xp = J.colPivHouseholderQr().solve(-D);
			// xp = J.lu().solve(-D);
		}
		return xp;
	}

代码实现

核心代码

#include "MaxInCircleFitter.h"
#include "../gauss/FittingCircle2D.h"
#include <Eigen/Dense>


namespace Chebyshev {
	double F(Fitting::Circle2D circle, const Point& p)
	{
		return Eigen::Vector2d(p.x() - circle.center.x(), p.y() - circle.center.y()).norm();
	}

	double GetError(Fitting::Circle2D circle, const std::vector<Eigen::Vector3d>& points)
	{
		double err = -1;
		for (auto& p : points) {
			double d = F(circle, p);
			if (err < 0 || d < err) err = d;
		}

		return err;
	}
	Fitting::Matrix MaxInCircleFitter::Jacobi(const std::vector<Eigen::Vector3d>& points)
	{
		Fitting::Matrix J(points.size(), 2);
		for (int i = 0; i < points.size(); ++i) {
			auto& p = points[i];
			double ri = F(p);
			J(i, 0) = -(p.x() - circle.center.x()) / ri;
			J(i, 1) = -(p.y() - circle.center.y()) / ri;
		}
		return J;
	}

	void MaxInCircleFitter::afterHook(const Eigen::VectorXd& xp)
	{
		circle.center += Eigen::Vector2d(xp(0), xp(1));
		circle.r += xp(2);
		gamma = circle.r;
	}
	Eigen::VectorXd MaxInCircleFitter::getDArray(const std::vector<Eigen::Vector3d>& points)
	{
		Eigen::VectorXd D(points.size());
		for (int i = 0; i < points.size(); ++i)D(i) = F(points[i]);
		return D;
	}
	bool MaxInCircleFitter::GetInitFit(const std::vector<Eigen::Vector3d>& points)
	{
		if (points.size() < 3)return false;

		Fitting::FittingBase* fb = new Gauss::FittingCircle2D();
		auto err = fb->Fitting(points, &circle);
		delete fb;
		if (err < 0)return false;
		// 计算gamma
		gamma = GetError(points);
		circle.r = gamma;
		return true;
	}
	double MaxInCircleFitter::F(const Eigen::Vector3d& p)
	{
		return Chebyshev::F(circle, p);
	}
	double MaxInCircleFitter::GetError(const std::vector<Eigen::Vector3d>& points)
	{
		return Chebyshev::GetError(circle, points);
	}
	void MaxInCircleFitter::Copy(void* ele)
	{
		memcpy(ele, &circle, sizeof(Fitting::Circle2D));
	}
	MaxInCircleFitter::MaxInCircleFitter()
	{
		ft = Fitting::FittingType::CHEBYSHEV;
	}
}

测试

测试对比对象是最小区域法结果。
最小区域法
最小区域法是用2个同心圆去逼近点云使得δ最小。
x0,y0为圆心,r是大圆和小圆半径中间值。
小圆的半径r0=r-δ/2。
可知最大内接圆会比最小区域法的小圆稍微大一点点。

t1
最小区域法结果
x0:400.00000000000000000000
y0:390.00000000000000000000
r:20.00000000000000000000
δ:0.05000000000000000000
小圆半径 = 19.975

最大内接圆
x0:399.99855950184064568
y0:389.99798947515603231
r:19.975101964904933283

t2
最小区域法结果
x0:-200.00000000000000000000
y0:180.00000000000000000000
r:200.00000000000000000000
δ:0.02200000000000000000
小圆半径 = 199.989

最大内接圆
x0:-199.99277648219526782
y0:179.99999999999997158
r:199.98900013045519586

t3
最小区域法结果
x0:-250.00000000000000000000
y0:-250.00000000000000000000
r:125.00000000000000000000
δ:0.00500000000000000000
小圆半径 = 124.9975

最大内接圆
x0:-250.00127221264907007
y0:-250
r:124.9975000064742261



本人码农,希望通过自己的分享,让大家更容易学懂计算机知识。创作不易,帮忙点击公众号的链接。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/397786.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

风云温商在湖北:黄卓仁会长的商业传奇

黄卓仁,一位来自柳市的传奇人物,他的人生就像一部精彩纷呈的商业传奇,充满了挑战与机遇。他是1966年出生的优秀民营企业家,也是一位充满激情与智慧的领导者。今天,让我们一起走进黄卓仁的世界,感受他那不凡的人生历程。 首先,让我们了解一下黄卓仁的基本情况。他是温州人,出生…

[极客大挑战2019]upload

该题考点&#xff1a;后缀黑名单文件内容过滤php木马的几种书写方法 phtml可以解析php代码&#xff1b;<script language"php">eval($_POST[cmd]);</script> 犯蠢的点儿&#xff1a;利用html、php空格和php.不解析<script language"php"&…

492. Construct the Rectangle(构造矩形)

问题描述 作为一位web开发者&#xff0c; 懂得怎样去规划一个页面的尺寸是很重要的。 所以&#xff0c;现给定一个具体的矩形页面面积&#xff0c;你的任务是设计一个长度为 L 和宽度为 W 且满足以下要求的矩形的页面。要求&#xff1a; 你设计的矩形页面必须等于给定的目标面…

基于Springboot+Vue的超市管理系统源码

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会经济的发展和…

文明的差分例题

解法一&#xff1a; 暴力 #include<iostream> #include<vector> #define endl \n using namespace std; void addNum(vector<int>& a) {int l, r, x;cin >> l >> r >> x;for (int i l; i < r; i)a[i] x; } void minusNum(vecto…

工具分享:在线键盘测试工具

在数字化时代&#xff0c;键盘作为我们与计算机交互的重要媒介之一&#xff0c;其性能和稳定性直接影响到我们的工作效率和使用体验。为了确保键盘的每个按键都能正常工作&#xff0c;并帮助用户检测潜在的延迟、连点等问题&#xff0c;一款优质的在线键盘测试工具显得尤为重要…

GC调优学习

一.常见工具P62P63 1.jstat 2.visualvm插件 3.Prometheus Grafana 4.GC日志 5.GC Viewer 6.GCeasy&#xff08;强推&#xff09; 二.常见的GC模式P64 三.GC调优 1.优化基础JVM参数P65 2.减少对象产生 看以前视频&#xff0c;内存泄露相关 3.垃圾回收器的选择P66 4.优化垃圾回…

性能测试、负载测试、压力测试、稳定性测试简单区分

是一个总称&#xff0c;可细分为性能测试、负载测试、压力测试、稳定性测试。 性能测试 以系统设计初期规划的性能指标为预期目标&#xff0c;对系统不断施加压力&#xff0c;验证系统在资源可接受范围内&#xff0c;是否能达到性能瓶颈。 关键词提取理解 有性能指标&#…

Java核心-面向对象(下)

之前说完了类、对象、方法以及面向对象的三大特性封装、继承和多态&#xff0c;现在来了解一下接口、代码块和一些常见的类如抽象类、包装类等。 一、接口 1、概念 接口&#xff08;Interface&#xff09;&#xff0c;是一种抽象类型&#xff0c;是抽象方法的集合&#xff…

2024年2月12日-2月18日周报

文章目录 1. 本周计划2. 完成情况2.1 论文摘要2.2 数据集2.3 基准测试 3. 总结及收获4. 下周计划 1. 本周计划 阅读论文《 E F W I E^{FWI} EFWI: Multiparameter Benchmark Datasets for Elastic Full Waveform Inversion of Geophysical Properties》 了解一种新型的数据集&…

阿里云OSS和SEC服务器,免费ssl证书申请和安装

一&#xff1a;阿里云OSS证书申请和安装 1创建免费证书等待签发 2验证&#xff0c;复制DNS解析配置 3在主体域名中解析DNS&#xff08;记录复制上面的证书申请配置&#xff09; 4验证域名DNS配置 5下载证书 6安装OSS证书 7上传证书&#xff08;下载的证书解压&#xff09…

【Java中23种设计模式-单例模式2--懒汉式2线程安全】

加油&#xff0c;新时代打工人&#xff01; 简单粗暴&#xff0c;学习Java设计模式。 23种设计模式定义介绍 Java中23种设计模式-单例模式 Java中23种设计模式-单例模式2–懒汉式线程不安全 package mode;/*** author wenhao* date 2024/02/19 09:38* description 单例模式…

vmware-17虚拟机安装教程及版本密钥(保姆级,包含图文讲解,不需注册账户)

文章目录 vmware安装教程一、下载vmware二、安装三、破解密匙 vmware安装教程 一、下载vmware 1.进入VMware官网&#xff1a;https://www.vmware.com/sg/products/workstation-pro.html 2.向下翻找到&#xff0c;如下界面并点击“现在安装” 3.稍事等待以下直到出现以下界面…

【知识整理】简述 Code Review - 代码审查

一、Code Review 简述 为保证上线代码质量&#xff0c;经研究决定0412版本起实行Code Review 。具体操作方式为组织 review 会。提出的优化点需立即执行更改&#xff0c;Review会要求给出调整方式方法。同时为了确保项目或迭代版本的时间&#xff0c;请各开发同学提前做好时间…

【EI会议征稿通知】第五届电子通讯与人工智能国际学术会议(ICECAI 2024)

第五届电子通讯与人工智能国际学术会议&#xff08;ICECAI 2024&#xff09; 2024 5th International Conference on Electronic communication and Artificial Intelligence 第五届电子通讯与人工智能国际学术会议&#xff08;ICECAI 2024&#xff09;将于2024年5月31日-6月…

Linux小程序--进度条

目录 1.知识补充 1.1回车和换行 1.2缓冲区 2.实现倒计时 3.实现进度条 1.知识补充 1.在制作小程序进度条之前&#xff0c;我们先了解一下&#xff0c;回车换行和行缓冲区的概念。 2.动态效果&#xff0c;在同一个位置刷新不同的图像&#xff0c;实现一个倒计时的效果。…

【Flink状态管理(八)】Checkpoint:CheckpointBarrier对齐后Checkpoint完成、通知

文章目录 一. 调用StreamTask执行Checkpoint操作1. 执行Checkpoint总体代码流程1.1. StreamTask.checkpointState()1.2. executeCheckpointing1.3. 将算子中的状态快照操作封装在OperatorSnapshotFutures中1.4. 算子状态进行快照1.5. 状态数据快照持久化 二. CheckpointCoordin…

什么是伪数组 以及伪数组转真数组的方法

什么是伪数组呢&#xff1f; 1.我们先来看看用于接受实参的方法 arguments , 执行代码如下&#xff1a; function fn() { console.log(arguments);}fn(1,2,3,4,5) 这里可以看到&#xff0c;Arguments显示的也有方括号 [1,2,3,4,5...] &#xff0c;但是后面多了一些其他方法&a…

c++类和对象新手保姆级上手教学(中)

前言&#xff1a; 类和对象中篇&#xff0c;这里讲到的前4个默认成员函数&#xff0c;是类和对象中的重难点&#xff0c;许多资料上的讲法都非常抽象&#xff0c;难以理解&#xff0c;所以我作出这篇总结&#xff0c;分享学习经验&#xff0c;以便日后复习。 目录 6个默认成员…

新算法UoT助力AI提问——主动寻求信息,任务完成率提高57.8%

引言&#xff1a;信息寻求在不确定性环境中的重要性 在不确定性环境中&#xff0c;信息寻求的能力至关重要。在许多实际应用中&#xff0c;如医学诊断和故障排除&#xff0c;解决任务所需的信息并非一开始就给出&#xff0c;而需要通过提问后续问题来主动寻求&#xff08;例如…