生産計画プロジェクトに取り組んでいるので、いくつかのマシン(A、B)で注文生産開始時間を見つけたいです。
簡単にするために、2 台のマシン (マシン A とマシン B) があるとします。次の制約があります。
A_TimeLimitation
各マシンは 1 日の特定の時間帯 ( ,B_TimeLimitation
) にのみ動作します。マシン A は、次の範囲で動作できます。
(2014/12/4 00:00:00 - 2014/12/4 02:00:00) または(2014/12/4 04:00:00 - 2014/12/4 06:00:00)
マシン B は、次の範囲で動作できます。
(2014/12/4 02:00:00 - 2014/12/4 04:00:00)または(2014/12/4 05:00:00 - 2014/12/4 07:00:00)
各製品はマシン A を通過し、次にマシン B を通過する必要があります。
- 各製品は、各マシンで数時間かかります (私のサンプルでは 60 分)。
- マシン B は、マシン A が作業を終了した後に開始する必要があります。
- B は、A が仕事を終えてから 10 分以内に仕事を始めることができます。[更新しました]
- 目標は、注文生産時間を最小限に抑えることです。
次のコードを使用して、aDateTime
を分に変換しました。
var minutes = new TimeSpan(dateTime.Ticks).TotalMinutes;
したがって、上記のコードを使用すると、DateTime
範囲が範囲に変換されDouble
ます。
問題を解決するためにMicrosoft Solver Foundationを使用しているため、次のコードを使用しました。
var context = SolverContext.GetContext();
var model = context.CreateModel();
var a_OperationTime = 60;
var b_OperationTime = 60;
var tolerance = 10;
//Decision
Decision A_StartTime = new Decision(Domain.IntegerNonnegative, "A_StartTime");
model.AddDecision(A_StartTime);
Decision B_StartTime = new Decision(Domain.IntegerNonnegative, "B_StartTime");
model.AddDecision(B_StartTime);
//Constraints
model.AddConstraint("A_TimeLimitations" ,
(1059220800 <= A_StartTime <= 1059220860) |
(1059221160 <= A_StartTime <= 1059221220));
model.AddConstraint("B_TimeLimitations" ,
(1059220920 <= B_StartTime <= 1059220980) |
(1059221100 <= B_StartTime <= 1059221160));
model.AddConstraint("B_ContiguousLimitations" ,
B_StartTime - (A_StartTime + 60) <= tolerence);
//Goal
var A_StartTime = model.Decisions.First(x => x.Name == "A_StartTime");
var B_StartTime = model.Decisions.First(x => x.Name == "B_StartTime");
model.AddGoals("OrderDuration", GoalKind.Minimize, B_StartTime - A_StartTime);
//Solve
var directive = new ConstraintProgrammingDirective();
//directive.TimeLimit = 10000;
var solution = context.Solve(directive);
しかし、コードを実行すると、無限ループに入るように見えます.10000ミリ秒後に を指定するTimeLimit
と、解決策が見つからなかったことを意味します.マシンの2番目の範囲を削除すると、コードは解決策を見つけることができます.directive
solution.Quality
Unknown
MSF
DateTime
A
誰が問題がどこにあるか知っていますか?