0

生産計画プロジェクトに取り組んでいるので、いくつかのマシン(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番目の範囲を削除すると、コードは解決策を見つけることができます.directivesolution.QualityUnknownMSFDateTimeA

誰が問題がどこにあるか知っていますか?

4

1 に答える 1