最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

no solution in OPL CPLEX for DRLP - Stack Overflow

programmeradmin1浏览0评论

I am trying to run a DRLP within CPLEX. My parameters are in a sperate file. As I don´t have much experience with OPL, I don´t know what I am doing wrong. In my understanding the model should give a solution but I guess, that maybe my running indexes to determine the decision variables and the relations between them are wrong. I attached the code for better understanding my problem.

int I= 6;

range Komplett=1..I;
range I1=1..(I-1);
 int R=2;
 range Reihen=1..R;



// Parameter
float f[i in 1..I][j in 1.. I]=...;
int d=1;
int M=50;
int N=50;;
float w[i in 1..I]=...;
float c_ij[i in 1..I][j in 1..I]=...;
float a_r[i in 1..I]= ...;
float a_l[j in 1..I]=...;
int b[i in 1..I]=...;

w=[1.5,3,3.5,2,2.5,1];

c_ij=[[0,   1.5,    1.5,    2,  1,  0.5],
[1.5,   0,  1.5,    1.5,    1,  1],
[1.5,   1.5,    0,  2,  1.5, 1],
[2, 1.5,    2,  0,  0.5,    0.5],
[1, 1,  1.5,    0.5,    0,  1.5],
[0.5,   1,  1, 0.5  ,1.5    ,0]];

f=[[0,  3.5,    6,  7,  0.5,    6.5],
[6, 0,  8,  4,  6.5,    6.5],
[6, 1,  0,  2.5,    0,  5],
[3.5,   1.5,    1.5,    0,  7.5,    6],
[4, 9,  9,  0.5,    0,  5],
[0.5,   7.5,    5.5,    2.5,    2.5,    0]];

a_r=[1,0.5,0.5,1.5,0,1.5];

a_l=[0,0,0,0,1,1.5];

b=[0,0,0,0,0,1];
 

// Variablen
dvar float+ x[Komplett];
dvar float+ a[ Komplett][Komplett];
dvar boolean y[Komplett][Reihen];
dvar boolean z[Komplett ][Komplett][Reihen];
dvar boolean q[Komplett][Komplett];
dvar boolean p_l[Komplett ];
dvar boolean p_r[Komplett ];
dvar int+ l[Komplett][Reihen];
dvar boolean s[Komplett ][Komplett ][Reihen ];
dvar boolean e[Komplett ][Komplett ][Reihen];
dvar float+ minVal1[Komplett][Komplett]; 
dvar float+ minVal2[Komplett][Komplett];



// Zielfunktion
minimize sum(i in I1, j in (i+1)..I) (f[i][j] + f[j][i]) * (abs(x[j] - x[i]) + d * (1 - q[i][j]));

