最近、キャッシュ関連の論文を読んだところ、小規模な組み合わせ最適化の最適解を求める動的計画法のアルゴリズムについて言及されていたので、複雑な DP アルゴリズムを試してみましたが、その論文では、この例の実現から始まる簡単な例が示されていました。動的計画法のアルゴリズムはたくさん書けると言われていますが、素人の私が初めて動的計画法に触れたのですが、そのアルゴリズムを断続的に実装するのに1週間以上かかりました。この効率性のために解雇されました。動的プログラミングを始める簡単な例は、ナップザック問題から始める必要があります。
ナップザック問題をわかりやすく解説しており、動的計画法の手順を大まかに理解でき、理解した上で他の問題にも応用できる考え方です。
紙の例
論文タイトル「Mobility-Aware Caching in D2D Networks」が IEEE TRANSACTIONS ON WIRELESS COMMUNICATIONS に掲載されました。
2 人のユーザーがファイルをキャッシュする必要があります。ファイルの合計数は 3 で、ユーザーのキャッシュ容量は 2 です。最適なキャッシュ値を取得する方法。
記事に記載されている DP アルゴリズム。上図の例を理解して実装すれば、次のアルゴリズムは簡単に実装できます。
さまざまな論文の DP アルゴリズムはほぼ類似しています。これは、多段階の意思決定の最適化問題です。
アルゴリズム
例の図から、ステージ 1 ではファイル 1 のみがキャッシュでき、ステージ 2 ではファイル 2 がキャッシュできることがわかります
。キャッシュ ファイル 1 とキャッシュ ファイル 2 で得られた最適値に基づいて、 Ufテーブルから取得できる 新しいキャッシュ後の最適な値が取得できる 各状態ごとに異なる組み合わせがある この状態がキャッシュできる最大容量である 容量内で組み合わせて比較する必要があるstage3 から stage2 の状態から stage3 の状態までを複数 (2 2) 比較し、最終的に意思決定プロセス全体の最適値を取得します。
Matlab の実装では、初期ステージ 1 と Uf を準備し、継続的に再帰し、最終ステージを取得し、最適な値を見つけてソリューションをキャッシュする必要があります。
図からわかるように、状態は行列に格納され、キャッシュ割り当ても行列に格納される必要があるため、各ステージの格納には cell 配列が使用されます。Uf も細胞保存されています。
漸化式は、前段階のある状態の最適値に Uf のさまざまな組み合わせの値を加えたもので、最終的に最適値が取られ、最適な配置計画が保存されます。
コード
コア部分
for f = 2:F
for i = 1:size(state,1)
for j = 1:size(Uf,1)
a = findAB(state,[sum(cell2mat(stage{
1,f-1}(i,2)),1)+cell2mat(Uf(j,1))]);
if a == 0
continue
end
b = cell2mat(stage{
1,f-1}(i,3))+cell2mat(Uf(j,f+1));
if cell2mat(stage{
1,f}(a,3))<=b
stage{
1,f}(a,3)={
b};
stage{
1,f}(a,2)= {
[cell2mat(stage{
1,f-1}(i,2));cell2mat(Uf(j,1))]};
end
end
end
end
stage3 の実行後の結果、最適値は 0.82 で、キャッシュ行列 [1 1; 1 0; 0 1] に対応します。