CPLEX Ilog Studio ослабляет важное ограничение - не решая правильно - PullRequest
0 голосов
/ 29 октября 2018

Я новичок в использовании CPLEX Studio.Я использую студенческую версию и, следовательно, не могу записать проблему в службу поддержки IBM.

Я использую проблему cplex, вставленную ниже.Проблема заключается в ограничении minedOnlyOnce.Предполагается, что блок будет добываться только один раз, но блок будет добываться более одного раза.

{int} TimePeriods =...;

{int} Blocks =...;



float value[Blocks] = ...;
float oreTons[Blocks] = ...;
float wasteTons[Blocks] = ...;
float resourceMaxCap =...;
float processMinCap =...;


 tuple blockType {
    int id;
    int x;
    int y;
    int z;
 };

{blockType} BlocksType = ...;

{blockType} Ontop[j in BlocksType] =
     {i | i in BlocksType: j.z == i.z +1 &&
                        ((j.x  == i.x-1 ) ||
                         (j.x  == i.x+1 ) ||
                         (j.x  == i.x )  ) &&
                        ((j.y  == i.y-1 ) ||
                         (j.y  == i.y+1 ) ||
                         (j.y  == i.y )  ) };




dvar boolean schedule[Blocks][TimePeriods];


maximize

sum( b in Blocks, t in TimePeriods) ( value[b] * schedule[b][t] * 1/(1+0.1)^t );


subject to{


forall(b in Blocks) {
         minedOnlyOnce :
         sum( t in TimePeriods) (schedule[b][t]) <= 1;
         }


forall( i in BlocksType,t in TimePeriods) {
        BlocksOnTop :
        sum(j in Ontop[i])(t) * schedule[i.id][t]-sum(j in Ontop[i])sum(r in TimePeriods : r <= t)(schedule[j.id][r]) <=0 ;
        }




forall(t in TimePeriods) {
         resourceAvailable :
         sum(b in Blocks)  (schedule[b][t]*oreTons[b]+schedule[b][t]*wasteTons[b]) <= resourceMaxCap;
         }



forall(t in TimePeriods) {
         minProcessFeed :
         sum(b in Blocks)(schedule[b][t]*oreTons[b]) >= processMinCap;
         }


}
SheetConnection sheet("3D_27block_data.xlsx");

BlocksType from SheetRead(sheet,"Data!A2:D28");
Blocks from SheetRead(sheet,"Data!A2:A28");
TimePeriods from SheetRead(sheet,"Data!O2:O4");

value from SheetRead(sheet,"Data!H2:H28");
oreTons from SheetRead(sheet,"Data!F2:F28");
wasteTons from SheetRead(sheet,"Data!G2:G28");

resourceMaxCap from SheetRead(sheet,"Data!P2:P4");
processMinCap from SheetRead(sheet,"Data!Q2:Q4");

schedule to SheetWrite(sheet,"Data!I2:K28");

1 Ответ

0 голосов
/ 29 октября 2018

если модель невозможна, CPLEX может ослабить помеченные ограничения и дать смягченное решение.

Если вы включите

forall(b in Blocks) {
         minedOnlyOnce :
         sum( t in TimePeriods) (schedule[b][t]) <= 1;
         }

на

forall(b in Blocks) {
         //minedOnlyOnce :
         sum( t in TimePeriods) (schedule[b][t]) <= 1;
         }

тогда это ограничение превратится в жесткое ограничение (которое нельзя ослабить)

...