Hello,
I have a very simple Knapsack problem. I would like to constrain it but I am not exactly sure how to get the GA package to do it. Essentially, I want to stop the optimization from being able to select more than one food item. So all best possible solutions can include one food item but not more than one. So in this case beans which is item 2 with profit 6 and weight 3 cannot be selected with "potatoes" which is item 3 with profit 6 and weight 3.
library(GA)
library(tidyverse)
# Define data
item = c("pocketknife", "beans", "potatoes", "unions",
"sleeping bag", "rope", "compass", "gps", "tar")
p <- c(6, 3, 6, 4, 6, 8, 6, 8, 10) # Profits
w <- c(3, 3, 3, 7, 2, 3, 1, 4, 5) # Weights
W <- 19 # Knapsack ’s capacity
n <- length(p) # Number of items
# Define fitness function
knapsack <- function(x) {
f <- sum(x * p)
penalty <- sum(w) * abs(sum(x * w) - W)
}
#Genetic Algorithm--------------------------------------------------------------
genetic_alg_output <- ga(type="binary",
fitness=knapsack ,
nBits=n,
maxiter=200, # Maximum number of generations
run=100, # Stop if the best-so-far fitness
# hasn't improved for 'run' generations
popSize=1000,
keepBest = TRUE,
seed=101)
final_solutions <- genetic_alg_output@solution
print(final_solutions)