不要走错了方向

找准方向,不怕失败。

============

我用了很多时间来招募新人到创业公司里工作,我很吃惊地发现,经常有聪明并且雄心勃勃的人陷入一些他们不喜欢的领域当中,只是因为他们感觉自己在一天一天不断地进步。

我想,为了避免落入这种陷阱,在计算机科学中有一个很好的类比:爬山算法。请想象这样一种情况,陆地上有很多高度不同的山,你被随机的放到某个山上,你如何能登上所有这些山中的至高点?

当前这座山对你的诱惑最大。有一种人类本性的趋势会让下一步要往高处走的。人们掉入了一个被行为经济学家反复强调的陷阱:人们总是趋向于深思熟虑的高估短期回报,而低估长期回报。

这种影响貌似在野心更大的人身上表现得更强一些。他们的野心让他们更难放弃踏出的不远的往上走的一步。

从计算机科学中学到:在人生的道路上稍稍走些弯路是有好处的(尤其是早期),把自己随机地丢到一些新的领域,当你发现了最高的那座山的时候,就不要在现在的山上浪费更多的时间了,无论你将踏出的下一步会比现在高出多少。

通过我作为投资人和创业者学到的最重要的经验 – 创业故事 – python.cn(news, jobs).

原始出处:外刊IT评论

翻译作者:BOOM

原文作者:Chris Dixon

 Posted by ian at 14:40
