import { NestFiler } from "../Common/Filer";
import { Container } from "./Container";
import { Part } from "./Part";
import { Path } from "./Path";
import { PlaceType } from "./PlaceType";
/**
 * 个体(表示某一次优化的结果,或者还没开始优化的状态)
 * 个体是由一堆零件组成的，零件可以有不同的状态。
 *
 * 个体单独变异
 *  可以是某个零件的旋转状态发生改变
 *  可以是零件的顺序发生改变
 *
 * 个体交配(感觉暂时不需要)
 *  个体和其他个体进行基因交换
 */
export declare class Individual {
    Parts?: Part[];
    mutationRate: number;
    private bin?;
    private OddmentsBins;
    private ComparePointKeys;
    constructor(Parts?: Part[], mutationRate?: number, bin?: Path, OddmentsBins?: Path[], ComparePointKeys?: string[]);
    Fitness: number;
    Containers: Container[];
    HoleContainers: Container[];
    OddmentsContainers: Container[];
    /**
     * 评估健康程度
     *
     * @param bestCount 已知最佳大板个数
     * @param greedy    贪心模式
     * @param useContainerTemplate 使用容器模板
     * @param type      放置类型(凸包 面积 重力)
     */
    Evaluate(bestCount: number, greedy?: boolean, useContainerTemplate?: boolean, type?: PlaceType): void;
    /**
     * 在网洞利用时,保持纹路正确
     *
     * @param bestCount     已知最优容器个数
     * @param greedy        贪心模式
     * @param reuseBestMode 复用优秀容器模式
     * @param placeType     放置类型
     */
    private EvaluateOfUseRotateHole;
    /**
     * 复用优秀的容器 使用余料
     * @param {Part[]} parts 剩余的零件(要放置的零件)
     * @param {IContourIdToParts} cIdToPartsObj 轮廓 ID 到零件数组的映射
     * @param {Path[]} oddmentsBins 余料列表
     * @param {PlaceType} placeType 放置类型
     * @return {*}  {Part[]} 复用后剩余的零件
     */
    private ReuseBestToOddments;
    /**
     * 复用优秀的容器 使用(大板/网洞)
     * @param {Part[]} parts 要放置的零件
     * @param {IContourIdToParts} cIdToPartsObj 轮廓 ID 到零件数组的映射
     * @param {Container[]} containersToPut 待放置的容器数组 (默认=undefined时,使用大板Bin容器)
     * @return {*}  {Part[]} 剩余的零件
     */
    private ReuseBest;
    /**
     * 复用容器 尝试放置零件
     * @param {Part[]} parts 要放置的零件
     * @param {Container} bestContainer 最优的容器模板
     * @param {IContourIdToParts} cIdToPartsObj 轮廓 ID 到零件数组的映射
     * @param {Container} [containerToPut] 待放置的容器(未指定容器时,使用默认Bin,并重复,否则只算一次就退出(例如网洞 余料)
     * @return {*}  {{
     *         parts: Part[], 剩余的零件
     *         isArrangeSuccess: boolean; 是否放置成功
     * }}
     */
    private ReuseContainerPutParts;
    /**
     * 计算健康度
     */
    protected EvalFitness(): void;
    private AppendHoles;
    private InitHoleContainers;
    Clone(): Individual;
    /**
    * Point Mutate 点基因突变
    * 突变
    * 在变异率较高的情况下,会尝试相邻位置交换
    * 在变异率较低的情况下,会只调换一次牌,并进行状态突变
    */
    Mutate(): this;
    private MutateParts;
    /**
     * 大基因突变
     * 大洗牌+每个零件状态突变
     */
    BigMutate(): void;
    ReadFile(file: NestFiler): void;
    WriteFile(f: NestFiler): void;
}
//# sourceMappingURL=Individual.d.ts.map