連続ホップフィールドニューラルネットワークの最適化—巡回セールスマン問題の最適化計算

連続ホップフィールド ニューラル ネットワーク

連続ホップフィールド ニューラル ネットワーク (Continuous Hopfield Network、CHN) は、エネルギー最小化の原理に基づいたニューラル ネットワーク モデルであり、離散ホップフィールド ネットワークと比較して、その状態は連続的であり、通常は実数値または確率分布を使用します。連続ホップフィールド ニューラル ネットワークを最適化するときは、次の側面を考慮する必要があります。

  1. 適切な活性化関数を選択する: 活性化関数は、ニューロンの出力と入力の間の非線形マッピングです。連続ホップフィールド ネットワークの場合、一般的な活性化関数には Sigmoid、Tanh、ReLU が含まれます。適切なアクティベーション関数を選択すると、ネットワークのパフォーマンスを向上させることができます。

  2. 適切なエネルギー関数を設計する: 連続ホップフィールド ネットワークの中核は、ネットワーク状態の安定性を記述するエネルギー関数です。適切なエネルギー関数を設計すると、ネットワークの収束速度と安定性が向上します。

  3. 重み行列の初期化: 重み行列の初期化は、ネットワークのパフォーマンスに大きな影響を与えます。一般的に使用される初期化方法には、ランダム初期化、He 初期化、Xavier 初期化などがあります。適切な初期化戦略により、ネットワークのコンバージェンス速度が向上し、パフォーマンスが向上します。

  4. 学習率の調整: 学習率はニューラル ネットワークの重要なハイパーパラメーターであり、重みが更新される速度を決定します。固定学習率、減衰学習率、適応学習率などの適切な学習率戦略を使用すると、最適化効果を向上させることができます。

  5. 正則化: 正則化は、損失関数に正則化項を追加することで過学習を防ぐ方法です。一般的な正則化方法には、L1 正則化、L2 正則化、ドロップアウトなどがあります。適切な正則化戦略により、ネットワークの汎化能力を向上させることができます。

  6. トレーニング戦略: 連続ホップフィールド ネットワークのトレーニングには、バッチ勾配降下法、確率的勾配降下法、ミニバッチ勾配降下法などの方法を使用できます。異なるトレーニング戦略は収束速度とパフォーマンスに異なる影響を与えるため、実際の問題に応じて適切なトレーニング方法を選択する必要があります。

  7. モデルの選択と評価: トレーニング中に、相互検証、モデル選択、ハイパーパラメーター調整などの手法を使用して、最適なモデルとパラメーター設定を選択できます。さらに、ネットワークのパフォーマンスを正確に測定するには、評価指標を適切に設計する必要があります。

要約すると、連続ホップフィールド ニューラル ネットワークの最適化には、多くの側面で戦略とテクニックが必要であり、最高のパフォーマンスを達成するには、実際の問題とデータ セットに応じて調整する必要があります。

TSP(巡回セールスマン問題、巡回セールスマン問題)

TSP (巡回セールスマン問題) を例として、連続ホップフィールド ニューラル ネットワークを最適化に使用する方法を説明します。

TSP 問題は古典的な組み合わせ最適化問題であり、一連の都市とそれらの間の距離を指定して、各都市を 1 回だけ訪問し、開始都市に戻る最短経路を見つける必要があります。

この例では、連続ホップフィールド ニューラル ネットワークを最適化することで TSP 問題を解決できます。

  1. ネットワーク表現: まず、TSP 問題を連続ホップフィールド ニューラル ネットワークとして表現する必要があります。N 個の都市があると仮定すると、N×N 行列 X を使用してネットワーク状態を表すことができます。ここで、各要素 x_ij は、都市 i がアクセス順序の j 番目の位置である確率を表します。

  2. エネルギー関数: 次に、ネットワーク状態の品質を測定するためのエネルギー関数を設計する必要があります。一般的に使用されるエネルギー関数は次のとおりです。

E(X) = A * (Σ_i(Σ_j x_ij - 1)^2 + Σ_j(Σ_i x_ij - 1)^2) + B * Σ_i Σ_j Σ_k d_ik * x_ij * x_k(j+1)

ここで、A と B はトレードオフ係数、d_ik は都市 i と都市 k の間の距離です。最初の項は各都市が 1 回だけ訪問されることを保証し、第 2 項は各場所に 1 つの都市のみが存在することを保証し、第 3 項はパスの合計長を表します。

  1. 運動方程式: エネルギー関数を最適化するには、エネルギー関数の勾配を考慮して運動方程式を構築する必要があります。この例では、シグモイド関数を活性化関数として使用し、勾配降下法を使用して最適化できます。

dx_ij/dt = -∂E/∂x_ij + γ * f(x_ij) * (1 - f(x_ij))

