下山单纯形法实现中指针引发数组值异常问题求助
下山单纯形法中指针排序导致数组值被覆盖的问题排查与解决
问题根源分析
核心问题出在sortSize函数中确定中间指针order[1]的逻辑:
- 你当前通过比较函数值
func(order[0])和func(order[2])来筛选中间元素,这种方式存在两个致命缺陷:- 函数值可能重复:如果不同点代入Rosenbrock函数后得到相同结果,会导致判断逻辑误判,让
order[1]与order[0]/order[2]指向同一个数组。 - 指针绑定错误:当
order[0]和order[2]确定后,你应该直接选择未被选中的第三个指针作为order[1],而非通过函数值二次判断。函数值相等时,bp1 != func(order[0])这类条件会失效,导致order[1]错误绑定到已选中的指针(比如ph),后续调用update时会让两个数组指向同一块内存,最终被赋值为相同内容。
- 函数值可能重复:如果不同点代入Rosenbrock函数后得到相同结果,会导致判断逻辑误判,让
解决方案
修改sortSize函数中order[1]的赋值逻辑,直接通过指针本身的地址判断哪个指针未被选入order[0]和order[2]——每个数组的首地址是唯一的,不会出现冲突,能精准定位中间指针。
修改后的代码示例
double ** sortSize(double * p1p, double * p2p, double * p3p, double (func)(double *)){ static double * order[3]; double bp1 = func(p1p); double bp2 = func(p2p); double bp3 = func(p3p); // 确定最大值对应的指针(order[2]) if (bp1 >= bp2 && bp1 >= bp3) { order[2] = p1p; } else if (bp2 >= bp3) { order[2] = p2p; } else { order[2] = p3p; } // 确定最小值对应的指针(order[0]) if (bp1 <= bp2 && bp1 <= bp3) { order[0] = p1p; } else if (bp2 <= bp3) { order[0] = p2p; } else { order[0] = p3p; } // 确定中间值对应的指针(order[1]):直接选择未被选中的第三个指针 if (p1p != order[0] && p1p != order[2]) { order[1] = p1p; } else if (p2p != order[0] && p2p != order[2]) { order[1] = p2p; } else { order[1] = p3p; } return order; }
补充说明
- 用指针地址直接比较(
p1p != order[0])完全规避了函数值相等带来的误判,逻辑更可靠。 - 将原三元表达式拆分为if-else结构,代码可读性更强,便于后续调试和维护。
内容的提问来源于stack exchange,提问作者smewai
相关产品推荐
相关产品推荐

