首页 > 解决方案 > CPLEX Ilog Studio 放宽了重要约束 - 未正确求解

问题描述

我是使用 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");

标签: cplexilog

解决方案


如果模型不可行,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;
         }

然后该约束将变成硬约束(不能放松的约束)


推荐阅读