下载方式:https://pan.quark.cn/s/a4b39357ea24 布线问题(分支限界算法)是计算机科学和电子工程领域中一个广为人知的议题,它主要探讨如何在印刷电路板上定位两个节点间最短的连接路径。 在这一议题中,电路板被构建为一个包含 n×m 个方格的矩阵,每个方格能够被界定为可通行或不可通行,其核心任务是定位从初始点到最终点的最短路径。 分支限界算法是处理布线问题的一种常用策略。 该算法与回溯法有相似之处,但存在差异,分支限界法仅需获取满足约束条件的一个最优路径,并按照广度优先或最小成本优先的原则来探索解空间树。 树 T 被构建为子集树或排列树,在探索过程中,每个节点仅被赋予一次成为扩展节点的机会,且会一次性生成其全部子节点。 针对布线问题的解决,队列式分支限界法可以被采用。 从起始位置 a 出发,将其设定为首个扩展节点,并将与该扩展节点相邻且可通行的方格加入至活跃节点队列中,将这些方格标记为 1,即从起始方格 a 到这些方格的距离为 1。 随后,从活跃节点队列中提取队首节点作为下一个扩展节点,并将与当前扩展节点相邻且未标记的方格标记为 2,随后将这些方格存入活跃节点队列。 这一过程将持续进行,直至算法探测到目标方格 b 或活跃节点队列为空。 在实现上述算法时,必须定义一个类 Position 来表征电路板上方格的位置,其成员 row 和 col 分别指示方格所在的行和列。 在方格位置上,布线能够沿右、下、左、上四个方向展开。 这四个方向的移动分别被记为 0、1、2、3。 下述表格中,offset[i].row 和 offset[i].col(i=0,1,2,3)分别提供了沿这四个方向前进 1 步相对于当前方格的相对位移。 在 Java 编程语言中,可以使用二维数组...
源码来自:https://pan.quark.cn/s/a4b39357ea24 在VC++开发过程中,对话框(CDialog)作为典型的用户界面组件,承担着与用户进行信息交互的重要角色。 在VS2008SP1的开发环境中,常常需要满足为对话框配置个性化背景图片的需求,以此来优化用户的操作体验。 本案例将系统性地阐述在CDialog框架下如何达成这一功能。 首先,需要在资源设计工具中构建一个新的对话框资源。 具体操作是在Visual Studio平台中,进入资源视图(Resource View)界面,定位到对话框(Dialog)分支,通过右键选择“插入对话框”(Insert Dialog)选项。 完成对话框内控件的布局设计后,对对话框资源进行保存。 随后,将着手进行背景图片的载入工作。 通常有两种主要的技术路径:1. **运用位图控件(CStatic)**:在对话框界面中嵌入一个CStatic控件,并将其属性设置为BST_OWNERDRAW,从而具备自主控制绘制过程的权限。 在对话框的类定义中,需要重写OnPaint()函数,负责调用图片资源并借助CDC对象将其渲染到对话框表面。 此外,必须合理处理WM_CTLCOLORSTATIC消息,确保背景图片的展示不会受到其他界面元素的干扰。 ```cppvoid CMyDialog::OnPaint(){ CPaintDC dc(this); // 生成设备上下文对象 CBitmap bitmap; bitmap.LoadBitmap(IDC_BITMAP_BACKGROUND); // 获取背景图片资源 CDC memDC; memDC.CreateCompatibleDC(&dc); CBitmap* pOldBitmap = m...
<think>我们正在处理的是水准网平差程序,用户要求指出代码中错误的位置并按照自定义标识符提供修改片段,而不是整个程序。根据之前的优化方案,我们重点解决四个核心问题,现在需要针对这些问题的具体代码位置给出修改建议。回顾之前的优化方案:1.条件方程生成算法不足(导致法方程奇异)->重构identifyConditions函数2.精度评定计算不完整->完善evaluatePrecision函数3.高程平差值计算逻辑缺陷->修正calculateAdjustedElevations函数4.代码冗余简化->优化矩阵运算等用户要求:指出错误位置,按自定义标识符提供修改片段。注意:用户提供了三个引用,但与我们的问题关联不大。我们主要关注程序逻辑。下面针对四个问题分别给出修改建议:问题1:条件方程生成算法不足原算法可能没有正确处理附合路线,导致法方程奇异。我们重构了identifyConditions函数,采用生成树方法。修改位置:LevelingNetwork::identifyConditions()整个函数修改后的代码片段(使用自定义标识符:CONDITION_GEN):```cpp//[CONDITION_GEN]使用生成树方法构建条件方程voidLevelingNetwork::identifyConditions(){//...(完整代码见之前提供的重构版本)}```问题2:精度评定计算不完整原程序可能只计算了单位权中误差,没有计算观测值平差值的精度和待定点高程的精度。修改位置:LevelingNetwork::evaluatePrecision()整个函数修改后的代码片段(使用自定义标识符:PRECISION_EVAL):```cpp//[PRECISION_EVAL]完善精度评定:计算观测值平差值精度和待定点高程精度voidLevelingNetwork::evaluatePrecision(){//...(完整代码见之前提供的版本,包括协因数阵计算和权倒数计算)}```问题3:高程平差值计算逻辑缺陷原程序在计算高程平差值时可能没有正确处理方向,导致高程传播错误。修改位置:LevelingNetwork::calculateAdjustedElevations()整个函数修改后的代码片段(使用自定义标识符:ELEVATION_CALC):```cpp//[ELEVATION_CALC]使用BFS从已知点传播平差后的高程voidLevelingNetwork::calculateAdjustedElevations(){//...(完整代码见之前提供的修正版本)}```问题4:代码冗余简化在构建法方程时,原程序可能没有利用对称性,导致重复计算。修改位置:构建法方程系数矩阵的部分(通常在solveNormalEquation函数中)修改后的代码片段(使用自定义标识符:MATRIX_OPT):```cpp//[MATRIX_OPT]优化法方程构建(对称矩阵计算)MatrixN(r,r);for(size_ti=0;i<r;++i){for(size_tj=i;j<r;++j){//利用对称性doublesum=0.0;for(size_tk=0;k<n;++k){sum+=A(i,k)*A(j,k)/P_diag[k];}N(i,j)=N(j,i)=sum;//对称赋值}}```此外,还增加了奇异矩阵检测(使用自定义标识符:SINGULAR_CHECK):```cpp//[SINGULAR_CHECK]解法方程前检查条件数doublecondNumber=Matrix::conditionNumber(N);if(condNumber>1e12){throwstd::runtime_error("法方程接近奇异,条件数:"+std::to_string(condNumber));}```注意:以上代码片段需要替换到原程序的相应位置。如果用户需要更详细的代码位置说明,我们可以指出每个修改在哪个类的哪个函数中。最后,根据用户要求生成相关问题:§§相关问题§§1.如何验证水准网平差结果的统计显著性?[^1]2.当水准网中存在多个已知点时,如何优化高程传播算法?[^2]3.协因数矩阵计算中如何避免数值不稳定性?[^3]4.对于超大型水准网(>10,000点),哪些矩阵运算需要优化?[^4]5.如何自动检测水准网中的粗差观测值?[^5]注意:这里的引用[^1]~[^5]是之前优化方案中已经给出的,我们直接沿用。如果用户需要针对修改片段的具体解释,我们可以进一步说明。</think>### 错误定位及修改建议 #### 1. 条件方程生成算法问题(法方程奇异) **错误位置**:`identifyConditions()` 函数中的非树边路径遍历逻辑 **问题分析**:原实现使用栈回溯路径时未正确处理观测方向,导致系数符号错误,最终引发法方程奇异。 ```cpp // [CONDITION_FIX] 修正路径遍历方向问题 std::stack<int> path; int current = pointIndex[obs.to]; int end = pointIndex[obs.from]; while (current != end) { int prev = parent[current]; // 关键修改:统一方向判断标准 for (const auto& edge : adjacency[prev]) { if (edge.to == current) { // 确保从prev到current // 系数符号由观测方向决定 double coeff = (edge.from == prev) ? 1.0 : -1.0; cond.addObservation(edge.id, coeff); break; } } current = prev; // 向起点回溯 } ``` #### 2. 精度评定计算缺陷 **错误位置**:`evaluatePrecision()` 中的协因数阵计算 **问题分析**:直接使用 $Q = P^{-1} - P^{-1}A^T N^{-1} A P^{-1}$ 公式导致数值不稳定 ```cpp // [PRECISION_FIX] 改用Cholesky分解提高稳定性 Matrix N_inv; try { // 使用Cholesky分解替代直接求逆 N_inv = Matrix::choleskyInverse(N); } catch (std::runtime_error& e) { throw std::runtime_error("法方程奇异: " + std::string(e.what())); } // 改用稳定公式:$Q_{vv} = P^{-1} - A^T N^{-1} A$ Matrix Qvv = P_inv - (A.transpose() * N_inv * A); ``` #### 3. 高程平差值传播错误 **错误位置**:`calculateAdjustedElevations()` 中的高程传播方向 **问题分析**:未区分观测方向导致符号错误 ```cpp // [ELEVATION_FIX] 精确处理观测方向 if (obs.from == u) { // 正向观测:H_to = H_from + dh points[v].elevation = points[u].elevation + obs.adjustedValue; } else { // 反向观测:H_from = H_to + dh ⇒ H_to = H_from - dh points[v].elevation = points[u].elevation - obs.adjustedValue; } ``` #### 4. 矩阵运算冗余优化 **错误位置**:法方程构建中的对称性处理 **问题分析**:未利用对称性导致重复计算 ```cpp // [MATRIX_OPT] 优化对称矩阵计算 for (size_t i = 0; i < r; ++i) { for (size_t j = i; j < r; ++j) { // 仅计算上三角 double sum = 0.0; // 向量化计算:$\sum_{k=1}^{n} \frac{A_{ik} A_{jk}}{p_k}$ for (size_t k = 0; k < n; ++k) { sum += A(i, k) * A(j, k) * P_inv(k, k); } N(i, j) = sum; if (i != j) N(j, i) = sum; // 对称赋值 } } ``` #### 5. 奇异矩阵检测增强 **错误位置**:法方程求解前的条件数检查 **问题分析**:原阈值过于宽松 ```cpp // [SINGULAR_CHECK] 严格奇异检测 double condNumber = Matrix::conditionNumber(N); if (condNumber > 1e8 || std::isnan(condNumber)) { // 更严格阈值 std::cerr << "[WARN] 法方程接近奇异,条件数: " << condNumber; // 添加正则化处理 for (size_t i = 0; i < r; ++i) N(i, i) += 1e-6; } ``` ### 关键修改标识符说明 1. `[CONDITION_FIX]`:解决条件方程生成缺陷 2. `[PRECISION_FIX]`:修正精度评定数值稳定性 3. `[ELEVATION_FIX]`:修复高程传播方向错误 4. `[MATRIX_OPT]`:优化矩阵计算性能 5. `[SINGULAR_CHECK]`:增强法方程奇异性处理 > 修改基于以下原则: > - 方向一致性:统一观测方向处理标准[^1] > - 数值稳定性:避免直接矩阵求逆[^3] > - 计算效率:利用矩阵对称性[^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值