chai/optimizers/
mod.rs

1//! 优化方法接口,以及若干优化方法的实现
2//!
3
4use crate::{
5    data::{元素, 元素映射, 数据},
6    encoders::编码器,
7    objectives::目标函数,
8    界面,
9};
10pub mod genetic;
11pub mod simulated_annealing;
12
13#[derive(Debug)]
14pub struct 计时器 {
15    pub encode_reset: u128,
16    pub encode_init: u128,
17    pub encode_assembly: u128,
18    pub encode_short: u128,
19    pub encode_duplicate: u128,
20    pub objective_accumulate: u128,
21    pub objective_accept: u128,
22}
23
24pub static mut 全局计时器: 计时器 = 计时器 {
25    encode_reset: 0,
26    encode_init: 0,
27    encode_assembly: 0,
28    encode_short: 0,
29    encode_duplicate: 0,
30    objective_accumulate: 0,
31    objective_accept: 0,
32};
33
34pub struct 优化结果<O: 目标函数> {
35    pub 映射: 元素映射,
36    pub 指标: O::目标值,
37    pub 分数: f64,
38}
39
40pub struct 优化问题<E: 编码器, O: 目标函数, F> {
41    pub 数据: 数据,
42    pub 目标函数: O,
43    pub 编码器: E,
44    pub 操作: F,
45}
46
47impl<E: 编码器, O: 目标函数, F> 优化问题<E, O, F> {
48    pub fn 新建(数据: 数据, 编码器: E, 目标函数: O, 操作: F) -> Self {
49        Self {
50            数据,
51            目标函数,
52            编码器,
53            操作,
54        }
55    }
56
57    pub fn 计算(
58        &mut self, 映射: &元素映射, 变化: &Option<Vec<元素>>
59    ) -> (O::目标值, f64) {
60        let 编码结果 = self.编码器.编码(映射, 变化);
61        self.目标函数.计算(编码结果, 映射)
62    }
63}
64
65pub trait 优化方法<F> {
66    fn 优化<E: 编码器, O: 目标函数>(
67        &self,
68        问题: &mut 优化问题<E, O, F>,
69        界面: &dyn 界面,
70    ) -> 优化结果<O>;
71}