貪欲なポリシー最適化に基づくラテンハイパーキューブ設計

1. はじめに

貪欲なポリシー最適化に基づくラテンハイパーキューブ設計

2. ソフトウェア環境

2.1 マットラボ

3. 主な工程

3.1 ラテン超立方体設計

原理については説明しません。結果
コードについて説明します。

% 设置变量范围和样本数量
rangeX = [0 1]; % X 变量范围
rangeY = [0 1]; % Y 变量范围
numSamples = 500; % 样本数量

% 贪心策略生成优化的拉丁超立方设计
design = greedyOptimizationLHD(numSamples, 2, rangeX, rangeY);

% 绘制二维图
scatter(design(:,1), design(:,2), 'filled');
xlabel('X');
ylabel('Y');
title('Optimized Latin Hypercube Design using Greedy Optimization');

function design = greedyOptimizationLHD1(numSamples, numVariables, rangeX, rangeY)
    % 生成初始的拉丁超立方设计
    design = lhsdesign(numSamples, numVariables);
end

ここに画像の説明を挿入

3.2 貪欲なポリシー最適化 (GPT) に基づくラテンハイパーキューブ設計

コード全体は最初に gpt によって書かれました。これが元のコードです。それを見て、問題を見てみましょう。gpt によって生成されたコードには問題があります。

% 设置变量范围和样本数量
rangeX = [0 1]; % X 变量范围
rangeY = [0 1]; % Y 变量范围
numSamples = 20; % 样本数量

% 贪心策略生成优化的拉丁超立方设计
design = greedyOptimizationLHD(numSamples, 2, rangeX, rangeY);

% 绘制二维图
scatter(design(:,1), design(:,2), 'filled');
xlabel('X');
ylabel('Y');
title('Optimized Latin Hypercube Design using Greedy Optimization');

% 贪心策略生成优化的拉丁超立方设计函数
function design = greedyOptimizationLHD(numSamples, numVariables, rangeX, rangeY)
    % 生成初始的拉丁超立方设计
    design = lhsdesign(numSamples, numVariables);
    
    % 将设计映射到变量范围
    samplesX = design(:, 1) * (rangeX(2) - rangeX(1)) + rangeX(1);
    samplesY = design(:, 2) * (rangeY(2) - rangeY(1)) + rangeY(1);
    
    % 计算初始设计的适应度
    initialFitness = calculateFitness(samplesX, samplesY);
    
    % 迭代改进设计
    for iter = 1:100
        % 随机选择一个样本点
        index = randi(numSamples);
        
        % 随机生成新的样本点
        newX = rand * (rangeX(2) - rangeX(1)) + rangeX(1);
        newY = rand * (rangeY(2) - rangeY(1)) + rangeY(1);
        
        % 替换选中的样本点
        samplesX(index) = newX;
        samplesY(index) = newY;
        
        % 计算新设计的适应度
        newFitness = calculateFitness(samplesX, samplesY);
        
        % 如果新设计的适应度更好,则接受新设计
        if newFitness > initialFitness
            initialFitness = newFitness;
        else
            % 恢复原来的样本点
            samplesX(index) = design(index, 1) * (rangeX(2) - rangeX(1)) + rangeX(1);
            samplesY(index) = design(index, 2) * (rangeY(2) - rangeY(1)) + rangeY(1);
        end
    end
    % 更新最终的设计
    design(:, 1) = (samplesX - rangeX(1)) / (rangeX(2) - rangeX(1));
    design(:, 2) = (samplesY - rangeY(1)) / (rangeY(2) - rangeY(1));
end

% 计算设计的适应度
function fitness = calculateFitness(samplesX, samplesY)
    % 计算设计的适应度(距离的总和的倒数)
    distances = pdist([samplesX, samplesY]);
    fitness = 1 / sum(distances);
end

適応度では点間の距離が必要となるため、フロントデザインは実際には存在しないはずの変数範囲にマッピングされますが、入力変数の範囲が特に大きく、変数範囲が特に小さい場合、距離に応じた最適化を行う際に、 , 結果は、元のラテン語ハイパーキューブ設計ほど良くありません。

    % 将设计映射到变量范围
    samplesX = design(:, 1) * (rangeX(2) - rangeX(1)) + rangeX(1);
    samplesY = design(:, 2) * (rangeY(2) - rangeY(1)) + rangeY(1);

