-
Notifications
You must be signed in to change notification settings - Fork 5
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
844c587
commit 84eb583
Showing
1 changed file
with
61 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
library(ecr) | ||
library(plyr) | ||
library(reshape2) | ||
|
||
set.seed(1) | ||
|
||
# knapsack with 10 objects A, B, ..., J with weight w_i and value v_i | ||
ks = data.frame( | ||
object = LETTERS[1:10], | ||
weight = c(10, 11, 4, 2, 2, 9, 3, 5, 15, 4), | ||
value = c(5, 10, 1, 6, 3, 5, 3, 19, 23, 1) | ||
) | ||
|
||
# knapsack capacity | ||
ks.limit = 25 | ||
|
||
# objective function to be maximized, i.e., total value of bagged objects, | ||
# under the restriction of the total weight being lower than the capacity. | ||
obj.fun = makeSingleObjectiveFunction( | ||
fn = function(x) { | ||
val = sum(x * ks$value) | ||
weight = sum(x * ks$weight) | ||
if (weight > ks.limit) | ||
return(0) | ||
return(val) | ||
}, | ||
minimize = FALSE, # here we maximize | ||
par.set = makeParamSet( | ||
makeIntegerVectorParam(id = "x", lower = 0, upper = 1, len = nrow(ks)) | ||
) | ||
) | ||
|
||
# use "natural" binary representation x = (x_1, ..., x_n) with x_i = 1 means, | ||
# that object i is bagged and x_i = 0 otherwise. | ||
control = setupECRControl( | ||
representation = "binary", | ||
n.population = 25, | ||
n.offspring = 10, | ||
monitor = NULL, | ||
logger = setupOptPathLoggingMonitor(), | ||
survival.strategy = "plus", | ||
stopping.conditions = list(setupMaximumIterationsTerminator(max.iter = 100L)) | ||
) | ||
|
||
# run algorithm | ||
res = doTheEvolution(obj.fun, control) | ||
|
||
# extract EA knapsack solution | ||
print(res$best.value) | ||
print(res$best.param) | ||
print(ks[as.logical(res$best.param), ]) | ||
|
||
# plot optimization path | ||
op = as.data.frame(res$opt.path) | ||
op = ddply(op, .variables = c("dob"), summarize, mean = mean(y), max = max(y)) | ||
op = melt(op, "dob", value.name = "Value", variable.name = "Stat") | ||
|
||
pl = ggplot(op, aes(x = dob, y = Value, colour = Stat)) + geom_line() | ||
pl = pl + xlab("Generation") + ylab("Total value") | ||
print(pl) | ||
#ggsave(filename = "KP_trace.pdf", width = 6, height = 3) |