## 5 Conclusions
**Appendix A**  
R code for the example finding potentially successful three-feature product variants:  
data \(<\)- data.frame(weight1 = numeric(1), weight2 = numeric(1), weight3 = numeric(1))  
#start of the three-row table normalization  
norm11 \(<\) 100/(100 + 70 + 60); norm21 \(<\) 70/(100 + 70 + 60); norm31 \(<\) 60/(100 + 70 + 60)  
norm12 \(<\) 80/(80 + 90 + 95); norm22 \(<\) 90/(80 + 90 + 95); norm32 \(<\) 95/(80 + 90 + 95)  
norm13 \(<\) (1/70)/((1/70) + (1/66) + (1/65.5)); norm23 \(<\) (1/66)/((1/70) + (1/66) + (1/65.5))  
norm33 \(<\) (1/65.5)/((1/70) + (1/66) + (1/65.5))  
#end of the data normalization  
for (i in 1:8) {  
for (j in 1:(9-i)) {  
w1 \(<\) - i/10; w2 \(<\) j/10; w3 \(<\) -1-w1-w2 #set-up of decision-making weights  
p1 \(<\) - norm11\"w1+norm12\"w2+norm13\"w3 #value of the first product variant  
p2 \(<\) - norm21\"w1+norm22\"w2+norm23\"w3 #value of the second product variant  
p3 \(<\) - norm31\"w1+norm32\"w2+norm33\"w3 #value of the third product variant  
if ((p1 \(>\) p2) & (p1 \(>\) p3)) {#recording a weight set  
vector \(<\)- data.frame(weight1 = c(w1), weight2 = c(w2), weight3 = c(w3))  
data \(<\)- rbind(data, vector)  
} } #end of the inner cycle  
} #end of the outer cycle  
data \(<\)- data[c(-1), ]  
product_designs \(<\)- data.frame(ch1 = numeric(1), ch2 = numeric(1), ch3 = numeric(1), c = numeric(1))  
for (i in seq(85,99,1)) {  
for (j in seq(80,90,2)) {  
for (k in seq(64,74,2)) {  
#start of normalization of the table extended with the searched product variant  
norm11 \(<\) - 100/(100 + 70 + 60 + i); norm21 \(<\) -70/(100 + 70 + 60 + i)  
norm31 \(<\) - 60/(100 + 70 + 60 + i); norm41 \(<\) - i/(100 + 70 + 60 + i)  
norm12 \(<\) -80/(80 + 90 + 95 + j); norm22 \(<\) - 90/(80 + 90 + 95 + j)  
norm32 \(<\) -95/(80 + 90 + 95 + j); norm42 \(<\) j/(80 + 95 + j)  
norm13 \(<\) (1/70)/((1/70) + (1/66) + (1/65.5) + (1/k) )  
norm23 \(<\) (1/66)/((1/70) + (1/66) + (1/65.5) + (1/k))  
norm33 \(<\) (1/65.5)/((1/70) + (1/66) + (1/65.5) + (1/k))  
norm43 \(<\) (1/k)/((1/70) + (1/66) + (1/65.5) + (1/k))  
#end of normalization of the table extended with the searched product variant  
count\(<\)-0  
for (m in 1:nrow(data)) {#evaluation of the existing and new product variants  
#with weight sets of interest  
p_mine \(<\)-data[m,\"weight1\"norm41 + data[m,\"weight2\"]\"norm42 + data[m,\"weight3\"]\"norm43  
p1 \(<\)- data[m,\"weight1\"norm11 + data[m,\"weight2\"]\"norm12 + data[m,\"weight3\"]\"norm13  
p2 \(<\)- data[m,\"weight1\"norm21 + data[m,\"weight2\"]\"norm22 + data[m,\"weight3\"]\"norm23p3 <- data[m,\"weight1\"]norm31 + data[m,\"weight2\"]*norm32 + data[m,\"weight3\"]*norm33 if ((p_mine > p1) & (p_mine > p2) & (p_mine > p3)) {count <- count + 1} #finding the number of weights for which a new # variant is better than all the existing variants vector<-data.frame(ch1 = c(i),ch2 = c(j),ch3 = c(k),c = count); product_designs<-rbind(product_designs, vector) #recording the number of weights #for which a new variant is best ] #end of the innermost cycle ] #end of the outer cycle #end of the outermost cycle maxx <- max(product_designs$c) #finding the most promising variants that cover the #largest part of the weight space (largest number of weights) product_designs[product_designs$c == maxx, ] #printout of the resulting variants