Позвольте мне дать 3 способа из "Как позвонить в CPLEX из R" на здесь
- использовать систему в r
- использовать docplexcloud api
- 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]