Skip to content

Commit ff7deb0

Browse files
committed
v0.2.3 More examples (engineering problems, ML models hyper-parameters tuning)
1 parent 5646027 commit ff7deb0

17 files changed

+8862
-18
lines changed

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,14 @@ maturin develop --release
4444
- maturin will build the Rust part, get all Python dependencies (for solver itself, not examples) and install greyjack to your venv
4545

4646
# RoadMap
47-
- CMA, probably its modern variants, adaptations for tasks with integer and categorical variables (often appears in articles as sota approach)
4847
- Add more examples: Job-Shop, Pickup&Delivery, some continuous and MIP tasks, scheduling, etc
48+
- Types, arguments validation
49+
- Write docs
50+
- Tests, tests, tests...
4951
- Composite termination criterion (for example: solving limit minutes N AND score not improving M seconds)
5052
- Multi-level score
5153
- Custom moves support
5254
- Try to impove incremental (pseudo-incremental) score calculation mechanism (caching, no clonning, etc)
53-
- Write docs
5455
- Website
5556
- Useful text materials, guides, presentations
56-
- Tests, tests, tests...
57-
- Score explainer / interpreter
57+
- Score explainer / interpreter for OOP API

examples/pure_math/engineering/__init__.py

Whitespace-only changes.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from copy import deepcopy
2+
from pathlib import Path
3+
import random
4+
import os
5+
import sys
6+
7+
# To launch normally from console
8+
script_dir_path = Path(os.path.dirname(os.path.realpath(__file__)))
9+
project_dir_id = script_dir_path.parts.index("greyjack-solver-python")
10+
project_dir_path = Path(*script_dir_path.parts[:project_dir_id+1])
11+
sys.path.append(str(project_dir_path))
12+
13+
14+
from copy import deepcopy
15+
16+
from greyjack.SolverPureMath import SolverPureMath
17+
from greyjack.agents import *
18+
from greyjack.agents.termination_strategies import *
19+
from greyjack.agents.base.ParallelizationBackend import ParallelizationBackend
20+
from greyjack.agents.base.LoggingLevel import LoggingLevel
21+
22+
from greyjack.pure_math.MathModel import MathModel
23+
from greyjack.pure_math.Objective import Objective
24+
from greyjack.pure_math.Constraint import Constraint
25+
from greyjack.pure_math.variables.FloatVar import FloatVar
26+
from greyjack.pure_math.variables.IntegerVar import IntegerVar
27+
from greyjack.pure_math.variables.BinaryVar import BinaryVar
28+
29+
"""
30+
https://www.sci-hub.ru/10.1016/j.cie.2021.107250
31+
"""
32+
33+
if __name__ == "__main__":
34+
m = math_model = MathModel()
35+
36+
for i in range( 1, 6 ):
37+
m.variables[f"x{i}"] = FloatVar( 0.01, 100 )
38+
m.objectives["f"] = Objective("minimize", lambda v, u: 0.06224*sum([x_i for x_i in v.values()]))
39+
m.constraints["g"] = Constraint( lambda v, u: 60/v["x1"]**3 + 27/v["x2"]**3 + 19/v["x3"]**3 + 7/v["x4"]**3 + 1/v["x5"]**3 - 1, "<=")
40+
41+
termination_strategy = ScoreNoImprovement(time_seconds_limit=5)
42+
agent = GeneticAlgorithm(population_size=256, crossover_probability=0.8, p_best_rate=0.5,
43+
tabu_entity_rate=0.2, mutation_rate_multiplier=1.0, move_probas=[0.5, 0.5, 0.0, 0.0, 0.0, 0.0],
44+
migration_rate=0.00001, migration_frequency=10, termination_strategy=termination_strategy)
45+
"""agent = LateAcceptance(late_acceptance_size=200, tabu_entity_rate=0.2,
46+
mutation_rate_multiplier=1.0, move_probas=[0.5, 0.5, 0.0, 0.0, 0.0, 0.0],
47+
compare_to_global_frequency=10000, termination_strategy=termination_strategy)"""
48+
49+
solver = SolverPureMath(math_model, agent,
50+
ParallelizationBackend.Multiprocessing, LoggingLevel.FreshOnly,
51+
n_jobs=10, score_precision=[4, 2])
52+
solution = solver.solve()
53+
math_model.explain_solution( solution )
54+
55+
print( solution )
56+
print( "done" )
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
from copy import deepcopy
2+
from pathlib import Path
3+
import random
4+
import os
5+
import sys
6+
7+
# To launch normally from console
8+
script_dir_path = Path(os.path.dirname(os.path.realpath(__file__)))
9+
project_dir_id = script_dir_path.parts.index("greyjack-solver-python")
10+
project_dir_path = Path(*script_dir_path.parts[:project_dir_id+1])
11+
sys.path.append(str(project_dir_path))
12+
13+
from greyjack.SolverPureMath import SolverPureMath
14+
from greyjack.agents import *
15+
from greyjack.agents.termination_strategies import *
16+
from greyjack.agents.base.ParallelizationBackend import ParallelizationBackend
17+
from greyjack.agents.base.LoggingLevel import LoggingLevel
18+
from greyjack.pure_math.MathModel import MathModel
19+
from greyjack.pure_math.Objective import Objective
20+
from greyjack.pure_math.Constraint import Constraint
21+
from greyjack.pure_math.variables.FloatVar import FloatVar
22+
from greyjack.pure_math.variables.IntegerVar import IntegerVar
23+
from greyjack.pure_math.variables.BinaryVar import BinaryVar
24+
25+
from copy import deepcopy
26+
from math import pi
27+
28+
"""
29+
Strange problem. Different papers "lose" some coefficients, have different formulations.
30+
31+
links:
32+
https://www.researchgate.net/publication/352203707_Enhanced_grasshopper_optimization_algorithm_using_elite_opposition-based_learning_for_solving_real-world_engineering_problems
33+
https://www.sci-hub.ru/10.1016/j.cie.2021.107250
34+
"""
35+
36+
if __name__ == "__main__":
37+
m = math_model = MathModel()
38+
39+
m.variables["t"] = FloatVar(1.5, 3)
40+
m.variables["r_o"] = IntegerVar(90, 110)
41+
m.variables["r_i"] = IntegerVar(60, 80)
42+
m.variables["F"] = IntegerVar(600, 1000)
43+
m.variables["Z"] = IntegerVar(2, 9)
44+
45+
m.utility["n"] = 250 #rpm
46+
m.utility["M_f"] = 3 #Nm
47+
m.utility["M_s"] = 40 #Nm
48+
m.utility["I_z"] = 55 #kg/m^2
49+
m.utility["dr"] = 20 #mm
50+
m.utility["t_min"] = 1.5 #mm
51+
m.utility["t_max"] = 3 #mm
52+
m.utility["l_max"] = 30 #mm
53+
m.utility["Z_max"] = 9
54+
m.utility["v_sr_max"] = 10 #m/s
55+
m.utility["nu"] = 0.5
56+
m.utility["delta"] = 0.5
57+
m.utility["p_max"] = 1 #MPa
58+
m.utility["T_max"] = 15 #s
59+
m.utility["F_max"] = 1000 #N
60+
m.utility["r_i_min"] = 60 #mm
61+
m.utility["r_i_max"] = 80 #mm
62+
m.utility["r_o_min"] = 90 #mm
63+
m.utility["r_o_max"] = 110 #mm
64+
m.utility["ro"] = 7.8e-6
65+
m.utility["s"] = 1.5
66+
m.utility["M_h"] = lambda v, u: ((2 / 3) * u["nu"] * v["F"] * v["Z"] * (v["r_o"]**3 - v["r_i"]**3)) / (v["r_o"]**2 - v["r_i"]**2)
67+
m.utility["p_rz"] = lambda v, u: v["F"] / (pi * (v["r_o"]**2 - v["r_i"]**2))
68+
m.utility["v_sr"] = lambda v, u: (2 * pi * ((v["r_o"]**3 - v["r_i"]**3)) / (90 * (v["r_o"]**2 - v["r_i"]**2)))
69+
m.utility["T"] = lambda v, u: (u["I_z"] * pi * u["n"]) / (30 * (u["M_h"](v, u) + u["M_f"]))
70+
71+
m.objectives["f"] = Objective("minimize", lambda v, u: pi*v["t"]*u["ro"]*(v["r_o"]**2 - v["r_i"]**2)*(v["Z"] + 1))
72+
73+
m.constraints["g_1"] = Constraint( lambda v, u: v["r_o"] - v["r_i"] - u["dr"], ">=")
74+
m.constraints["g_2"] = Constraint( lambda v, u: u["l_max"] - (v["Z"]+1)*(v["t"]+u["delta"]), ">=")
75+
m.constraints["g_3"] = Constraint( lambda v, u: u["p_max"] + u["p_rz"](v, u), ">=")
76+
m.constraints["g_4"] = Constraint( lambda v, u: u["p_max"]*u["v_sr_max"] - u["p_rz"](v, u)*u["v_sr"](v, u), ">=")
77+
m.constraints["g_5"] = Constraint( lambda v, u: u["v_sr_max"] - u["v_sr"](v, u), ">=")
78+
m.constraints["g_6"] = Constraint( lambda v, u: u["T_max"] - u["T"](v, u), ">=")
79+
m.constraints["g_7"] = Constraint( lambda v, u: u["M_h"](v, u) - u["s"]*u["M_s"], ">=")
80+
m.constraints["g_8"] = Constraint( lambda v, u: u["T"](v, u), ">=")
81+
82+
termination_strategy = ScoreNoImprovement(time_seconds_limit=5)
83+
agent = GeneticAlgorithm(population_size=256, crossover_probability=0.8, p_best_rate=0.5,
84+
tabu_entity_rate=0.2, mutation_rate_multiplier=1.0, move_probas=[0.5, 0.5, 0.0, 0.0, 0.0, 0.0],
85+
migration_rate=0.00001, migration_frequency=10, termination_strategy=termination_strategy)
86+
87+
solver = SolverPureMath(math_model, agent,
88+
ParallelizationBackend.Multiprocessing, LoggingLevel.FreshOnly,
89+
n_jobs=10, score_precision=[4, 2])
90+
solution = solver.solve()
91+
math_model.explain_solution( solution )
92+
93+
print( solution )
94+
print( "done" )
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from copy import deepcopy
2+
from pathlib import Path
3+
import random
4+
import os
5+
import sys
6+
7+
# To launch normally from console
8+
script_dir_path = Path(os.path.dirname(os.path.realpath(__file__)))
9+
project_dir_id = script_dir_path.parts.index("greyjack-solver-python")
10+
project_dir_path = Path(*script_dir_path.parts[:project_dir_id+1])
11+
sys.path.append(str(project_dir_path))
12+
13+
from greyjack.SolverPureMath import SolverPureMath
14+
from greyjack.agents import *
15+
from greyjack.agents.termination_strategies import *
16+
from greyjack.agents.base.ParallelizationBackend import ParallelizationBackend
17+
from greyjack.agents.base.LoggingLevel import LoggingLevel
18+
19+
from greyjack.pure_math.MathModel import MathModel
20+
from greyjack.pure_math.Objective import Objective
21+
from greyjack.pure_math.Constraint import Constraint
22+
from greyjack.pure_math.variables.FloatVar import FloatVar
23+
from greyjack.pure_math.variables.IntegerVar import IntegerVar
24+
from greyjack.pure_math.variables.BinaryVar import BinaryVar
25+
26+
from copy import deepcopy
27+
from math import pi
28+
29+
"""
30+
https://www.sci-hub.ru/10.1016/j.cie.2021.107250
31+
https://ceur-ws.org/Vol-2255/paper2.pdf
32+
"""
33+
34+
if __name__ == "__main__":
35+
m = math_model = MathModel()
36+
37+
m.variables["x1"] = FloatVar( 0, 99 )
38+
m.variables["x2"] = FloatVar( 0, 99 )
39+
m.variables["x3"] = FloatVar( 10, 200 )
40+
m.variables["x4"] = FloatVar( 10, 200 )
41+
42+
# optimum objective in https://ceur-ws.org/Vol-2255/paper2.pdf is 0.0126652327883
43+
m.objectives["f"] = Objective("minimize",
44+
lambda v, u: 0.6224*v["x1"]*v["x3"]*v["x4"] + 1.7781*v["x2"]*v["x3"]**2 +
45+
3.1661*v["x1"]**2*v["x4"] + 19.84*v["x1"]**2*v["x3"] )
46+
47+
m.constraints["g1"] = Constraint( lambda v, u: -v["x1"] + 0.0193*v["x3"], "<=")
48+
m.constraints["g2"] = Constraint( lambda v, u: -v["x2"] + 0.00954*v["x3"], "<=")
49+
m.constraints["g3"] = Constraint( lambda v, u: -pi*v["x3"]**2*v["x4"] - (4/3)*pi*v["x3"]**3 + 1296000, "<=")
50+
m.constraints["g4"] = Constraint( lambda v, u: v["x4"] - 240, "<=")
51+
52+
termination_strategy = ScoreNoImprovement(time_seconds_limit=5)
53+
"""agent = GeneticAlgorithm(population_size=256, crossover_probability=0.8, p_best_rate=0.5,
54+
tabu_entity_rate=0.2, mutation_rate_multiplier=1.0, move_probas=[0.5, 0.5, 0.0, 0.0, 0.0, 0.0],
55+
migration_rate=0.00001, migration_frequency=10, termination_strategy=termination_strategy)"""
56+
agent = LateAcceptance(late_acceptance_size=200, tabu_entity_rate=0.2,
57+
mutation_rate_multiplier=1.0, move_probas=[0.5, 0.5, 0.0, 0.0, 0.0, 0.0],
58+
compare_to_global_frequency=10000, termination_strategy=termination_strategy)
59+
60+
solver = SolverPureMath(math_model, agent,
61+
ParallelizationBackend.Multiprocessing, LoggingLevel.FreshOnly,
62+
n_jobs=10, score_precision=[4, 2])
63+
solution = solver.solve()
64+
math_model.explain_solution( solution )
65+
66+
print( solution )
67+
print( "done" )
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
from copy import deepcopy
2+
from pathlib import Path
3+
import random
4+
import os
5+
import sys
6+
7+
# To launch normally from console
8+
script_dir_path = Path(os.path.dirname(os.path.realpath(__file__)))
9+
project_dir_id = script_dir_path.parts.index("greyjack-solver-python")
10+
project_dir_path = Path(*script_dir_path.parts[:project_dir_id+1])
11+
sys.path.append(str(project_dir_path))
12+
13+
14+
from copy import deepcopy
15+
16+
from greyjack.SolverPureMath import SolverPureMath
17+
from greyjack.agents import *
18+
from greyjack.agents.termination_strategies import *
19+
from greyjack.agents.base.ParallelizationBackend import ParallelizationBackend
20+
from greyjack.agents.base.LoggingLevel import LoggingLevel
21+
22+
from greyjack.pure_math.MathModel import MathModel
23+
from greyjack.pure_math.Objective import Objective
24+
from greyjack.pure_math.Constraint import Constraint
25+
from greyjack.pure_math.variables.FloatVar import FloatVar
26+
from greyjack.pure_math.variables.IntegerVar import IntegerVar
27+
from greyjack.pure_math.variables.BinaryVar import BinaryVar
28+
29+
"""
30+
https://www.sci-hub.ru/10.1016/j.cie.2021.107250
31+
"""
32+
33+
if __name__ == "__main__":
34+
m = math_model = MathModel()
35+
36+
m.variables["x1"] = FloatVar( 0.05, 2.0 )
37+
m.variables["x2"] = FloatVar( 0.25, 1.3 )
38+
m.variables["x3"] = FloatVar( 2.0, 15.0 )
39+
40+
# optimum objective in https://ceur-ws.org/Vol-2255/paper2.pdf is 0.0126652327883
41+
m.objectives["f"] = Objective("minimize", lambda v, u: (v["x3"] + 2)*v["x2"]*(v["x1"]**2))
42+
43+
m.constraints["g1"] = Constraint( lambda v, u: 1 - v["x2"]**3*v["x3"]/(71785*v["x1"]**4), "<=")
44+
# in the article about Aquila authors lost "-1" in the end of "g2" constraint...
45+
m.constraints["g2"] = Constraint( lambda v, u: (4*v["x2"]**2 - v["x1"]*v["x2"]) / (12566*(v["x2"]*v["x1"]**3 - v["x1"]**4)) + (1/(5108*v["x1"]**2)) - 1, "<=")
46+
m.constraints["g3"] = Constraint( lambda v, u: 1 - (140.45*v["x1"])/(v["x2"]**2*v["x3"]), "<=")
47+
m.constraints["g4"] = Constraint( lambda v, u: (v["x1"] + v["x2"])/1.5 - 1, "<=")
48+
49+
termination_strategy = ScoreNoImprovement(time_seconds_limit=5)
50+
agent = GeneticAlgorithm(population_size=256, crossover_probability=0.8, p_best_rate=0.5,
51+
tabu_entity_rate=0.2, mutation_rate_multiplier=1.0, move_probas=[0.5, 0.5, 0.0, 0.0, 0.0, 0.0],
52+
migration_rate=0.00001, migration_frequency=10, termination_strategy=termination_strategy)
53+
54+
solver = SolverPureMath(math_model, agent,
55+
ParallelizationBackend.Multiprocessing, LoggingLevel.FreshOnly,
56+
n_jobs=10, score_precision=[4, 2])
57+
solution = solver.solve()
58+
59+
m.variables["x1"] = solution.variable_values_dict["x1"]
60+
m.variables["x2"] = solution.variable_values_dict["x2"]
61+
m.variables["x3"] = solution.variable_values_dict["x3"]
62+
print( "Optimal values from GreyJack" )
63+
math_model.explain_solution( solution )
64+
print()
65+
66+
# optimal values from Aquila article
67+
solution.variable_values_dict["x1"] = 0.0502439
68+
solution.variable_values_dict["x2"] = 0.35262
69+
solution.variable_values_dict["x3"] = 10.5425
70+
print( "Optimal values from article about Aquila" )
71+
math_model.explain_solution( solution )
72+
print()
73+
74+
# optimal values from https://ceur-ws.org/Vol-2255/paper2.pdf
75+
solution.variable_values_dict["x1"] = 0.051689156131
76+
solution.variable_values_dict["x2"] = 0.356720026419
77+
solution.variable_values_dict["x3"] = 11.288831695483
78+
print( "Optimal values from https://ceur-ws.org/Vol-2255/paper2.pdf" )
79+
math_model.explain_solution( solution )
80+
81+
print( "done" )

examples/pure_math/hyper_parameters_tuning/__init__.py

Whitespace-only changes.

0 commit comments

Comments
 (0)