状态空间本身似乎还可以,但您的方法有一些缺点。首先,您需要选择大小的初始状态n. 如果最优解是大小怎么办n4或者10n? 然后使用这种方法进行搜索可能需要很长时间,因为您开始的距离很远。如果有多个解决方案,您是否关心您找到哪一个或首选最小的零子集?我将假设空集X′={}不是解决方案,并且首选具有较小基数的解决方案。
我建议使用生成启发式来构建初始状态,然后从该状态运行您的爬山程序。例如,生成启发式可能是这样的:“选择一对元素 (x1,x2) 从X这样x1+x2尽可能接近零,并设置X′={x1,x2}作为初始状态”。要应用此启发式方法,您需要首先检查n(n−1)对的子集。如果这不是一个解决方案,那么它有望非常接近状态空间中的解决方案,因此是一个很好的起点。
另一个问题是爬山不记得以前访问过的状态,当您允许移动以添加和删除元素时,您最终可能会无限循环X′. 例如,假设X′={1},X={−3,−50,−50,100}. 显然最优解是X′′={−50,−50,100}但是您的方法将添加元素−3到X′首先,然后删除−3,然后选择−3再次等等,因为这些状态的客观价值低于任何具有以下条件之一的状态−50或者100在里面。所以我认为你需要使用更复杂的方法来防止两次访问同一个状态。