0
私はIBM ILOG CPLEXでスケジューリングするための単純な整数計画問題を解決したいと思います。いくつかの制約を満たさないソリューション
特定のデータの下では、目的11,306の解が見つかりますが、いくつかの解は特定の制約ct2を満たしません。 CPLEXがいくつかの制約を満たしていない場合や、私のコーディングに問題がある場合でも、CPLEXが最適なソリューションと考えられるのだろうか?あなたが必要なら私はあなたにデータを送ることができます。私はこのポストにデータを添付したいのですが、方法を見つけることができませんでした。
本当に私はここでいくつかの答えを得ることができます願っています。
int NbGroup = ...;
int NbAutoclave = ...;
int NbTimeslot = ...;
range Group = 1..NbGroup;
range Autoclave = 1..NbAutoclave;
range Timeslot = 1..NbTimeslot;
int MonthlyProduct[Group] = ...;
int CycleTime[Group][Timeslot] = ...;
int CureTime[Group] = ...;
int Compatibility[Group][Autoclave] = ...;
dvar int Assign[Group][Autoclave][Timeslot] in 0..1;
minimize
sum(g in Group, a in Autoclave, t in Timeslot) t * Assign[g][a][t];
subject to {
forall (g in Group)
ct1:
sum(a in Autoclave, t in Timeslot)
Compatibility[g][a] * Assign[g][a][t] == MonthlyProduct[g];
forall (g in Group)
forall (t in 1..NbTimeslot:t in (1..NbTimeslot-CycleTime[g][t]+1))
ct2:
sum(a in Autoclave, cy in 1..CycleTime[g][t])
Compatibility[g][a] * Assign[g][a][t+cy-1] <= 1;
forall(a in Autoclave, t in Timeslot)
ct3:
sum(g in Group, cu in 1..CureTime[g]: t-cu+1 in Timeslot)
Compatibility[g][a] * Assign[g][a][t-cu+1] <= 1;
ct4:
sum(g in Group, a in 1..1, t in 1..7)
Assign[g][a][t] == 0;
ct5:
sum(g in Group, a in 2..2, t in 1..6)
Assign[g][a][t] == 0;
//to fix some solutions
Assign[9][1][23]==1;
Assign[9][1][95]==1;
Assign[9][1][143]==1;
Assign[9][1][167]==1;
Assign[9][1][239]==1;
Assign[9][1][287]==1;
Assign[9][1][311]==1;
}
tuple SolutionT{
int a;
int b;
int c;
int d;
};
{SolutionT} Solution = {<a0,b0,c0,Assign[a0][b0][c0]> | a0 in Group, b0 in Autoclave, c0 in Timeslot};
execute{
writeln(Solution);
}
ただ、明確化を追加する - 彼らは、具体的に緩和することが許可されていない限り、CPLEXは* *制約に違反する「ソリューション」を生成しませんがプログラマが何らかの形で(公差などを考慮して)。決定変数の値の集合がすべての制約を満たしていない場合、それは解ではないが、客観的価値は良好である。 – TimChippingtonDerrick