我正在遵循遗传算法的方法来解决背包问题here。我知道他们使用直接值编码方案而不是二进制表示。交叉功能如下:
def cxSet(ind1, ind2):
"""Apply a crossover operation on input sets. The first child is the
intersection of the two sets, the second child is the difference of the
two sets.
"""
temp = set(ind1) # Used in order to keep type
ind1 &= ind2 # Intersection (inplace)
ind2 ^= temp # Symmetric Difference (inplace)
return ind1, ind2
如果我将Knapsack问题的染色体编码为二进制表示,则inersection将是AND操作。设定差异的分析操作是什么?
另外,我只是想知道这种类型的交叉背后的原理是什么,以及这种类型的交叉优于其他常用的交叉技术,如单点交叉或两点交叉。
答案 0 :(得分:1)
解决此类问题的最简单方法是举一个小例子:
.flatMap(new Func1<News, Observable<News>>() {
@Override
public Observable<News> call(News news) {
return apiService.getAuthor(news.getId())
.doOnNext(new Action1<Author>() {
@Override
public void call(Author author) {
if (!author.getName().equals("null")) {
news.setAuthorName(author.getName());
} else {
news.setAuthorName("Unknown");
}
}
})
.observeOn(Schedulers.io())
.map(new Func1<Author, News>() {
@Override
public News call(Author author) {
return news;
}
})
.subscribeOn(Schedulers.newThread());
}
})
看看这个,我们提出了以下按位运算符:
intersect:s1 AND s2(通常为s1 = {1, 2, 3, 4} => 11110000
s2 = {3, 4, 5, 6} => 00111100
s1 intersect s2 = {3, 4} => 00110000
s1 difference s2 = {1, 2, 5, 6} => 11001100
)
差异:s1 XOR s2(通常是&
)