如何从外部软件调用CPLEX的目标函数?

问题描述 投票:0回答:1

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

r cplex
1个回答
1
投票
让我从here处的“如何从R调用CPLEX中给出三种方式

    在r中使用系统
  1. 使用docplexcloud api
  2. 使用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]

  • © www.soinside.com 2019 - 2024. All rights reserved.