TSP问题——Hopfield神经网络
发布日期:2022-03-02 13:23:54
浏览次数:41
分类:技术文章
本文共 2438 字,大约阅读时间需要 8 分钟。
TSP问题——Hopfield神经网络
clear;clc;% hopfield神经网络% 问题拟定为在网格上随机选取N个点作为城市,然后计算出TSP问题的最优解%(1)初始化Hopfield神经网络的初值city_num=11;% 惩罚参数A和D% A=city_num^2;% D=city_num/2;A=1.5;D=1;%初始电压u_0=0.02;%步长step=1;%最大迭代次数iter=0;MAX=10000;%最小能量,最小距离E_min=10000;d_min=10000;%(2)生成网格,并计算n个城市之间的距离矩阵Dxy%随机生成城市坐标city_perm=randperm(81);city_perm=city_perm(1,1:city_num);city_pos_1=(floor(city_perm./9)+1).*0.1;city_pos_2=(mod(city_perm,9)+1).*0.1;city_pos=[city_pos_1;city_pos_2(1,1:city_num)];%计算城市间距d=zeros(city_num);for i=1:city_num for j=1:city_num d(i,j)=(city_pos(:,i)-city_pos(:,j))'... *(city_pos(:,i)-city_pos(:,j)); d(i,j)=d(i,j)^(1/2); endend%画出网格hold on;plot(city_pos(1,:),city_pos(2,:),'Ko');for k=1:city_num str=[' city' num2str(k) '']; text(city_pos(1,k),city_pos(2,k),str);endset(gca,'XLim',[0 1],'YLim',[0 1]);grid on;%%tic%(3)初始化神经网络的输入状态% U=zeros(city_num);U_0=zeros(city_num)+u_0;% delta=2*rand(city_num)-1;%随机项delta=(2*rand(city_num)-1)/10;%随机项U=(0.5*log(city_num-1)).*U_0+delta;V=0.5*(1+tanh(U/u_0));V_col=sum(V,1);%列和V_row=sum(V,2);%行和Best_Route=[E_min;d_min;zeros(city_num,1)];while iter~=MAX %(4)利用动态方程计算输入状态的增量,并更新神经网络下一个时刻的状态 % 计算增量dU dU=zeros(city_num); for l=1:city_num for m=1:city_num m_0=m+1; m_1=m-1; if m==city_num m_0=1; end if m==1 m_1=city_num; end`在这里插入代码片` dU(l,m)=-A*(V_col(m)+V_row(l)-2)-... D*d(l,:)*V(:,m_0);% dU(l,m)=-A*(V_row(m)-U(l,m))-B*(V_col(l)-U(l,m))-...% C*(sum(V_row)-city_num)-D*(d(l,:)*U(:,m_0)+d(l,:)*U(:,m_1)); end end %更新U U=U+dU*step; V=0.5*(1+tanh(U/u_0)); %(5)计算当前的能量函数E V_col=sum(V,1);%列和 V_row=sum(V,2);%行和 part_1=sum((V_col-1).^2); part_2=sum((V_row-1).^2); part_3=0; for n=1:city_num for o=1:city_num for p=1:city_num p_0=p+1; if p==city_num p_0=1; end part_3=part_3+V(n,p)*V(o,p_0)*d(n,o); end end end E=(A/2)*(part_1+part_2)+(D/2)*part_3; %(6)检查当前神经网络的输出状态集合,是否满足TSP置换矩阵的规则 % 满足规则认为是一个次优解,若其能量小于最小能量,记录其能量 V_max=zeros(city_num); [~,order]=max(V); for s=1:city_num V_max(order(s),s)=1; end V_max_col=sum(V_max,1);%列和 V_max_row=sum(V_max,2);%行和 if (prod(V_max_col)==1)&&(prod(V_max_row)==1) if E
转载地址:https://blog.csdn.net/abc_18782104794/article/details/88969753 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月23日 11时46分02秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
LeetCode C++ 48. Rotate Image【Array】中等
2019-04-28
LeetCode 969. Pancake Sorting【排序/数组】中等
2019-04-28
Code::Blocks配色主题文件
2019-04-28
用Python+Selenium爬取今日头条关于江歌案的文章
2019-04-28
Python包安装问题日志(一)
2019-04-28
复习Python的Day1
2019-04-28