Decision Optimization

Decision Optimization

Delivers prescriptive analytics capabilities and decision intelligence to improve decision-making.

 View Only
Expand all | Collapse all

Decision variable (or expression) not allowed

  • 1.  Decision variable (or expression) not allowed

    Posted Sun February 11, 2018 09:41 AM

    Originally posted by: Makak


    Hello,
    I have the following problem with OPL:
    "Decision variable (or expression) "x" not allowed"

     

    Code:
    int V = ...;
    int R = ...;
    int S = ...;
    range v = 1..V;
    range r = 1..R;
    range items = 1..R*V;
    range servers = 1..S;
     
    float p[items] = ...;
    int b[items] = ...;
    int d[items] = ...;
    int sb[servers] = ...;

     

    dvar boolean x[items][servers];
    dexpr int t[items] = (sum (m in servers) x[ij][m] >= 1) ? 0 :1;

     

    maximize sum(ij in items)sum(m in servers) x[ij][m]*p[ij];

     

    subject to{
    forall(m in servers)
    sum (ij in items) (x[ij][m]*p[ij]*b[ij] + t[ij])<= sb[m];

    forall(m in servers)
    sum (ij in items) x[ij][m] <= 1;
    }

     
    I have to create a new variable depending on decision variable "x":
    t[items] = (sum (m in servers) x[ij][m] >= 1) ? 0 :1;

     

    I've tried  to do it in several ways:
    1) like in the code above:
    dexpr int t[items] = (sum (m in servers) x[ij][m] >= 1) ? 0 :1;
    Error: "Decision variable (or expression) "x" not allowed"

     

    2) declaration: dvar boolean t[items];
    and in the constraints:
    t[ij in items] == (sum (m in servers) x[ij][m] >= 1) ? 0 :1;
    Error: "Decision variable (or expression) "t" not allowed"

    Could anyone help me?
    Thanks in advance.

    #CPLEXOptimizers
    #DecisionOptimization


  • 2.  Re: Decision variable (or expression) not allowed

    Posted Sun February 11, 2018 01:20 PM

    Hi

     int V = 2;
    int R = 3;
    int S = 4;
    range v = 1..V;
    range r = 1..R;
    range items = 1..R*V;
    range servers = 1..S;
     
    float p[i in items] = i;
    int b[i in items] = i+1;
    int d[i in items] = i;
    int sb[i in servers] = i+2000;

     
    dvar boolean x[items][servers];
    dexpr int t[i in items] = sum (m in servers) (x[i][m] == 0);

     
    maximize sum(ij in items)sum(m in servers) x[ij][m]*p[ij];

     
    subject to{
    forall(m in servers)
    sum (ij in items) (x[ij][m]*p[ij]*b[ij] + t[ij])<= sb[m];

    forall(m in servers)
    sum (ij in items) x[ij][m] <= 1;
    }

    works fine

    regards


    #CPLEXOptimizers
    #DecisionOptimization


  • 3.  Re: Decision variable (or expression) not allowed

    Posted Mon February 12, 2018 01:02 PM

    Originally posted by: Makak


       
    Thanks for the answer, but I need a slightly different variable.
    Pseudocode:
    if(sum (m in servers)x[ij][m] >=1)
    t = 0;
    else
    t = 1;

     

    An example of how it should work:
    x = [[0 1]
        [1 0]
        [1 1]
        [1 1]
        [1 0]
        [0 0]
        [1 1]
        [1 1]];
    t = [0 0 0 0 0 1 0 0]; 

    I've changed it to:
    dexpr int t[ij in items] = ((sum (m in servers) (x[ij][m] == 0))>=1)?0:1; 
    but I still see the same error: "Decision variable (or expression) "x" not allowed"

    #CPLEXOptimizers
    #DecisionOptimization


  • 4.  Re: Decision variable (or expression) not allowed

    Posted Mon February 12, 2018 01:59 PM

    Things like this can be formulate using the 'implies' operator (=>):

    (sum (m in servers)x[ij][m] >= 1) => t == 0
    (sum (m in servers)x[ij][m] == 0) => t == 1

    or by just using the equality operator between constraints:

    (sum (m in servers)x[ij][m] >=1) == (1 - t)

     


    #CPLEXOptimizers
    #DecisionOptimization