C++实现可靠性设计算法时for循环迭代被跳过问题求助
问题成因及修复方案
核心问题1:剪枝逻辑前提不成立
你在pos循环中使用break的逻辑隐含了一个假设:resSet中的元素是按成本从小到大排序的,所以只要遇到第一个超预算的元素,后续所有元素的成本都会更高,也必然超预算。
但你的代码从来没有对resSet做过排序操作,生成的tempSet中元素是乱序的,成本高的元素可能排在成本低的元素前面。一旦遍历到某个超预算的元素就直接break,会导致后面大量符合预算、成本更低的有效组合被跳过,这就是你i=2时pos循环提前终止、最优组合没被计算到的直接原因。
隐藏问题2:索引变量类型错误
你最后统计最优解时定义了double pos;,但数组/vector的索引必须是整数类型,浮点型变量作为索引会出现不可预期的读取错误,哪怕当前运行没崩溃,这也是严重的逻辑隐患。
隐藏问题3:使用非标准C++语法
int cost[n],num_available[n],max_cost; double rel[n];这种可变长度数组是C99的特性,不属于C++标准,部分编译器可能不支持,建议替换为std::vector实现。
修复建议
- 每次生成
tempSet后,先按成本从小到大排序,再做同成本去重:相同成本的条目只保留可靠性最高的,既可以让剪枝逻辑生效,也能大幅降低后续遍历的计算量。 - 将最后统计最优解的
pos变量类型改为int。 - 把可变长度数组替换为
std::vector<int>、std::vector<double>。
内容的提问来源于stack exchange,提问作者bb_823
相关产品推荐
相关产品推荐

