收藏点自己根据别人写的用例的算法笔记
源代码来自,https://blog.csdn.net/a6225301/article/details/50497800
爬山算法是完全的贪心算法,解空间里随机移动,但是很容易陷入局部最优解
#encoding=utf-8
import random
#三维空间求解最小值
def evaluate(x1, x2, x3):
return x1+x2-x3
if __name__ == '__main__':
x_range = [ [-2, 5], [2, 6], [-5, 2] ]
best_sol = [random.randint(x_range[0][0], x_range[0][1]),#-2到5生成一个随机数
random.randint(x_range[1][0], x_range[1][1]), #2到6生成一个随机数
random.randint(x_range[2][0], x_range[2][1])] #-5到2生成一个随机数
while True:
best_evaluate = evaluate(best_sol[0], best_sol[1], best_sol[2]) #求解当前状态下三个数
current_best_value = best_evaluate #当前最优解
sols = [best_sol]
#print sols #这里的sol求的是当前存储的最优解坐标
print best_sol
for i in xrange(len(best_sol)): #x_range函数是生成小于当前值的所有函数
if best_sol[i] > x_range[i][0]:#这个判断是判断当前解和边界的关系,第i个位置的参数加1或者减去1,第一个判断的是下界,第二个判断的是上界
sols.append(best_sol[0:i] + [best_sol[i]-1] + best_sol[i+1:])#得到的是一个三元组,当前位置减1,大于下届数的数减去1
if best_sol[i] < x_range[i][1]:
sols.append(best_sol[0:i] + [best_sol[i]+1] + best_sol[i+1:])#得到的是一个三元组,当前位置减1,小于于下届数的数加上1
for s in sols:
el = evaluate(s[0], s[1], s[2])
if el < best_evaluate:
best_sol = s #更新当前最优解
best_evaluate = el
if best_evaluate == current_best_value:
break
print 'best sol:', current_best_value, best_sol