R - Оптимизация с помощью «ompr» с векторными входами - PullRequest
0 голосов
/ 23 апреля 2020

Я делаю модель оптимизации с ompr, в которой есть 2 входа, которые являются векторами. Таким образом, индекс каждого элемента вектора должен меняться в параллельном выражении, то есть для первой итерации должен использоваться первый элемент каждого вектора, затем во второй итерации должен использоваться второй элемент каждого вектора, et c ,

library(dplyr)
library(ROI)
library(ROI.plugin.glpk)
library(ompr)
library(ompr.roi)

#Charge matrix
Prize = matrix(c(1000,2000,3000,1500,2500,3500,2000,3000,4000), ncol = 3, nrow = 3)
Thicknesses = matrix(c(25,35,45,55,65,75,85,95,105), ncol = 3, nrow = 3)
Lambdas = matrix(c(0.1,0.22,0.3,1.1,1.2,1.4,1.45,1.5,2.5), ncol = 3, nrow = 3)

#Parameters
Comb_prize = 580
Cal_Power = 1000
Temp = 30
Area = 50
Time_Period = 3
Disc_rate = 0.1
P_min = c(0,0,0)
P_max = c(6,6,6) 
Days = 365
Efficiency = 0.3

#Previus calculations
Period = seq(1,Time_Period)
E_min = P_min*24*Days
E_max = P_max*24*Days
ProductionCost = Comb_prize/Cal_Power
Term_Res = sweep(as.matrix(Thicknesses), MARGIN=1, c(as.matrix(Lambdas)), `/`)
Term_Trans = 1/Term_Res
Dem_Energy = as.matrix(Temp*Area*Term_Trans)
Tot_Cost = as.matrix(Prize*Area)

#Matrix Imputs

Dem_Energy = as.matrix(Temp*Area*Term_Trans)
Tot_Cost = as.matrix(Prize*Area)

Vectorized Matrixes
vec_Tot_Cost = c(Tot_Cost)
vec_Dem_Energy = c(Dem_Energy)

#Indexes
n <- as.numeric(nrow(Prize))
m <- Time_Period

#Model
tot=data.frame()

for(r in (1:length(vec_Tot_Cost))){

  model <- MILPModel() %>%

    #Variables
    add_variable(Energy[i, t], i = 1:n, t = 1:m, type = "integer") %>%
    add_variable(x[i, t], i = 1:n, t = 1:m, type = "binary") %>%


    #Objetive Function
    set_objective(sum_expr(((ProductionCost*(Energy[i,t]/Efficiency))/(1+Disc_rate)^Period[t]), i = 1:n, t = 1:m) +
    vec_Tot_Cost[r], "min") %>%

    #Constraints 
    add_constraint(sum_expr(Energy[i,t], i = 1:n,  t = 1:m) == vec_Dem_Energy[r]) %>% 
    add_constraint(sum_expr(x[i,t], i = 1:n) == 1, t = 1:m) %>% 
    add_constraint(E_min*x[i,t] <= Energy[i,t], i = 1:n, t = 1:m)%>% 
    add_constraint(E_max*x[i,t] >= Energy[i,t], i = 1:n, t = 1:m)

  #Solve the model
  solution <- solve_model(model, with_ROI(solver = "glpk", verbose = TRUE)) 

  #Get the results
  result <- sol %>% get_solution(Energy[i,t])

  #Optimization values matrix for each cost
  r_values=c()
  for (j in 1:nrow(result)){
    r_values[j] = c(r_values,r )
  }
  tot <- do.call(what = cbind, args = data.frame(solution, r_values))

}

#Get the min of iterations
dftot<-as.data.frame(tot)
order<-order(dftot$value)
tot_ord <- dftot[order, ]

Идея заключается в получении кадра данных с каждой итерацией, выполняемой по индексу и периоду времени, например:

variable i t value r_values
Energy   1 1   0     1000
Energy   1 2   0     2000
....
Energy   3 1 5000    2000
Energy   3 2 5000    3000
Energy   3 3 5000    4000

Хотя это будет упорядочено по значению (убывающему). Моя проблема в том, что когда я запускаю код, решаю проблему, но я получаю следующую ошибку и некоторые предупреждающие сообщения, которые не важны.

<SOLVER MSG>  ----
GLPK Simplex Optimizer, v4.47
22 rows, 18 columns, 39 non-zeros
      0: obj =  0.000000000e+000  infeas = 1.454e+001 (4)
*     6: obj =  2.027972028e+001  infeas = 0.000e+000 (1)
OPTIMAL SOLUTION FOUND
GLPK Integer Optimizer, v4.47
22 rows, 18 columns, 39 non-zeros
18 integer variables, 9 of which are binary
Integer optimization begins...
+     6: mip =     not found yet >=              -inf        (1; 0)
+    13: mip =     not found yet >=     tree is empty        (0; 5)
PROBLEM HAS NO INTEGER FEASIBLE SOLUTION
<!SOLVER MSG> ----
Error in as.data.frame.default(x[[i]], optional = TRUE, stringsAsFactors = stringsAsFactors) : 
  cannot coerce class ‘"solution"’ to a data.frame

Я не знаю, возможно ли это сделать это или другой способ, но изначально, по-видимому, он работает с каждым из этих входных параметров и сохраняет только последний элемент вектора «Tot_Cost» и, кроме того, говорит, что проблема не имеет решения, поэтому я был бы признателен любая помощь, которую вы можете оказать мне.

Приветствую и большое спасибо заранее!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...