これをこれに変更するだけです。これは正規化に相当し、各範囲が 0 ~ 1 になるようにします。正規化のメリット gpt が書いたものを貼り付けました
正規化を使用した設計結果には以下のようなメリットがあります。

統一されたスケール: 正規化により、異なるディメンション間のスケールの違いが排除され、比較的一貫した範囲が保証されます。こうすることで、さまざまな次元の効果をより簡単に比較し、比較検討することができます。
再利用性: 正規化された設計結果は、他のモデル、アルゴリズム、または手法とより簡単に統合できます。追加のスケーリングを行わずに、同じ正規化範囲を使用して設計を他のモデルにインポートできます。
解釈可能性: 正規化された設計結果は均一の範囲内にあるため、理解しやすく、解釈しやすくなります。各次元の実際の範囲に関係なく、正規化された値を直接使用できます。
したがって、問題に範囲が異なる複数の次元が含まれる場合は、正規化された設計結果を使用することをお勧めします。これにより、異なる次元間のスケールの違いをより適切に処理できるようになり、その後の分析と適用がより便利になります。

    % 设计映射
    samplesX = design(:, 1);
    samplesY = design(:, 2);

2 番目の問題は、ポイントの反復プロセスで、悪いポイントに遭遇すると、デザインが最初に生成されるポイントであることがわかります。つまり、悪いポイントに遭遇すると、最初に後退してしまうということです。 、初期バージョンに戻って最初から始めるのが簡単なので、この時点での反復はあまり行われていません。

        % 如果新设计的适应度更好,则接受新设计
        if newFitness > initialFitness
            initialFitness = newFitness;
        else
            % 恢复原来的样本点
            samplesX(index) = design(index, 1) * (rangeX(2) - rangeX(1)) + rangeX(1);
            samplesY(index) = design(index, 2) * (rangeY(2) - rangeY(1)) + rangeY(1);
        end

この部分が基本的に出力されていても、その出力は依然として 0 ~ 1 であり、これは必要な範囲ではありません。

    % 更新最终的设计
    design(:, 1) = (samplesX - rangeX(1)) / (rangeX(2) - rangeX(1));
    design(:, 2) = (samplesY - rangeY(1)) / (rangeY(2) - rangeY(1));

最後のフィットネス関数は、いくつかテストしました。まず GPT を確認します。pdist 関数は、各ポイントと他のすべてのポイントの間の距離を計算できます。4 つの点 abcd がある場合、距離は ab、bc、cd、da、ac、bd、

function fitness = calculateFitness(samplesX, samplesY)
    % 计算设计的适应度(距离的总和的倒数)
    distances = pdist([samplesX, samplesY]);
    fitness = 1 / sum(distances);
end

絵がすでにとんでもないもので、凝集が非常に強力であることがわかります。
ここに画像の説明を挿入
次にカウントダウンを出しますが、それを使用する方法はありません。

function fitness = calculateFitness(samplesX, samplesY)
    % 计算设计的适应度(距离的总和的倒数)
    distances = pdist([samplesX, samplesY]);
    fitness = sum(distances);
end

ここに画像の説明を挿入
GPTが再度与えました、効果も平均的です、

% 计算设计的适应度
function fitness = calculateFitness(samplesX, samplesY)
    % 计算样本点之间的距离矩阵
    distances = pdist([samplesX, samplesY]);
    % 计算最小距离
    minDistance = min(distances);
    % 适应度为最小距离的倒数
    fitness = 1 / minDistance;
end

ここに画像の説明を挿入
しかし、逆に、均一なバッチです。

% 计算设计的适应度
function fitness = calculateFitness(samplesX, samplesY)
    % 计算样本点之间的距离矩阵
    distances = pdist([samplesX, samplesY]);
    % 计算最小距离
    minDistance = min(distances);
    % 适应度为最小距离的倒数
    fitness = minDistance;
end

ここに画像の説明を挿入
次に、他の距離を試していきますが、平均距離は前回の距離の合計と同じなので、図は示しません。

