该文件是TPOT库的一部分。
当前版本的TPOT是由以下人员在Cedars-Sinai开发的:
- Pedro Henrique Ribeiro (https://github.com/perib, https://www.linkedin.com/in/pedro-ribeiro/)
- Anil Saini (anil.saini@cshs.org)
- Jose Hernandez (jgh9094@gmail.com)
- Jay Moran (jay.moran@cshs.org)
- Nicholas Matsumoto (nicholas.matsumoto@cshs.org)
- Hyunjun Choi (hyunjun.choi@cshs.org)
- Miguel E. Hernandez (miguel.e.hernandez@cshs.org)
- Jason Moore (moorejh28@gmail.com)
TPOT的原始版本主要由宾夕法尼亚大学的以下人员开发:
- Randal S. Olson (rso@randalolson.com)
- Weixuan Fu (weixuanf@upenn.edu)
- Daniel Angell (dpa34@drexel.edu)
- Jason Moore (moorejh28@gmail.com)
- 以及许多慷慨的开源贡献者
TPOT 是免费软件:您可以根据自由软件基金会发布的 GNU 宽通用公共许可证的条款重新分发和/或修改它,许可证的版本可以是第 3 版,或者(根据您的选择)任何以后的版本。
TPOT 的发布是希望它能有用,
但没有任何保证;甚至没有对
适销性或特定用途适用性的暗示保证。更多详情请参阅
GNU 较宽松通用公共许可证。
您应该已经收到了一份GNU较宽松通用公共许可证的副本,随TPOT一起提供。如果没有,请参见http://www.gnu.org/licenses/。
tournament_selection_dominated(scores, k, n_parents=2, rng=None)
从随机选择的2个个体中选择最佳个体,重复k次。首先通过检查一个个体是否支配另一个个体来进行选择。否则,选择具有最大拥挤距离的个体。
返回的列表包含所选个体的索引。
参数:
| 名称 |
类型 |
描述 |
默认值 |
scores |
ndarray
|
|
required
|
k |
int
|
|
required
|
n_parents |
int
|
|
2
|
rng |
(int, Generator)
|
|
None
|
返回:
| 类型 |
描述 |
一个形状为 (k, n_parents) 的选定个体索引数组。
|
|
Source code in tpot2/selectors/tournament_selection_dominated.py
| def tournament_selection_dominated(scores, k, n_parents=2, rng=None):
"""
Select the best individual among 2 randomly chosen
individuals, *k* times. Selection is first attempted by checking if one individual dominates the other. Otherwise one with the highest crowding distance is selected.
The returned list contains the indices of the chosen *individuals*.
Parameters
----------
scores : np.ndarray
The score matrix, where rows the individuals and the columns are the corresponds to scores on different objectives.
k : int
The number of individuals to select.
n_parents : int, optional
The number of parents to select per individual. The default is 2.
rng : int, np.random.Generator, optional
The random number generator. The default is None.
Returns
-------
A array of indices of selected individuals of shape (k, n_parents).
"""
rng = np.random.default_rng(rng)
pareto_fronts = nondominated_sorting(scores)
# chosen = list(itertools.chain.from_iterable(fronts))
# if len(chosen) >= k:
# return chosen[0:k]
crowding_dict = {}
chosen = []
current_front_number = 0
while current_front_number < len(pareto_fronts):
current_front = np.array(list(pareto_fronts[current_front_number]))
front_scores = [scores[i] for i in current_front]
crowding_distances = crowding_distance(front_scores)
for i, crowding in zip(current_front,crowding_distances):
crowding_dict[i] = crowding
current_front_number += 1
chosen = []
for i in range(k*n_parents):
asp1 = rng.choice(len(scores))
asp2 = rng.choice(len(scores))
if dominates(scores[asp1], scores[asp2]):
chosen.append(asp1)
elif dominates(scores[asp2], scores[asp1]):
chosen.append(asp2)
elif crowding_dict[asp1] > crowding_dict[asp2]:
chosen.append(asp1)
elif crowding_dict[asp1] < crowding_dict[asp2]:
chosen.append(asp2)
else:
chosen.append(rng.choice([asp1,asp2]))
return np.reshape(chosen, (k, n_parents))
|