// Nebenbedingungen
subject to {
  c1:forall(i in Komplett)
    sum(r in Reihen) y[i][r] == 1;
  
 c2: forall(i in I1, j in (i+1)..I, r in Reihen)
    (w[i] * y[i][r] + w[j] * y[j][r]) / 2 + c_ij[i][j] * z[j][i][r] + a[i][j] <= x[i] - x[j] + (M * (1 - z[j][i][r]));
  
  c3:forall(i in I1, j in (i+1)..I, r in Reihen)
    (w[i] * y[i][r] + w[j] * y[j][r]) / 2 + c_ij[i][j] * z[i][j][r] + a[i][j] <= x[j] - x[i] + M * (1 - z[i][j][r]);
 
  
    //NB5 
   c6: forall(i in I1, j in (i+1)..I, r in Reihen)
      M*(1-z[i][j][r]) + a[i][j] >=a_r[i] * p_r[i] + a_l[j] * p_l[j]-minVal1[i][j]*s[i][j][r];
    // //NB6  
     c7:  forall(i in I1, j in (i+1)..I, r in Reihen)
     M*(1-z[j][i][r]) + a[i][j] >=a_r[j] * p_r[j] + a_l[i] * p_l[i]-minVal2[j][i]*s[j][i][r];
     
       //NB7 
  c5: forall(i in I1, j in (i+1)..I, r in Reihen)
    a[i][j] <= a_r[i] * p_r[i] + a_l[j] * p_l[j] - minVal1[i][j] * s[i][j][r] + M * (1 - z[i][j][r]);   
     forall(i in I1, j in (i+1)..I, r in Reihen)
   {minVal1[i][j]<=a_r[i];
    minVal1[i][j]<=a_l[j];
    minVal1[i][j] >= a_r[i] + a_l[j] - M;}
    
     // NB 8
  c4:forall(i in I1, j in (i+1)..I, r in Reihen)
  a[i][j] <= a_r[j] * p_r[j] + a_l[i] * p_l[i] - minVal2[j][i] * s[j][i][r] + M * (1 - z[j][i][r]);
  forall(i in I1, j in (i+1)..I, r in Reihen)
  {minVal2[j][i]<=a_r[j];
  minVal2[j][i]<=a_l[i];
     minVal2[j][i] >= a_r[j] + a_l[i] - M;}
     
     
  c8:forall(i in I1, j in (i+1)..I)
    M * q[i][j] >= a[i][j];
  
  c9:forall(i in 1..I, r in 1..R)
   sum(j in Komplett : j != i) z[j][i][r] == l[i][r];
  
  c10:forall(i in Komplett,j in Komplett:j != j, r in Reihen )
    N * (1 - z[i][j][r]) + l[j][r] - l[i][r] + e[i][j][r] >= 2;
  
  c11:forall(i in Komplett, j in Komplett: j!=i, r in Reihen)
    e[i][j][r] <= z[i][j][r];
  
  c12:forall(r in Reihen)
   sum(i in Komplett, j in Komplett: j != i) e[i][j][r] <= sum(i in Komplett) y[i][r] - 1;
  
  c13:forall(i in Komplett, j in Komplett: j != i, r in Reihen)
    s[i][j][r] <= e[i][j][r];
  
 c14: forall(i in Komplett, j in Komplett: j != i, r in Reihen)
    s[i][j][r] >= p_r[i] + p_l[j] + e[i][j][r] - 2;
  
  c15:forall(i in Komplett)
    sum(j in Komplett: j != i,r in Reihen ) s[i][j][r] <= p_r[i];
  
  c16:forall(j in Komplett)
    sum( i in Komplett: i != j,r in Reihen) s[i][j][r] <= p_l[j];
  
  c17:forall(i in Komplett)
    p_l[i]+p_r[i] >= b[i] + 1;
  
 c18: forall(i in Komplett, j in Komplett:j!=i, r in Reihen)
   z[i][j][r] + z[j][i][r] <= y[i][r];
 
 c19:forall(i in Komplett, j in Komplett:j!=i, r in Reihen)
  z[i][j][r] + z[j][i][r] <= y[j][r];
  
  c20:forall(i in Komplett, j in Komplett:j!=i, r in Reihen)
  z[i][j][r] + z[j][i][r] + 1 >= y[i][r] + y[j][r];
  
  c21:forall(i in Komplett, j in Komplett:j!=i)
   q[i][j] == sum(r in 1..R) (z[i][j][r] + z[j][i][r]);
  
 c22: forall(i in Komplett)
    x[i] - 0.5 * w[i] - a_l[i] * p_l[i] >= 0;
}

I tried to change the running indexes but whatever I am doing, it doesn´t help.

I am trying to run a DRLP within CPLEX. My parameters are in a sperate file. As I don´t have much experience with OPL, I don´t know what I am doing wrong. In my understanding the model should give a solution but I guess, that maybe my running indexes to determine the decision variables and the relations between them are wrong. I attached the code for better understanding my problem.

int I= 6;

range Komplett=1..I;
range I1=1..(I-1);
 int R=2;
 range Reihen=1..R;



// Parameter
float f[i in 1..I][j in 1.. I]=...;
int d=1;
int M=50;
int N=50;;
float w[i in 1..I]=...;
float c_ij[i in 1..I][j in 1..I]=...;
float a_r[i in 1..I]= ...;
float a_l[j in 1..I]=...;
int b[i in 1..I]=...;

w=[1.5,3,3.5,2,2.5,1];

c_ij=[[0,   1.5,    1.5,    2,  1,  0.5],
[1.5,   0,  1.5,    1.5,    1,  1],
[1.5,   1.5,    0,  2,  1.5, 1],
[2, 1.5,    2,  0,  0.5,    0.5],
[1, 1,  1.5,    0.5,    0,  1.5],
[0.5,   1,  1, 0.5  ,1.5    ,0]];

f=[[0,  3.5,    6,  7,  0.5,    6.5],
[6, 0,  8,  4,  6.5,    6.5],
[6, 1,  0,  2.5,    0,  5],
[3.5,   1.5,    1.5,    0,  7.5,    6],
[4, 9,  9,  0.5,    0,  5],
[0.5,   7.5,    5.5,    2.5,    2.5,    0]];

a_r=[1,0.5,0.5,1.5,0,1.5];

a_l=[0,0,0,0,1,1.5];

b=[0,0,0,0,0,1];
 

