我想知道是否可以从外部软件(例如R)调用CPLEX的目标函数。我使用其OPL在CPLEX中建立了优化模型,我想运行CPLEX模型来优化外部目标函数。有办法吗?
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]