単純な置換暗号の鍵を見つけるために、暗号解読ローカル検索用の粒子群最適化アルゴリズムを実装しようとしています。
この方法がどのように機能するかの理論は理解しており、ほとんどのアルゴリズムを実装しましたが、速度を計算する方法がわかりません。
粒子クラス:
public class Particle extends Alphabet {
public Vector velocity = new Vector();
public char[] pbest;
public Particle() {
this.Scramble();
}
public char[] getPosition() {
return this.getAlphabet();
}
}
スワームクラス:
public class ParticleSwarm {
public List<Particle> swarm = new ArrayList<>();
private Fitness fitness = new Fitness();
public void randomSwarm(int swarmSize) {
for(int i = 0; i < swarmSize; i++) {
swarm.add(new Particle());
}
}
public Particle getBestParticle() {
Particle swarmBest = new Particle();
double bestScore = 0;
for(int i = 0; i < swarm.size(); i++) {
double newScore = fitness.score(swarm.get(i).getPosition());
if(newScore >= bestScore) {
bestScore = newScore;
swarmBest = swarm.get(i);
}
}
return swarmBest;
}
}
パーティクルは、私が別のアルゴリズム用に作成したアルファベット クラスの拡張であり、基本的にはスクランブル可能な 26 文字のアルファベット文字の char 配列です。粒子の「位置」(私が知る限り、それは単なるアルファベットまたは数値表現です)。
swarm クラスは自明ですが、キーが生成する英語テキストの量を表す 0 から 1 (1 が最高) のスコアでパーティクルをスコアリングするフィットネス クラスが含まれています。
このアルゴリズムの実装に出くわしました(コードはありませんが)、これらの手順を提案するvigenere暗号の鍵を見つけます:
実際の鍵を見つけるための提案されたアルゴリズム
- PSO 検索アルゴリズム パラメータの初期化
PSO パラメーターは、最初のステップで設定されます。これらのパラメーターは、粒子の数 (Np)、キーのサイズ (Nd)、反復の最大数 (Nt)、自己信頼係数 (C1)、群信頼係数 (C2)、および慣性の重み (w) で構成されます。
- 個別の鳥または個体群の初期化
a) vigenere 暗号の暗号解読の場合: 粒子の初期位置は、整数 0 から 25 までランダムに一様にサンプリングされたサイズ Nd の順列をランダムに選択することによって決定されます。 b) 以下を使用して各粒子の速度を初期化します。
vi = vmin+(vmax - vmin) × rand
vi は粒子 i の速度 vmax は最大速度、vmin は最小速度、rand は 0 から 1 の間の乱数です。
- リスト項目
各粒子の適合度関数値を計算する
a) 粒子の位置を鍵として暗号文を復号化します。b) ステップ 3 (a) で得られたテキストの適合度関数の値を見つけます。
- パーティクルの速度と位置を更新する
手順 3 で説明したように、各粒子の適合度関数の値を計算します。
数式をここに貼り付けられないようですが、426 ページで見ることができます: http://www.enggjournals.com/ijcse/doc/IJCSE13-05-05-064.pdf