1.分析
では、以前のブログでhttps://blog.csdn.net/Jayphone17/article/details/102996649
私たちは、バックトラックとシーケンスの問題を処理し、最適な加工機械部品を解きます
私たちは、状況の複雑さを分析します:
示されるように、(1)時間計算量:
最悪の場合、最後の層を除いて、ある1 + N + N(N- 1)+ ... + n(nは-1)(N-2)...≤NN!ノードは、機能の境界を決定するために必要な機能の境界を決定することはこのようにO(NN!)を消費し、O(1)時間が必要です。リーフノードで処理最適解はO(n)は、各リーフノードのための最悪の場合の検索を記録し、葉数n!、加工O(NN!)があります。最後に、時間計算量はO(NN!)≈Oである(( N + 1)!)。
複雑(2)スペース。実現可能な解として記録X []配列最長パスの使用空間の複雑さはO(N)です。
最適化ルールを使用してベルマン、時間計算量はO(nlogn)を実現することができます。
Sセット処理シーケンス、ほとんどの2つのだけ処理スキームスキームのいずれかを仮定します。
- 品番I処理前には、部品番号jを再処理、他のワークピースは、最適配列であります
- まず、部品番号jを処理し、私は部品の数を再処理、他のワークが最適なシーケンスであります
ベーアマン派生式:https://blog.csdn.net/Jayphone17/article/details/103013335
{T1J、T2I}≥最大{T1I、T2Jマックス:スキーム1スキーム比が必要かつ十分であるが好ましいです。
分析後に続けます。
バーマンのルールを得ることができます。
- ワークへの最初のマシンより短い処理時間
- 二段目のマシンの後、ワーク短い処理時間
- 処理時間は、処理時間を処理する第二のマシンに最初のマシンよりも少ないです
- 第1後処理時間を機械加工するよりも大きいか、第2の機械加工時間に等しいです
2.アルゴリズムの設計
まず、
;すなわち、処理時間が低い第2のマシン上で処理時間を最初のマシンよりも、| N1 = {T1I <T2I I} Baermannルール・セットによれば、(1)は、二つの部分に分けることができます
N2 = {I | T1I> = T2I}、即ち、第1処理機時間は、第二のマシン上で以上の処理時間であります
(2)非N1 T1Iは、工作物に係るN2非T2I昇順に従ってワークを降順。
(3)N1、N2のワークピースコンタクトは、ワークピースは、すなわち、最適な処理シーケンスN1N2ルールが満たされるバーマンを求めました。
II。
C ++は、自己定義された優先順位付け機能も、そのための優先CMPを定義することができますので、あなたはソート関数を呼び出すことができます。
bool cmp(node a,node b) { return min(b.x,a.y)>=min(a.x,b.y); } sort (T,T+n,cmp);
この特定の優先順位は、それが何を意味するのでしょうか?
例えば、二つの部分B、最初の加工時間をx、第二の機械加工時間yは、存在しています。
分(BX、AY)=分(10,7)= 7。
分(都市、AX)=分(2,3)= 2。
分(BX、AY)≥分 (AX、によります)。//ベルマンルール!!!!
したがって、先にb部の処理されます。
3.ソースコード
#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> #include <cstring> #include <cmath> using namespace std; const int MX=11111; int n; struct node { int x; int y; int id; }T[MX]; bool cmp(node a,node b) { return min(b.x,a.y) >=min(b.y,a.x);//贝尔曼规则条件的排序 } int main() { cout << "请输入机器零件的个数n:"<< endl; cin>> n; cout << "请依次输入每个机器零件在第一台机器上的加工时间x和第二台机器上的加工时间y:"<< endl; for (int i=0;i<n;i++) { cin >> T[i].x >> T[i].y; T[i].id=i+1; } sort(T,T+n,cmp); int f1=0; int f2=0; for (int i=0;i<n;i++) { f1+=T[i].x; f2=max(f1,f2)+T[i].y; } cout << "最优的机器零件加工顺序是:"<< endl; for (int i=0;i<n;i++) { cout << T[i].id ; } cout << endl; cout << "最优的零件加工时间是:"<< endl; cout << f2 << endl; return 0; }
テストの結果4。
前回の複雑さはO(nlogn)です。
最後のスペースの複雑さはO(n)があります。