You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

下山单纯形法实现中指针引发数组值异常问题求助

下山单纯形法中指针排序导致数组值被覆盖的问题排查与解决

问题根源分析

核心问题出在sortSize函数中确定中间指针order[1]的逻辑:

  • 你当前通过比较函数值func(order[0])和func(order[2])来筛选中间元素,这种方式存在两个致命缺陷:
    1. 函数值可能重复:如果不同点代入Rosenbrock函数后得到相同结果,会导致判断逻辑误判,让order[1]与order[0]/order[2]指向同一个数组。
    2. 指针绑定错误:当order[0]和order[2]确定后,你应该直接选择未被选中的第三个指针作为order[1],而非通过函数值二次判断。函数值相等时,bp1 != func(order[0])这类条件会失效,导致order[1]错误绑定到已选中的指针(比如ph),后续调用update时会让两个数组指向同一块内存,最终被赋值为相同内容。

解决方案

修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 05:31:20