2016-04-10 12 views
1

AMPL kullanıyorum ilk defa budur ve ben gerçekten tanıdık değilim. Modelimi optimize etmem gerekiyor ama kodlarımın yanlış olduğunu düşünüyorum ve en uygun çözüm olarak "NOS 5.51: 20 değişkenin bütünlüğünü görmezden geliyorum". Benim modelim Min (atık) için konuya olan I attached a picture of constraintsAMPL optimum çözüm sıfırını bulur, tüm değişkenler sıfır olarak ayarlanır

ve burada benim kodlardır:

`set DAY;  #the day we buy ingredient 
set INGRED; #fresh ingredients 
set TIME;  #day that keeps track of the inventory 
param M default 0; 
param cost{INGRED} > 0; #cost for each ingredient (per pound) 
param demand{TIME, INGRED} >= 0; #the expected demand for each ingredient fo each day t 
param min_pur_req > 0; #minimum total cost of order required to get a delivery 
param expiry{INGRED} ; #shelf life of each ingredient 
var amount{t in TIME, i in DAY, j in INGRED} >=0; #is defined only for t = i 
var is_bought {t in TIME,i in DAY,j in INGRED : i <= t }binary; #only for t =i 
var inventory {t in TIME,i in DAY, j in INGRED : i<=t <= i+expiry[j] } >= 0; # t >= i 
var used{t in TIME,i in DAY, j in INGRED : i <= t <= i+expiry[j]} >= 0; 
var waste{t in TIME,i in DAY, j in INGRED : t <= i+expiry[j] } >= 0;` 
minimize Total_waste: 
     sum{t in TIME,i in DAY, j in INGRED : i <= t <= i+expiry[j]} waste[t,i,j]; 
subject to invalid_amount{t in TIME, i in DAY, j in INGRED: i <= t <= i+expiry[j]}: 
     if t != i then amount[t,i,j] = 0; 
subject to invalid_binary{t in TIME, i in DAY, j in INGRED: i <= t <= i+expiry[j]}: 
    if t != i then is_bought[t,i,j] = 0; 
subject to usage{t in TIME, j in INGRED}: 
    sum {i in DAY: i <= t <= i + expiry[j]} used[t,i,j] = demand[t, j]; 
subject to inventory_formula {t in TIME, i in DAY, j in INGRED: i+1 <= t <= i+expiry[j]}: 
    waste[t,i,j] = amount[t,i,j] + inventory[t-1,i,j] - used[t,i,j] - inventory[t,i,j] ; 
subject to cost_check {t in TIME, i in DAY: t = i}: 
    sum {j in INGRED} cost[j]*amount[t,i,j] >= sum{j in INGRED: t <= i+expiry[j]} min_pur_req*is_bought[t,i,j]; 
subject to blah{t in TIME,i in DAY, j in INGRED: i <= t <= i+expiry[j]}: 
     amount[t,i,j] <= M*is_bought[t,i,j]; 
subject to invalid_inventory{t in TIME, i in DAY, j in INGRED: i+1 <= t <= i+expiry[j]}: 
#i+1 because for i = 1 i get error in invetory[0,1,j] 
     if t=i then inventory[t-1,i,j] = 0; 

Bu alıyorum budur:

ampl: model waste.mod; 
ampl: data waste.dat; 
ampl: solve; 
MINOS 5.51: ignoring integrality of 20 variables 
MINOS 5.51: optimal solution found. 
23 iterations, objective 0 

cevap

0

MINOS çözücü doesn İkili değişkenleri desteklemez, sadece süreklidir. Dolayısıyla, integralliği göz ardı eder (gevşetir) ve “20 değişkenin bütünlüğünü görmezden gelme” mesajı ile uyarır. Bir tamsayı çözümü elde etmek için CPLEX veya Gurobi gibi bir AMPL çözücü programlaması kullanmalısınız.

İlgili konular