2017-01-31 2 views
-1

J'ai une fonction dans R fun qui renvoie le coût du vecteur de décision x. L'entrée de la fonction est un vecteur d'entiers de longueur 40. entrée donnée vecteurs a, b et c (également de longueur 40), la fonction est définie comme suit:Optimiser une fonction dans R avec vecteur d'entrée entier qui ajoute à une certaine valeur

fun <- function(x) sum(pmax(a, b, c*x)) 

La somme du vecteur d'entrée doit être 80. Je veux trouver un vecteur d'entrée Vecfun(Vec) est minimisé. Je suppose que c'est un problème assez simple mais je suis perdu sur où commencer parce que je suis nouveau pour les problèmes d'optimisation dans R.

+0

Merci @ErwinKalvelagen, je suis en supposant que même après que je précalculer j'ai encore besoin de tester diverses permutations du vecteur d'entrée qui somme à 80, je ne comprends pas vraiment comment le tri pourrait le résoudre, pouvez-vous m'expliquer s'il vous plaît –

Répondre

0

Ceci est un problème avec 40 variables de décision à valeurs entières, x_1, x_2, ... , x_40. Une façon de déterminer de façon optimale la façon de les régler de telle sorte que votre objectif est réduit au minimum et leur somme à 80 est:

  1. Définissez toutes les variables à 0
  2. augmenter à plusieurs reprises par 1 la variable qui cause la plus faible augmentation de l'objectif
  3. Arrêter une fois qu'ils totalisent 80.

(je vois que Erwin Posté il y a quelques heures une solution avec la même idée)

Ceci peut être facilement mis en œuvre dans R. D'abord, de les vecteurs d'entrée d'échantillons de configuration:

set.seed(144) 
n <- 40 
wanted.sum <- 80 
A <- rnorm(n, 10, 1) 
B <- rnorm(n, 10, 1) 
C <- rnorm(n, 10, 1) 

Ensuite, nous allons calculer le coût supplémentaire de l'ajout nombre des articles 1 à 80 pour chacun de nos 40 variables:

inc.cost <- expand.grid(var=factor(1:n), num=1:80) 
inc.cost$cost <- with(inc.cost, pmax(A[var], B[var], C[var]*num) - 
           pmax(A[var], B[var], C[var]*(num-1))) 
table(head(inc.cost$var[order(inc.cost$cost)], wanted.sum)) 
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 
# 1 1 1 1 1 2 1 2 1 2 1 1 2 1 2 29 1 1 1 2 1 1 1 1 2 1 1 1 2 1 1 2 1 1 2 2 2 
# 38 39 40 
# 1 1 1