gpt4 book ai didi

python - Python 中模拟退火的基础知识

转载 作者:太空狗 更新时间:2023-10-29 18:02:24 25 4
gpt4 key购买 nike

<分区>

我必须对某个优化问题使用模拟退火。为了“感受”这项技术,我编写了一个小的 Python 代码并尝试运行它。然而,它似乎并没有给出令人满意的结果。

import random;
import math;
from math import *;
LIMIT=100000;



def update_temperature(T,k):
T1=T/log(k+1);
# print "temp now is " + str(T1);
return T1;

def get_neighbors(i,l):
if(l>1):
if(0<=i and i<l):
if(i==0):
return [1];
if(i==l-1):
return [l-2];
return [i-1,i+1];
return [];

def make_move(x,A,T):
nhbs=get_neighbors(x,len(A));

nhb=nhbs[random.choice(range(0,len(nhbs)))];


delta=A[nhb]-A[x];

if(delta < 0):
return nhb;
else:
r=random.random();
if(r <= (e**(-1*delta)/(T*1.0))):
return nhb;

return x;


def simulated_annealing(A):
l=len(A);
init_pos=random.choice(xrange(0,l));
T=10000**30;
k=1;

x_best=init_pos;
x=x_best;

while(T>0.0000001 ):
x=make_move(x,A,T);
if(A[x] < A[x_best]):
x_best=x;
T=update_temperature(T,k);
k+=1;

return [x,x_best,init_pos];



def isminima_local(p,A):
l=len(A);
if(l==1 and p==0):
return True;
if(l>1):
if(p==0):
if(A[0] <=A[1]):
return True;
if(p==l-1):
if(A[p-1] >=A[p]):
return True;
if(0<=p and p<l and A[p-1]>=A[p] and A[p]<=A[p+1]):
return True;
return False;


def func(x):
F=sin(x);
return F;

def initialize(l):
A=[0]*l;
for i in xrange(0,l):
A[i]=func(i);
return A;

def main():
A=initialize(LIMIT);


local_minima=[];
for i in xrange(0,LIMIT):
if( isminima_local(i,A)):
local_minima.append([i,A[i]]);
sols=simulated_annealing(A);

m,p=A[0],0;
for i in xrange(1,LIMIT):
if(m>A[i]):
m=A[i];
p=i;

print "Global Minima at \n";
print p,m;


print "After annealing\n";

print "Solution is " + str(sols[0]) + " " + str(A[sols[0]]);
print "Best Solution is " + str(sols[1]) + " " + str(A[sols[1]]);
print "Start Solution is " + str(sols[2]) + " " + str(A[sols[2]]);

for i in xrange(0,len(local_minima)):
if([sols[0],A[sols[0]]]==local_minima[i]):
print "Solution in local Minima";
if([sols[1],A[sols[1]]]==local_minima[i]):
print "Best Solution in local Minima";
for i in local_minima:
print i;

main();

我无法理解我哪里出错了。执行有问题还是我对模拟退火的理解有问题?错误请指出..

我对SA的粗略认识: 选择一个随机的邻居 如果邻居改善你的情况,搬到那里, 否则,以一定的概率移动到那里。 概率是这样的,即最初错误的 Action 是“允许的”,但后来它们被“禁止”。最后,您将收敛到您的解决方案。

我已经使用蛮力找到了局部最小值和全局最小值的集合。然后我运行 SA。我原以为 SA 至少会收敛到局部最小值,但情况似乎并非总是如此。另外,我不确定是在每一步都随机选择一个邻居然后尝试移动,还是选择最佳邻居(即使没有一个邻居改善我的状况)然后尝试移动到那里.

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com