私は現在、車両のルーティングの問題に対して特定の動的計画法のアプローチをコーディングしようとしています。ある時点で、同じ段階で最良の 100 個の部分ルートを維持するために、minmaxheap に追加したい部分ルートがあります。ほとんどのプログラムはスムーズに実行されますが、実際に部分的なルートをヒープに挿入したい場合は、処理が少し遅くなる傾向があります。その特定のコードを以下に示します。
clock_t insert_start, insert_finish, check1_finish, check2_finish;
insert_start = clock();
check2_finish = clock();
if(heap.get_vector_size() < 100) {
check1_finish= clock();
heap.insert(expansion);
cout << "node added" << endl;
}
else {
check1_finish = clock();
if(expansion.get_cost() < heap.find_max().get_cost() ) {
check2_finish = clock();
heap.delete_max();
heap.insert(expansion);
cout<< "worst node deleted and better one added" <<endl;
}
else {
check2_finish = clock();
cout << "cost too high check"<<endl;
}
}
number_expansions++;
cout << "check 1 takes " << check1_finish - insert_start << " ms" << endl;
cout << "check 2 takes " << check2_finish - check1_finish << "ms " << endl;
insert_finish = clock();
cout << "Inserting an expanded state into the heap takes " << insert_finish - insert_start << " clocks" << endl;
典型的な出力は次のとおりです。
cost too high check
check1 takes 0 ms
check2 takes 0ms
Inserting an expanded state into the heap takes 0 clocks
cost too high check
check1 takes 0 ms
check2 takes 0ms
Inserting an expanded state into the heap takes 16 clocks
cost too high check
check1 takes 0 ms
check2 takes 0ms
Inserting an expanded state into the heap takes 0 clocks
このブロックが他の場所で実装されている関数を使用している場合、コードについて何かを言うのは難しいことはわかっていますが、なぜこれが 1 ミリ秒未満かかるのか、場合によっては 16 ミリ秒かかるのかについて私は驚いています。プログラムはこのブロックを何千回も実行する必要があるため、これらの小さな問題が実際に非常に遅くなります。
私の唯一の推測は、これらすべての状態を格納するヒープ クラスのベクトルで何かが起こるということですが、コンストラクターで vector::reserve を使用して 100 個のアイテムの場所を予約しているので、これがどのように問題になるかわかりません。
ありがとう!