Как вызвать целевую функцию CPLEX из внешнего программного обеспечения? - PullRequest
0 голосов
/ 16 апреля 2020

Я хотел бы знать, могу ли я получить целевую функцию CPLEX, вызываемую из внешнего программного обеспечения, такого как R. Я построил модель оптимизации в CPLEX, используя ее OPL, и я хотел бы запустить модель CPLEX для оптимизации внешней целевой функции , Есть ли способ сделать это?

1 Ответ

1 голос
/ 16 апреля 2020

Позвольте мне дать 3 способа из "Как позвонить в CPLEX из R" на здесь

  1. использовать систему в r
  2. использовать docplexcloud api
  3. use doopl

Подробнее о первом методе:

diet.r

sink("diet.dat")

# function to turn a csv dat file into an opl dat file
translateCsvToOpl <- function(csvfilename,setNameInOpl) {

value<-0


cat(setNameInOpl,"={")


t <-read.table(csvfilename)



for (j in 1:nrow(t)){

cat("<")


for (i in 1:ncol(t)){
     #print(t[j,i]);
       value<-paste(t[j,i]);
     if (i==1) cat("\"");
        cat(value)
if (i==1) cat("\"");

    #cat(",")


}
cat(">,\n")

}  

cat("};")
cat("\n\n")
}


translateCsvToOpl("food.dat","FOODS")
translateCsvToOpl("nutrients.dat","NUTRIENTS")
translateCsvToOpl("foodnutrients.dat","FOOD_NUTRIENTS")

system("oplrun diet.mod diet.dat")

diet.mod

tuple Food
{
    key string name;
    float unit_cost;
    float qmin;
    float qmax;
};

{Food} FOODS=...;



tuple Nutrient 
{
    key string name;
    float qmin;
    float qmax;
}

{Nutrient} NUTRIENTS=...;

tuple food_nutrients
{
    key string name;
    float q1;
    float q2;
    float q3;
    float q4;
    float q5;
    float q6;
    float q7;
}

{food_nutrients} FOOD_NUTRIENTS=...;

float array_FOOD_NUTRIENTS[f in FOODS][n in NUTRIENTS];

// turn tuple set into an array
execute
{
for(var fn in FOOD_NUTRIENTS) 
    for(var n in NUTRIENTS)
        array_FOOD_NUTRIENTS[FOODS.find(fn.name)][n]=fn[fn.getFieldName(1+Opl.ord(NUTRIENTS,n))];
}

// Decision variables
dvar float qty[f in FOODS] in f.qmin .. f.qmax;

// cost
dexpr float cost=sum (f in FOODS) qty[f]*f.unit_cost;

// KPI
dexpr float amount[n in NUTRIENTS] = sum(f in FOODS)
qty[f] * array_FOOD_NUTRIENTS[f,n];

minimize cost;
subject to
{
forall(n in NUTRIENTS) n.qmin<=amount[n]<=n.qmax;
}

execute
{
var f=new IloOplOutputFile("dietoutput.txt");
f.writeln("quantity = ",qty);
f.writeln("cost = ",cost);
f.writeln("amount = ",amount);
f.close();
}

, а затем при запуске Rscript.exe diet.r вы получите

quantity =  [0 2.1552 0 0 0 10 1.8312 0 0.9297]
cost = 2.690409172
amount =  [2000 800 11.278 8518.4 25 256.81 51.174] 
...