% 计算设计的适应度(平均距离的倒数)
function fitness = calculateFitness(samplesX, samplesY, samplesZ, samplesW)
    % 计算样本点之间的距离矩阵
    distances = pdist([samplesX, samplesY, samplesZ, samplesW]);
    % 计算平均距离
    averageDistance = mean(distances);
    % 适应度为平均距离的倒数
    fitness = 1 / averageDistance;
end

もう 1 つは、最大距離の逆数を適応度として計算する方法です。

% 计算设计的适应度
function fitness = calculateFitness(samplesX, samplesY)
    maxDistanceX = max(pdist(samplesX));
    maxDistanceY = max(pdist(samplesY)); 
    % 计算最大间距的倒数作为适应度值
    fitness = 1 / max([maxDistanceX, maxDistanceY]);
end

ここに画像の説明を挿入
一方、実際には平均的でわずかに優れています。この方法で適応度を計算すると、空間の分布を無視するのと同じことになるため、最適化はそれほど良好ではなく、各変数の均一性が高まるだけです。独自の次元ですが、全体的にはそれほど優れたものではありません
ここに画像の説明を挿入

3.3 貪欲な戦略最適化に基づくラテン超立方体設計

いくつかのコンセプトを置く

ユークリッド距離は、多次元空間内の 2 点間の直線距離の尺度です。2 次元空間におけるユークリッド距離の計算式は次のとおりです。
d = sqrt((x2 - x1)^2 + (y2 - y1)^2)
ここで、(x1, y1) と (x2, y2) は 2 つの座標を表します。ポイントの。高次元空間でもユークリッド距離の計算式は同様で、各次元の差の二乗和を計算し、平方根をとることで二点間の距離が求められます。
最適化問題では、最小ユークリッド距離を最大化または最小化することにより、分散または集約の効果を達成するために、サンプル点間の距離を可能な限り大きくまたは小さくすることができます。

上記の最小距離については、gptは最小距離の逆数を与えるので、何かを探しました

最適化手法の一部は、多孔質ガスラジアル軸受の静的・動的特性に関する研究論文に記載されており、最小ユークリッド距離を最大化する(つまり、最小ユークリッド距離を最大化する)、つまり各点をできるだけ近づけるというものです。最も近い点 距離はできるだけ長くする必要があります。

