私はsimulated annealingを使用して、NP完全なリソーススケジューリング問題を解決しています。各タスクの候補発注については、いくつかの異なるコスト(またはエネルギー値)を計算します。いくつかの例があります(具体的な内容はおそらく問題とは関係ありませんが)。複数の異なるコストでシミュレーテッドアニーリングの受入確率関数を設計するにはどうすればよいですか?
global_finish_time
:スケジュールが跨る合計日数です。split_cost
:他のタスクの中断により各タスクが遅延される日数。これは、タスクが開始されると中断されるのを防ぐためのものです。deadline_cost
:逃した各期限が過ぎた二乗日数の合計。
伝統的な受理確率関数は(Pythonで)次のようになります。私はに結果を養うことができるように
def acceptance_probability(old_cost, new_cost, temperature):
if new_cost < old_cost:
return 1.0
else:
return math.exp((old_cost - new_cost)/temperature)
これまでのところ私は、単にそれらを追加することによって、一つに私の最初の二つのコストを組み合わせていますacceptance_probability
。しかし、私が本当に望むのは、global_finish_time
よりも常にdeadline_cost
が優先され、global_finish_time
がsplit_cost
よりも優先されるということです。
私の質問は、スタックオーバーフローです:複数のエネルギーを考慮に入れるが、常に最初のエネルギーを2番目のエネルギーよりも重要と考えるなど、受け入れ確率関数を設計するにはどうすればいいですか?言い換えれば、私はold_cost
とnew_cost
をいくつかのコストのタプルとして渡したいと思い、妥当な値を返します。
編集:これは異なる単位を持つコストコンポーネントと他の多くの困難を作成していても、私は私のために十分に働く唯一の方法は、マイクDunlaveyの提案であると結論している提案された解決法を試してから数日後 。私は実際にはリンゴとオレンジを比較することを余儀なくされています。
だから、私は値を「正規化する」ために多少の努力をしました。まず、deadline_cost
は平方和であるため、指数関数的に増加し、他の成分は直線的に増加します。これに対処するために、私は平方根を使って同様の成長率を得る。次に、コストの線形結合を計算する機能を開発しましたが、それまでに見られた最高コスト要素に応じて係数が自動調整されます。
たとえば、最高コストのタプルが(A、B、C)で、入力コストベクトルが(x、y、z)の場合、線形結合はBCx + Cy + zです。そうすれば、高いz値が得られても、x値1より重要なことは決してありません。
これは、新しい最大コストが発見されたときにコスト関数に「ジャギー」を作成します。例えば、Cが上がると、与えられた(x、y、z)入力に対してBCxとCyの両方が高くなるため、コストの差も生じます。より高いコスト差は、あたかも温度が急激に低下したかのように、受入れ確率が低下することを意味する。実際には、これは問題ではありません。なぜなら、最大コストは最初に数回更新され、後では変更されないからです。コストがより低い値に収束することがわかっているので、理論的に正しい結果に収束することが理論的に証明されていると私は信じています。
私がやや混乱していることの1つは、最大コストが1.0以下、たとえば0.5となったときに起こることです。 (0.5,0.5,0.5)の最大ベクトルでは、これは線形結合0.5 * 0.5 * x + 0.5 * y + zを与える。優先順位が突然逆転します。私はそれに対処する最良の方法は、係数が常に同じ(つまり、100x + 10y + z)になるように、すべての値を与えられた範囲にスケールするために最大ベクトルを使用することです。しかし、私はまだそれを試みていない。
これは業界または学術的な問題であるかどうかを知りたいです。よろしくお願いします。 –
学業ではありません。私はこれをMS Projectの代替として使用しています。このプログラムの主な目的は、「あなたのチームがいつ機能Xを私たちのソフトウェアに追加できるのですか?」という質問に簡単に答えることです。 – flodin
私はこの質問が年をとっていることを知っていますが、Googleを介してこのページにつまずいた人は...ファジー論理では加重和は論理和と等価ですので、 "条件A * OR *条件B等」と呼ばれる。あなたが本当に欲しいのはA * AND * B * AND * Cで、これを行うには乗法を使います。いくつかの注意点があります(たとえば、体重が力になる必要があります)が、特別なケースのすべてにしようとするよりもはるかに優れています。 Wiki "加重和モデル"と "加重積モデル"を参照してください。 –