// Variablen
dvar float+ x[Komplett];
dvar float+ a[ Komplett][Komplett];
dvar boolean y[Komplett][Reihen];
dvar boolean z[Komplett ][Komplett][Reihen];
dvar boolean q[Komplett][Komplett];
dvar boolean p_l[Komplett ];
dvar boolean p_r[Komplett ];
dvar int+ l[Komplett][Reihen];
dvar boolean s[Komplett ][Komplett ][Reihen ];
dvar boolean e[Komplett ][Komplett ][Reihen];
dvar float+ minVal1[Komplett][Komplett]; 
dvar float+ minVal2[Komplett][Komplett];



// Zielfunktion
minimize sum(i in I1, j in (i+1)..I) (f[i][j] + f[j][i]) * (abs(x[j] - x[i]) + d * (1 - q[i][j]));

// Nebenbedingungen
subject to {
  c1:forall(i in Komplett)
    sum(r in Reihen) y[i][r] == 1;
  
 c2: forall(i in I1, j in (i+1)..I, r in Reihen)
    (w[i] * y[i][r] + w[j] * y[j][r]) / 2 + c_ij[i][j] * z[j][i][r] + a[i][j] <= x[i] - x[j] + (M * (1 - z[j][i][r]));
  
  c3:forall(i in I1, j in (i+1)..I, r in Reihen)
    (w[i] * y[i][r] + w[j] * y[j][r]) / 2 + c_ij[i][j] * z[i][j][r] + a[i][j] <= x[j] - x[i] + M * (1 - z[i][j][r]);
 
  
    //NB5 
   c6: forall(i in I1, j in (i+1)..I, r in Reihen)
      M*(1-z[i][j][r]) + a[i][j] >=a_r[i] * p_r[i] + a_l[j] * p_l[j]-minVal1[i][j]*s[i][j][r];
    // //NB6  
     c7:  forall(i in I1, j in (i+1)..I, r in Reihen)
     M*(1-z[j][i][r]) + a[i][j] >=a_r[j] * p_r[j] + a_l[i] * p_l[i]-minVal2[j][i]*s[j][i][r];
     
       //NB7 
  c5: forall(i in I1, j in (i+1)..I, r in Reihen)
    a[i][j] <= a_r[i] * p_r[i] + a_l[j] * p_l[j] - minVal1[i][j] * s[i][j][r] + M * (1 - z[i][j][r]);   
     forall(i in I1, j in (i+1)..I, r in Reihen)
   {minVal1[i][j]<=a_r[i];
    minVal1[i][j]<=a_l[j];
    minVal1[i][j] >= a_r[i] + a_l[j] - M;}
    
     // NB 8
  c4:forall(i in I1, j in (i+1)..I, r in Reihen)
  a[i][j] <= a_r[j] * p_r[j] + a_l[i] * p_l[i] - minVal2[j][i] * s[j][i][r] + M * (1 - z[j][i][r]);
  forall(i in I1, j in (i+1)..I, r in Reihen)
  {minVal2[j][i]<=a_r[j];
  minVal2[j][i]<=a_l[i];
     minVal2[j][i] >= a_r[j] + a_l[i] - M;}
     
     
  c8:forall(i in I1, j in (i+1)..I)
    M * q[i][j] >= a[i][j];
  
  c9:forall(i in 1..I, r in 1..R)
   sum(j in Komplett : j != i) z[j][i][r] == l[i][r];
  
  c10:forall(i in Komplett,j in Komplett:j != j, r in Reihen )
    N * (1 - z[i][j][r]) + l[j][r] - l[i][r] + e[i][j][r] >= 2;
  
  c11:forall(i in Komplett, j in Komplett: j!=i, r in Reihen)
    e[i][j][r] <= z[i][j][r];
  
  c12:forall(r in Reihen)
   sum(i in Komplett, j in Komplett: j != i) e[i][j][r] <= sum(i in Komplett) y[i][r] - 1;
  
  c13:forall(i in Komplett, j in Komplett: j != i, r in Reihen)
    s[i][j][r] <= e[i][j][r];
  
 c14: forall(i in Komplett, j in Komplett: j != i, r in Reihen)
    s[i][j][r] >= p_r[i] + p_l[j] + e[i][j][r] - 2;
  
  c15:forall(i in Komplett)
    sum(j in Komplett: j != i,r in Reihen ) s[i][j][r] <= p_r[i];
  
  c16:forall(j in Komplett)
    sum( i in Komplett: i != j,r in Reihen) s[i][j][r] <= p_l[j];
  
  c17:forall(i in Komplett)
    p_l[i]+p_r[i] >= b[i] + 1;
  
 c18: forall(i in Komplett, j in Komplett:j!=i, r in Reihen)
   z[i][j][r] + z[j][i][r] <= y[i][r];
 
 c19:forall(i in Komplett, j in Komplett:j!=i, r in Reihen)
  z[i][j][r] + z[j][i][r] <= y[j][r];
  
  c20:forall(i in Komplett, j in Komplett:j!=i, r in Reihen)
  z[i][j][r] + z[j][i][r] + 1 >= y[i][r] + y[j][r];
  
  c21:forall(i in Komplett, j in Komplett:j!=i)
   q[i][j] == sum(r in 1..R) (z[i][j][r] + z[j][i][r]);
  
 c22: forall(i in Komplett)
    x[i] - 0.5 * w[i] - a_l[i] * p_l[i] >= 0;
}

