IC5Notice: We have upgraded developerWorks Community to the latest version of IBM Connections. For more information, read our upgrade FAQ.
Topic
  • 6 replies
  • Latest Post - ‏2012-11-13T08:41:34Z by SystemAdmin
SystemAdmin
SystemAdmin
623 Posts

Pinned topic Find Errors

‏2012-11-08T11:23:14Z |
Hi,
cplex said:OPL cannot extract expression: sum(h in 1..2) (a(h)(k)(l)*p(h)(i) in my subject,I cannot find the errors and what I should modify.
Thank you very much.

subject to {
forall(i in Demands,k in Demandinstances,l in Supplyitems)
sum(h in Disastertypes) a[h][k][l]*p[h][i][l]*d1[h][i][k]==d2[i][k][l];
}
Updated on 2012-11-13T08:41:34Z at 2012-11-13T08:41:34Z by SystemAdmin
  • GGR
    GGR
    68 Posts

    Re: Find Errors

    ‏2012-11-08T17:00:01Z  
    Hi

    There is several reason why such an error happen. Typical cases are

    • Two among a, p and d1 are variable or expression. That is a non linear term whileyou are using cplex. To be sure using constraint programming declare ''using CP'' at first line of the .mod files
    • some of the arrays are declared but not filled.

    There is other possible case but you should send your project that we can have a look

    Hope that helps
  • SystemAdmin
    SystemAdmin
    623 Posts

    Re: Find Errors

    ‏2012-11-09T00:54:05Z  
    • GGR
    • ‏2012-11-08T17:00:01Z
    Hi

    There is several reason why such an error happen. Typical cases are

    • Two among a, p and d1 are variable or expression. That is a non linear term whileyou are using cplex. To be sure using constraint programming declare ''using CP'' at first line of the .mod files
    • some of the arrays are declared but not filled.

    There is other possible case but you should send your project that we can have a look

    Hope that helps
    /*.mod*/
    This is my project,my data seem to existing problems.I am just contacting cplex this software.Please help me find the errors,thank you very much.

    using CP;
    int NumWarehouses = ...;
    range Warehouses = 1..NumWarehouses;

    int Numdisastertypes=...;
    range Disastertypes=1..Numdisastertypes;

    int Numdemands=...;
    range Demands=1..Numdemands;

    int Numsupplys=...;
    range Supplyitems=1..Numsupplys;

    int Numdemandinstances=...;
    range Demandinstances=1..Numdemandinstances;

    int N=...;
    int Q=...;
    float Possiblek in Demandinstances=1/10;

    //{float} ti in Demands,j in Supplys
    int t2i in Demandsj in Warehouses=336;
    int t1i in Demandsj in Warehouses=...;
    int d1h in Disastertypesi in Demandsk in Demandinstances=...;
    int ah in Disastertypesi in Demandsl in Supplyitems=...;
    float ph in Disastertypesi in Demandsl in Supplyitems=...;
    //int d2i in Demandsk in Demandinstancesl in Supplyitems;

    dvar boolean yj in Warehouses;
    dvar int+ qj in Warehousesl in Supplyitems;
    dvar int+ x1i in Demandsj in Warehousesk in Demandinstancesl in Supplyitems;
    dvar int+ x2i in Demandsk in Demandinstancesl in Supplyitems;

    dvar int d2i in Demandsk in Demandinstancesl in Supplyitems;
    dexpr float objective=sum(k in Demandinstances) Possible[k]*(sum(i in Demands,l in Supplyitems,j in Warehouses) x2[i][k][l]*t2[i][j]+sum(i in Demands,j in Warehouses,l in Supplyitems) x1[i][j][k][l]*t1[i][j])/sum(i in Demands,l in Supplyitems) d2[i][k][l];

    minimize objective;
    //constraint d2i in Demandsk in Demandinstancesl in Supplyitems;
    subject to {
    forall(i in Demands,k in Demandinstances,l in Supplyitems)
    sum(h in Disastertypes) a[h][k][l]*p[h][i][l]*d1[h][i][k]==d2[i][k][l];

    forall(i in Demands,k in Demandinstances,l in Supplyitems)
    sum(j in Warehouses) x1[i][j][k][l]+x2[i][k][l]>=d2[i][k][l];

    forall(j in Warehouses,k in Demandinstances,l in Supplyitems)
    sum(i in Demands) x1[i][j][k][l]<=q[j][l];

    forall(j in Warehouses,l in Warehouses)
    q[j][l]<=Q*y[j];

    sum(j in Warehouses,l in Warehouses)q[j][l]<=Q;

    sum(j in Warehouses) y[j]<=N;
    }
    /*.dat*/

    NumWarehouses=4;
    Numdisastertypes=2;
    Numdemands=6;
    Numsupplys=3;
    Numdemandinstances=10;
    N=3;
    Q =30000;

    d1=[[ 959 538 784 656 845 576 553 542 591 775
    643 527 735 764 874 913 981 700 632 572
    879 765 506 583 725 769 502 630 573 927
    877 890 669 801 542 998 887 900 568 811
    690 967 581 631 614 539 909 716 935 675
    784 565 897 827 957 721 934 955 790 757]
    [ 701 709 669 621 788 522 774 684 743 909
    538 525 950 702 530 584 648 813 718 897
    620 951 685 548 617 825 872 890 723 822
    562 972 556 566 677 866 594 541 653 689
    592 745 890 971 911 824 843 965 754 906
    620 745 695 978 508 725 592 888 755 766]];

    p=[[http://0.75 0.5 0.25
    http://0.5 0.5 0.75
    http://0.25 0.25 0.75
    http://0.25 0.25 0.75
    http://0.5 0.75 0.5
    http://0.75 0.5 0.25]
    [http://0.75 0.5 0.5
    http://0.5 0.5 0.75
    http://0.75 0.5 0.25
    http://0.75 0.25 0.75
    http://0.5 0.75 0.5
    http://0.75 0.5 0.25]];

    a=[[2 1 1
    5 2 4
    1 2 3
    5 4 4
    5 2 4
    4 4 5]
    [ 5 3 4
    2 3 3
    4 5 2
    2 3 2
    1 3 5
    4 4 1]];
    t1=[ 4 2 5 4
    5 3 3 5
    2 5 4 4
    5 5 2 1
    4 2 3 4
    1 5 5 5];
  • ChrisBr
    ChrisBr
    40 Posts

    Re: Find Errors

    ‏2012-11-09T17:05:26Z  
    /*.mod*/
    This is my project,my data seem to existing problems.I am just contacting cplex this software.Please help me find the errors,thank you very much.

    using CP;
    int NumWarehouses = ...;
    range Warehouses = 1..NumWarehouses;

    int Numdisastertypes=...;
    range Disastertypes=1..Numdisastertypes;

    int Numdemands=...;
    range Demands=1..Numdemands;

    int Numsupplys=...;
    range Supplyitems=1..Numsupplys;

    int Numdemandinstances=...;
    range Demandinstances=1..Numdemandinstances;

    int N=...;
    int Q=...;
    float Possiblek in Demandinstances=1/10;

    //{float} ti in Demands,j in Supplys
    int t2i in Demandsj in Warehouses=336;
    int t1i in Demandsj in Warehouses=...;
    int d1h in Disastertypesi in Demandsk in Demandinstances=...;
    int ah in Disastertypesi in Demandsl in Supplyitems=...;
    float ph in Disastertypesi in Demandsl in Supplyitems=...;
    //int d2i in Demandsk in Demandinstancesl in Supplyitems;

    dvar boolean yj in Warehouses;
    dvar int+ qj in Warehousesl in Supplyitems;
    dvar int+ x1i in Demandsj in Warehousesk in Demandinstancesl in Supplyitems;
    dvar int+ x2i in Demandsk in Demandinstancesl in Supplyitems;

    dvar int d2i in Demandsk in Demandinstancesl in Supplyitems;
    dexpr float objective=sum(k in Demandinstances) Possible[k]*(sum(i in Demands,l in Supplyitems,j in Warehouses) x2[i][k][l]*t2[i][j]+sum(i in Demands,j in Warehouses,l in Supplyitems) x1[i][j][k][l]*t1[i][j])/sum(i in Demands,l in Supplyitems) d2[i][k][l];

    minimize objective;
    //constraint d2i in Demandsk in Demandinstancesl in Supplyitems;
    subject to {
    forall(i in Demands,k in Demandinstances,l in Supplyitems)
    sum(h in Disastertypes) a[h][k][l]*p[h][i][l]*d1[h][i][k]==d2[i][k][l];

    forall(i in Demands,k in Demandinstances,l in Supplyitems)
    sum(j in Warehouses) x1[i][j][k][l]+x2[i][k][l]>=d2[i][k][l];

    forall(j in Warehouses,k in Demandinstances,l in Supplyitems)
    sum(i in Demands) x1[i][j][k][l]<=q[j][l];

    forall(j in Warehouses,l in Warehouses)
    q[j][l]<=Q*y[j];

    sum(j in Warehouses,l in Warehouses)q[j][l]<=Q;

    sum(j in Warehouses) y[j]<=N;
    }
    /*.dat*/

    NumWarehouses=4;
    Numdisastertypes=2;
    Numdemands=6;
    Numsupplys=3;
    Numdemandinstances=10;
    N=3;
    Q =30000;

    d1=[[ 959 538 784 656 845 576 553 542 591 775
    643 527 735 764 874 913 981 700 632 572
    879 765 506 583 725 769 502 630 573 927
    877 890 669 801 542 998 887 900 568 811
    690 967 581 631 614 539 909 716 935 675
    784 565 897 827 957 721 934 955 790 757]
    [ 701 709 669 621 788 522 774 684 743 909
    538 525 950 702 530 584 648 813 718 897
    620 951 685 548 617 825 872 890 723 822
    562 972 556 566 677 866 594 541 653 689
    592 745 890 971 911 824 843 965 754 906
    620 745 695 978 508 725 592 888 755 766]];

    p=[[http://0.75 0.5 0.25
    http://0.5 0.5 0.75
    http://0.25 0.25 0.75
    http://0.25 0.25 0.75
    http://0.5 0.75 0.5
    http://0.75 0.5 0.25]
    [http://0.75 0.5 0.5
    http://0.5 0.5 0.75
    http://0.75 0.5 0.25
    http://0.75 0.25 0.75
    http://0.5 0.75 0.5
    http://0.75 0.5 0.25]];

    a=[[2 1 1
    5 2 4
    1 2 3
    5 4 4
    5 2 4
    4 4 5]
    [ 5 3 4
    2 3 3
    4 5 2
    2 3 2
    1 3 5
    4 4 1]];
    t1=[ 4 2 5 4
    5 3 3 5
    2 5 4 4
    5 5 2 1
    4 2 3 4
    1 5 5 5];
    Hello,

    Please, be careful at your indices.

    For example, in the expression
    
    forall(i in Demands,k in Demandinstances,l in Supplyitems) sum(h in Disastertypes) a[h][k][l]*p[h][i][l]*d1[h][i][k]==d2[i][k][l];
    


    k will iterate in Demandinstances so in 1..10 although a is defined with
    
    
    
    int a[h in Disastertypes][i in Demands][l in Supplyitems]
    

    so
    
    
    
    int a[h in 1..2][i in 1..6][l in 1..3]
    

    thus, when k becomes > 6, OPL will raise an error "Index out of bound".

    Same issue for the expressions:
    
    sum(j in Warehouses,l in Warehouses) q[j][l]<=...
    

    you should write:
    
    sum(j in Warehouses,l in Supplyitems) q[j][l]<=...
    


    I hope this helps,

    Chris.
  • SystemAdmin
    SystemAdmin
    623 Posts

    Re: Find Errors

    ‏2012-11-10T09:26:02Z  
    • ChrisBr
    • ‏2012-11-09T17:05:26Z
    Hello,

    Please, be careful at your indices.

    For example, in the expression
    <pre class="jive-pre"> forall(i in Demands,k in Demandinstances,l in Supplyitems) sum(h in Disastertypes) a[h][k][l]*p[h][i][l]*d1[h][i][k]==d2[i][k][l]; </pre>

    k will iterate in Demandinstances so in 1..10 although a is defined with
    <pre class="jive-pre"> int a[h in Disastertypes][i in Demands][l in Supplyitems] </pre>
    so
    <pre class="jive-pre"> int a[h in 1..2][i in 1..6][l in 1..3] </pre>
    thus, when k becomes > 6, OPL will raise an error "Index out of bound".

    Same issue for the expressions:
    <pre class="jive-pre"> sum(j in Warehouses,l in Warehouses) q[j][l]<=... </pre>
    you should write:
    <pre class="jive-pre"> sum(j in Warehouses,l in Supplyitems) q[j][l]<=... </pre>

    I hope this helps,

    Chris.
    Firstly,thank you for your helps. I changed the definition and the subject,but the cplex still said"CP cannot extract expression",can you help me?thank you very much.
    int t2http://i in 1..6http://j in 1..4=336;

    int t1http://i in 1..6http://j in 1..4=...;

    int d1http://h in 1..2http://i in 1..6http://k in 1..10=...;

    int ahttp://h in 1..2http://i in 1..6http://l in 1..3=...;

    float phttp://h in 1..2http://i in 1..6http://l in 1..3=...;
    subject to {
    forall(i in 1..6,k in 1..10,l in 1..3)
    sum(h in 1..2) a[h][k][l]*p[h][i][l]*d1[h][i][k]==d2[i][k][l];

    forall(i in 1..6,k in 1..10,l in 1..3)
    sum(j in 1..4) x1[i][j][k][l]+x2[i][k][l]>=d2[i][k][l];

    forall(j in 1..4,k in 1..10,l in 1..3)
    sum(i in 1..6) x1[i][j][k][l]<=q[j][l];

    forall(j in 1..4,l in 1..3)
    q[j][l]<=Q*y[j];

    sum(j in 1..4,l in 1..3)q[j][l]<=Q;

    sum(j in 1..4) y[j]<=N;
    }
  • ChrisBr
    ChrisBr
    40 Posts

    Re: Find Errors

    ‏2012-11-12T13:24:03Z  
    Firstly,thank you for your helps. I changed the definition and the subject,but the cplex still said"CP cannot extract expression",can you help me?thank you very much.
    int t2http://i in 1..6http://j in 1..4=336;

    int t1http://i in 1..6http://j in 1..4=...;

    int d1http://h in 1..2http://i in 1..6http://k in 1..10=...;

    int ahttp://h in 1..2http://i in 1..6http://l in 1..3=...;

    float phttp://h in 1..2http://i in 1..6http://l in 1..3=...;
    subject to {
    forall(i in 1..6,k in 1..10,l in 1..3)
    sum(h in 1..2) a[h][k][l]*p[h][i][l]*d1[h][i][k]==d2[i][k][l];

    forall(i in 1..6,k in 1..10,l in 1..3)
    sum(j in 1..4) x1[i][j][k][l]+x2[i][k][l]>=d2[i][k][l];

    forall(j in 1..4,k in 1..10,l in 1..3)
    sum(i in 1..6) x1[i][j][k][l]<=q[j][l];

    forall(j in 1..4,l in 1..3)
    q[j][l]<=Q*y[j];

    sum(j in 1..4,l in 1..3)q[j][l]<=Q;

    sum(j in 1..4) y[j]<=N;
    }
    Hello,

    This is the same issue.
    In the expression
    
    forall(i in 1..6,k in 1..10,l in 1..3) sum(h in 1..2) a[h][k][l]*p[h][i][l]*d1[h][i][k]==d2[i][k][l];
    

    k will iterate in 1..10 although a is defined with
    
    
    
    int a[h in 1..2][i in 1..6][l in 1..3]
    

    so the second index of a can take its values only in 1..6
    thus, when k becomes > 6, OPL raises an error "Index out of bound".

    Didn't you intend to write "a[h][ i ][l]" instead of "a[h][ k ][l]"?
    
    forall(i in 1..6,k in 1..10,l in 1..3) sum(h in 1..2) a[h][i][l]*p[h][i][l]*d1[h][i][k]==d2[i][k][l];
    


    Regards,

    Chris.
  • SystemAdmin
    SystemAdmin
    623 Posts

    Re: Find Errors

    ‏2012-11-13T08:41:34Z  
    • ChrisBr
    • ‏2012-11-12T13:24:03Z
    Hello,

    This is the same issue.
    In the expression
    <pre class="jive-pre"> forall(i in 1..6,k in 1..10,l in 1..3) sum(h in 1..2) a[h][k][l]*p[h][i][l]*d1[h][i][k]==d2[i][k][l]; </pre>
    k will iterate in 1..10 although a is defined with
    <pre class="jive-pre"> int a[h in 1..2][i in 1..6][l in 1..3] </pre>
    so the second index of a can take its values only in 1..6
    thus, when k becomes > 6, OPL raises an error "Index out of bound".

    Didn't you intend to write "a[h][ i ][l]" instead of "a[h][ k ][l]"?
    <pre class="jive-pre"> forall(i in 1..6,k in 1..10,l in 1..3) sum(h in 1..2) a[h][i][l]*p[h][i][l]*d1[h][i][k]==d2[i][k][l]; </pre>

    Regards,

    Chris.
    Thank you very much,Under your helps,I have solve my questions,my data may have some questions,the answer express"Terminated normally, model has no solution",thank you!