MATLAB の dist、pdist、および pdist2 の違いは、MATLAB の pdist と pdist2 の違いと接続を確認できます (http://t.csdn.cn/MkWO1)。簡単に
理解すると、点セットが 1 つだけある場合、 pdis は、これらの点セットの現在の相互距離としてカウントされます。距離が 2 つ以上ある場合は、他の点セットの項目間の相互距離を計算する pdist2 を使用します。

ここに画像の説明を挿入
GPT も以前にこれを書いているので、適応性のためにこれを使用する方が合理的だと思います

% 计算设计的适应度
function fitness = calculateFitness(samplesX, samplesY)
     % 计算样本点之间的距离矩阵
     distances = pdist([samplesX, samplesY]);
     % 计算最小距离
     minDistance = min(distances);
     % 适应度为最小距离的倒数
     fitness = minDistance;
end

ここに画像の説明を挿入

最大最小距離は、ラテン超立方体設計を改善するための最適化手法です。その目標は、サンプル ポイント間の最小距離を最大化し、サンプル ポイント間の離散性と均一性を高めることです。

以下は、最大最小距離法の生成と最適化の基本的な考え方です。
1 まず、初期のラテン超立方体設計を生成します。
2 初期設計におけるサンプル点間の最小距離を計算します。
3 最適化の反復が実行され、各反復で新しい設計が生成され、最小距離が計算されます。
4 各反復で、各サンプル ポイントに対して、ランダムな再割り当てによって新しい位置が生成されます。これは、2 つのサンプル ポイントの位置を交換するか、サンプル ポイントの範囲内で新しい位置をランダムに選択することによって実行できます。
5 新しい設計のサンプル点間の最小距離を計算します。
6 新しい設計の最小距離が以前の設計よりも優れている場合は、この設計を現在の最適設計として受け入れます。そうでない場合は、以前の設計を維持します。
指定された反復回数に達するか、停止条件が満たされるまで、手順 4 ~ 6 を繰り返します。

私の理解について話させてください。最初は、彼がランダムな点に置き換えているので、距離に基づくこの最適化はラテン超立方体とは何の関係もないと思いました。ラテン超立方体は初期分布を提供するだけです。最初は、私は、この分布はランダムだと考えられていた可能性もあります。しかし、写真を見てよく考えてみると、私の理解は間違っているかもしれませんが、今では、彼の最適化は、最小距離に基づいて、最初に多次元の分布点を収集することになると感じています。この最適化では、隣接する点がより良い位置の点に置き換えられます。つまり、隣接する点が比較的空いている位置に置き換えられるため、分布はより均一になります。

すべてのコード

% 设置变量范围和样本数量
rangeX = [0 100]; % X 变量范围
rangeY = [0 100]; % Y 变量范围
numSamples = 1000; % 样本数量

% 贪心策略生成优化的拉丁超立方设计
design = greedyOptimizationLHD(numSamples, 2, rangeX, rangeY);

% 绘制二维图
scatter(design(:,1), design(:,2), 'filled');
xlabel('X');
ylabel('Y');
title('Optimized Latin Hypercube Design using Greedy Optimization');

% 贪心策略生成优化的拉丁超立方设计函数
function design = greedyOptimizationLHD(numSamples, numVariables, rangeX, rangeY)
    % 生成初始的拉丁超立方设计
    design = lhsdesign(numSamples, numVariables);
    
    % 设计映射
    samplesX = design(:, 1);
    samplesY = design(:, 2);
    
    % 计算初始设计的适应度
    initialFitness = calculateFitness(samplesX, samplesY);
    
    % 迭代改进设计
    for iter = 1:numSamples*10000
        % 随机选择一个样本点
        index = randi(numSamples);
        

        prevX = samplesX(index);
        prevY = samplesY(index);
        % 随机生成新的样本点
        newX = rand;
        newY = rand;
        
        % 替换选中的样本点
        samplesX(index) = newX;
        samplesY(index) = newY;
        
        % 计算新设计的适应度
        newFitness = calculateFitness(samplesX, samplesY);
        
        % 如果新设计的适应度更好,则接受新设计
        if newFitness > initialFitness
            initialFitness = newFitness;
        else
            samplesX(index) = prevX;
            samplesY(index) = prevY;
        end
    end
    

    % 将设计映射到变量范围
    samplesX = samplesX * (rangeX(2) - rangeX(1)) + rangeX(1);
    samplesY = samplesY * (rangeY(2) - rangeY(1)) + rangeY(1);
    % 更新最终的设计
    design(:, 1) = samplesX;
    design(:, 2) = samplesY;
end

% 贪心策略生成优化的拉丁超立方设计函数
function design = greedyOptimizationLHD1(numSamples, numVariables, rangeX, rangeY)
    % 生成初始的拉丁超立方设计
    design = lhsdesign(numSamples, numVariables);
end


% 计算设计的适应度
function fitness = calculateFitness(samplesX, samplesY)
     % 计算样本点之间的距离矩阵
     distances = pdist([samplesX, samplesY]);
     % 计算最小距离
     minDistance = min(distances);
     % 适应度为最小距离的倒数
     fitness = minDistance;
end

3.4 反復回数の選択

3.4.1 1次元の場合

通常のラテン語の超立方体では、点の分布があまり均一ではないことがわかります。互いに近い点が存在します。私が言った反復とは、反復の総数ではなく、点が反復される回数であり、最適化メソッドを使用します。 、1 点
ここに画像の説明を挿入
反復 10
ここに画像の説明を挿入
反復 100
ここに画像の説明を挿入
反復 1000
ここに画像の説明を挿入
反復 10,000 反復
ここに画像の説明を挿入
100,000 反復、偶数

3.4.2 2次元の場合

反復最適化なし
ここに画像の説明を挿入

10回繰り返します
ここに画像の説明を挿入

100 回繰り返します
ここに画像の説明を挿入

1000 回繰り返します

ここに画像の説明を挿入
10000 回繰り返します
ここに画像の説明を挿入

100000 回繰り返します
ここに画像の説明を挿入

3.4.3 3D の場合

3Dでは見えない

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_45179361/article/details/131548342