то, что вы могли бы сделать, - это полагаться на главный блок управления потоком.
Вы можете добавить
main
{
thisOplModel.generate();
cp.startNewSearch();
while
(cp.next()) { thisOplModel.postProcess(); }
}
в конце вашей модели, и тогда каждый раз при вызове будет вызываться постпроцесс новое решение
Поскольку мои решения кажутся недостаточно ясными, позвольте мне привести полный пример из примера watehouse:
.mod
using CP;
tuple sol
{
int rank;
float obj;
}
{sol} solutions;
int Fixed = 100;
int NbWarehouses = 100;
int NbStores = 200;
assert( NbStores > NbWarehouses );
range Warehouses = 1..NbWarehouses;
range Stores = 1..NbStores;
int Capacity[w in Warehouses] =
NbStores div NbWarehouses +
w % ( NbStores div NbWarehouses );
int SupplyCost[s in Stores][w in Warehouses] =
1 + ( ( s + 10 * w ) % 100 );
dvar int Open[Warehouses] in 0..1;
dvar int Supply[Stores][Warehouses] in 0..1;
dexpr int TotalFixedCost = sum( w in Warehouses ) Fixed * Open[w];
dexpr float TotalSupplyCost = sum( w in Warehouses, s in Stores ) SupplyCost[s][w] * Supply[s][w];
minimize TotalFixedCost + TotalSupplyCost;
subject to {
forall( s in Stores )
ctStoreHasOneWarehouse:
sum( w in Warehouses )
Supply[s][w] == 1;
forall( w in Warehouses )
ctOpen:
sum( s in Stores )
Supply[s][w] <= Open[w] * Capacity[w];
}
execute
{
writeln("obj=",TotalFixedCost + TotalSupplyCost);
}
main
{
var k=0;
thisOplModel.generate();
cp.startNewSearch();
while
(cp.next() && (k<=4))
{
k++;
thisOplModel.postProcess();
thisOplModel.solutions.add(k,thisOplModel.TotalFixedCost + thisOplModel.TotalSupplyCost);
}
}
.dat
SheetConnection sheet("iter.xlsx");
solutions to SheetWrite(sheet,"A1:B4");
запишет 4 решения в файл iter.xls