Probability backdoors search example for SGEN150
An example of probabilistic backdoors searching to solve a difficult variant of the Boolean satisfiability problem, using the example of unsatisfiable SGEN150 encoding.
1from os import cpu_count
2from typing import List
3
4# algorithm module imports
5from algorithm.impl import Elitism
6from algorithm.module.mutation import Doer
7from algorithm.module.crossover import TwoPoint
8from algorithm.module.selection import Roulette
9
10# function module imports
11from function.impl import RhoFunction
12from function.module.measure import Propagations
13
14# satprob lib imports
15from lib_satprob.encoding import CNF
16from lib_satprob.variables import Range
17from lib_satprob.solver import PySatSolver
18from lib_satprob.problem import SatProblem
19
20# space module imports
21from space.impl import BackdoorSet
22
23# core module imports
24from core.impl import Optimize
25from core.model.point import Point
26from core.module.sampling import Const
27from core.module.limitation import WallTime
28from core.module.comparator import MinValueMaxSize
29
30# other imports
31from util.work_path import WorkPath
32from output.impl import OptimizeLogger
33from executor.impl import ProcessExecutor
34
35
36def run_sgen_150_search() -> List[Point]:
37 algorithm = Elitism(
38 elites_count=2,
39 population_size=6,
40 mutation=Doer(),
41 crossover=TwoPoint(),
42 selection=Roulette(),
43 min_update_size=6
44 )
45 limitation = WallTime(
46 from_string='04:00:00'
47 )
48
49 function = RhoFunction(
50 penalty_power=2 ** 10,
51 measure=Propagations(),
52 )
53 sampling = Const(
54 size=1024, split_into=256
55 )
56
57 root_path = WorkPath('examples')
58 data_path = root_path.to_path('data')
59 cnf_file = data_path.to_file('sgen_150.cnf')
60
61 problem = SatProblem(
62 encoding=CNF(from_file=cnf_file),
63 solver=PySatSolver(sat_name='g3'),
64 ) # read from file './examples/data/sgen_150.cnf
65
66 space = BackdoorSet(
67 by_vector=[],
68 variables=Range(length=150)
69 ) # for search space of 150 “off” vars
70
71 workers = min(cpu_count(), 16)
72 executor = ProcessExecutor(
73 max_workers=workers
74 )
75 print(f'Running on {workers} threads')
76
77 # log process to dir './examples/logs/<date_date>
78 logs_path = root_path.to_path('logs', 'sgen150')
79 return Optimize(
80 space=space,
81 problem=problem,
82 executor=executor,
83 sampling=sampling,
84 function=function,
85 algorithm=algorithm,
86 limitation=limitation,
87 comparator=MinValueMaxSize(),
88 logger=OptimizeLogger(logs_path),
89 ).launch()
90
91
92__all__ = [
93 'run_sgen_150_search'
94]
Other examples: