Diem Nguyen
Diem Nguyen

Reputation: 1

How to code nonlinear constraints in CPlex opl?

This is a part of my Cplex code. I want to code the constraint below but it seems nonlinear constraints and can not run in CPlex opl. Can anyone help me deal with it? Here is the constraint

...



int Z_val = ...;
int T_val = 10;
int I_val = ...;
int J_val = ...;
float alpha = ...; // The average loading rate of delivery trucks;
range Z = 1 .. Z_val;// Number of vessels
range T = 1 .. T_val; // Number of time intervals
range I = 1 .. I_val; // Number of gate lanes
range J = 1 .. J_val; // Number of yard blocks

float beta_zj[Z][J] = ...;

// Define sets
{int} Z_j[J];

// Objective function or constraints go here

execute {
  // Iterate over j and z to update Z sets
  for (var j in J) {
    for (var z in Z) {
      if (beta_zj[z][j] > 0) {
        Z_j[j].add(z); // Add z to the set Z_j[j]
      }
    }
  }

  // Print the result (optional)
  for (var j in J) {
    writeln("Z_j[", j, "] = ", Z_j[j]);
  }
}

// Derived variables
dvar int+ lambda_zt_g[Z][T];// Number of trucks related to vessel z arriving at terminal gate at interval t
dvar int+ lambda_it_g[I][T];// Number of trucks arriving at gate lane i at interval t
dvar int+ lambda_t_y[T];// Number of export containers arriving at yard at interval t
dvar int+ lambda_jt_y[J][T];// Number of export containers arriving at block j at interval t
…..
….
subject to 
{

    forall ( j in J, t in T ){//(15)
    
    lambda_jt_y[j][t] == lambda_t_y[t] * alpha * sum ( z in Z_j[j] )
       (beta_zj[z][j] * lambda_zt_g[z][t] / sum ( i in I ) lambda_it_g[i][t]);
 }   
  

code nonlinear constraints

Upvotes: 0

Views: 114

Answers (1)

Alex Fleischer
Alex Fleischer

Reputation: 10062

Since all your decision variables are integer you could use constraint programming in CPLEX.

The following model works:

using CP;

int Z_val = 10;
int T_val = 10;
int I_val = 10;
int J_val = 2;
float alpha = 0.5; // The average loading rate of delivery trucks;
range Z = 1 .. Z_val;// Number of vessels
range T = 1 .. T_val; // Number of time intervals
range I = 1 .. I_val; // Number of gate lanes
range J = 1 .. J_val; // Number of yard blocks

float beta_zj[i in Z][j in J] = i*j;

// Define sets
{int} Z_j[J];

// Objective function or constraints go here

execute {
  // Iterate over j and z to update Z sets
  for (var j in J) {
    for (var z in Z) {
      if (beta_zj[z][j] > 0) {
        Z_j[j].add(z); // Add z to the set Z_j[j]
      }
    }
  }

  // Print the result (optional)
  for (var j in J) {
    writeln("Z_j[", j, "] = ", Z_j[j]);
  }
}

// Derived variables
dvar int+ lambda_zt_g[Z][T];// Number of trucks related to vessel z arriving at terminal gate at interval t
dvar int+ lambda_it_g[I][T];// Number of trucks arriving at gate lane i at interval t
dvar int+ lambda_t_y[T];// Number of export containers arriving at yard at interval t
dvar int+ lambda_jt_y[J][T];// Number of export containers arriving at block j at interval t
subject to 
{

    forall ( j in J, t in T ){//(15)
    
    lambda_jt_y[j][t] == lambda_t_y[t] * alpha * sum ( z in Z_j[j] )
       (beta_zj[z][j] * lambda_zt_g[z][t]/ sum ( i in I ) lambda_it_g[i][t]);
     }
   }            
 

Upvotes: 0

Related Questions