ここで、 f(x_ij) = 1/(1 + exp(-β * x_ij))、γ と β はハイパーパラメータです。

  1. パラメータの設定と最適化: 実際の最適化プロセスでは、適切なトレードオフ係数 A と B、およびハイパーパラメータ γ と β を選択する必要があります。これらのパラメーターは、相互検証やグリッド検索などの方法で調整できます。さらに、適切な学習率とトレーニング戦略を設定する必要もあります。たとえば、適応学習率やミニバッチ勾配降下法を使用できます。

  2. デコードと評価: 最後に、ネットワーク状態行列 X を TSP 問題の解決策にデコードする必要があります。一般的なデコード方法は、各行と列の最大確率値に対応する都市と場所を取得することです。次に、解の合計パス長を計算して、TSP 問題を解決するための連続ホップフィールド ニューラル ネットワークのパフォーマンスを評価できます。

上記の手順を通じて、連続ホップフィールド ニューラル ネットワークを使用して TSP 問題を最適化できます。

 

コード

diff_u

% % % % 计算du
function du=diff_u(V,d)
global A D
n=size(V,1);
sum_x=repmat(sum(V,2)-1,1,n);
sum_i=repmat(sum(V,1)-1,n,1);
V_temp=V(:,2:n);
V_temp=[V_temp V(:,1)];
sum_d=d*V_temp;
du=-A*sum_x-A*sum_i-D*sum_d;

エネルギー

% % % % % 计算能量函数
function E=energy(V,d)
global A D
n=size(V,1);
sum_x=sumsqr(sum(V,2)-1);
sum_i=sumsqr(sum(V,1)-1);
V_temp=V(:,2:n);
V_temp=[V_temp V(:,1)];
sum_d=d*V_temp;
sum_d=sum(sum(V.*sum_d));
E=0.5*(A*sum_x+A*sum_i+D*sum_d);

主要

%% 连续Hopfield神经网络的优化—旅行商问题优化计算

%% 清空环境变量、定义全局变量
clear all
clc
global A D

%% 导入城市位置
load city_location

%% 计算相互城市间距离
distance = dist(citys,citys');

%% 初始化网络
N = size(citys,1);
A = 200;
D = 100;
U0 = 0.1;
step = 0.0001;
delta = 2 * rand(N,N) - 1;
U = U0 * log(N-1) + delta;
V = (1 + tansig(U/U0))/2;
iter_num = 10000;
E = zeros(1,iter_num);

%% 寻优迭代
for k = 1:iter_num  
    % 动态方程计算
    dU = diff_u(V,distance);
    % 输入神经元状态更新
    U = U + dU*step;
    % 输出神经元状态更新
    V = (1 + tansig(U/U0))/2;
    % 能量函数计算
    e = energy(V,distance);
    E(k) = e;  
end

 %% 判断路径有效性
[rows,cols] = size(V);
V1 = zeros(rows,cols);
[V_max,V_ind] = max(V);
for j = 1:cols
    V1(V_ind(j),j) = 1;
end
C = sum(V1,1);
R = sum(V1,2);
flag = isequal(C,ones(1,N)) & isequal(R',ones(1,N));

%% 结果显示
if flag == 1
   % 计算初始路径长度
   sort_rand = randperm(N);
   citys_rand = citys(sort_rand,:);
   Length_init = dist(citys_rand(1,:),citys_rand(end,:)');
   for i = 2:size(citys_rand,1)
       Length_init = Length_init+dist(citys_rand(i-1,:),citys_rand(i,:)');
   end
   % 绘制初始路径
   figure(1)
   plot([citys_rand(:,1);citys_rand(1,1)],[citys_rand(:,2);citys_rand(1,2)],'o-')
   for i = 1:length(citys)
       text(citys(i,1),citys(i,2),['   ' num2str(i)])
   end
   text(citys_rand(1,1),citys_rand(1,2),['       起点' ])
   text(citys_rand(end,1),citys_rand(end,2),['       终点' ])
   title(['优化前路径(长度:' num2str(Length_init) ')'])
   axis([0 1 0 1])
   grid on
   xlabel('城市位置横坐标')
   ylabel('城市位置纵坐标')
   % 计算最优路径长度
   [V1_max,V1_ind] = max(V1);
   citys_end = citys(V1_ind,:);
   Length_end = dist(citys_end(1,:),citys_end(end,:)');
   for i = 2:size(citys_end,1)
       Length_end = Length_end+dist(citys_end(i-1,:),citys_end(i,:)');
   end
   disp('最优路径矩阵');V1
   % 绘制最优路径
   figure(2)
   plot([citys_end(:,1);citys_end(1,1)],...
       [citys_end(:,2);citys_end(1,2)],'o-')
   for i = 1:length(citys)
       text(citys(i,1),citys(i,2),['  ' num2str(i)])
   end
   text(citys_end(1,1),citys_end(1,2),['       起点' ])
   text(citys_end(end,1),citys_end(end,2),['       终点' ])
   title(['优化后路径(长度:' num2str(Length_end) ')'])
   axis([0 1 0 1])
   grid on
   xlabel('城市位置横坐标')
   ylabel('城市位置纵坐标')
   % 绘制能量函数变化曲线
   figure(3)
   plot(1:iter_num,E);
   ylim([0 2000])
   title(['能量函数变化曲线(最优能量:' num2str(E(end)) ')']);
   xlabel('迭代次数');
   ylabel('能量函数');
else
   disp('寻优路径无效');
end

おすすめ

転載: blog.csdn.net/Allen1862105/article/details/130402989