I tried to change the running indexes but whatever I am doing, it doesn´t help.

Share edited Feb 19 at 13:45 desertnaut 60.4k32 gold badges152 silver badges180 bronze badges asked Feb 10 at 20:07 user29585664user29585664 32 bronze badges 2
  • Can you also share the .dat part so that other user could try ? – Alex Fleischer Commented Feb 11 at 8:28
  • Hi, I added the data and did some minor changes at the program, as I had a typo in c6 and c7. Without the constraints c4, c5, c6 and c7 I now get a result, but with those constraints I get the error "Ausnahme von IBM ILOG CPLEX Error 5002: q7 is not convex. D you have an idea what could cause this error? – user29585664 Commented Feb 12 at 21:37
Add a comment  | 

1 Answer 1

Reset to default 0

In your model you have many times the product of a binary decision variable and an integer decision variable. You should change that into a way CPLEX could handle.

See this example I wrote

// suppose we want b * x <= 7 

dvar int x in 2..10;
dvar boolean b;

dvar int bx;

maximize x;
subject to
{
  
// Linearization  
bx<=7;

 

2*b<=bx;
bx<=10*b;

bx<=x-2*(1-b);
bx>=x-10*(1-b);

// if we use CP we could write directly
// b*x<=7

// or rely on logical constraints within CPLEX
// (b==1) => (bx==x);
// (b==0) => (bx==0);
}
发布评论

评论列表(0)

  1. 暂无评论
ok 不同模板 switch ($forum['model']) { /*case '0': include _include(APP_PATH . 'view/htm/read.htm'); break;*/ default: include _include(theme_load('read', $fid)); break; } } break; case '10': // 主题外链 / thread external link http_location(htmlspecialchars_decode(trim($thread['description']))); break; case '11': // 单页 / single page $attachlist = array(); $imagelist = array(); $thread['filelist'] = array(); $threadlist = NULL; $thread['files'] > 0 and list($attachlist, $imagelist, $thread['filelist']) = well_attach_find_by_tid($tid); $data = data_read_cache($tid); empty($data) and message(-1, lang('data_malformation')); $tidlist = $forum['threads'] ? page_find_by_fid($fid, $page, $pagesize) : NULL; if ($tidlist) { $tidarr = arrlist_values($tidlist, 'tid'); $threadlist = well_thread_find($tidarr, $pagesize); // 按之前tidlist排序 $threadlist = array2_sort_key($threadlist, $tidlist, 'tid'); } $allowpost = forum_access_user($fid, $gid, 'allowpost'); $allowupdate = forum_access_mod($fid, $gid, 'allowupdate'); $allowdelete = forum_access_mod($fid, $gid, 'allowdelete'); $access = array('allowpost' => $allowpost, 'allowupdate' => $allowupdate, 'allowdelete' => $allowdelete); $header['title'] = $thread['subject']; $header['mobile_link'] = $thread['url']; $header['keywords'] = $thread['keyword'] ? $thread['keyword'] : $thread['subject']; $header['description'] = $thread['description'] ? $thread['description'] : $thread['brief']; $_SESSION['fid'] = $fid; if ($ajax) { empty($conf['api_on']) and message(0, lang('closed')); $apilist['header'] = $header; $apilist['extra'] = $extra; $apilist['access'] = $access; $apilist['thread'] = well_thread_safe_info($thread); $apilist['thread_data'] = $data; $apilist['forum'] = $forum; $apilist['imagelist'] = $imagelist; $apilist['filelist'] = $thread['filelist']; $apilist['threadlist'] = $threadlist; message(0, $apilist); } else { include _include(theme_load('single_page', $fid)); } break; default: message(-1, lang('data_malformation')); break; } ?>