二元变量和约束的 Pymoo 优化问题
Pymoo Optimization problem for binary variables and constraints
我对这个不错的优化包 pymoo 很陌生。看完文档后,我仍然无法针对我的具体问题实施这个包。以下是 objective 函数和约束:
Objective:
1) min(f1); 2) min(f2)
约束条件
1)x =0 or 1; 2) sum(x)=9
这是我当前的代码:
class MyProblem(Problem):
def __init__(self):
super().__init__(n_var=13,
n_obj=2,
n_constr=1,
xl=0,
xu=1)
def first_objective_function(self, x):
y = ''my main function''
return y
def second_objective_function(self, x):
y = ''my second main function''
return y
def _evaluate(self, X, out, *args, **kwargs):
f1 = self.first_objective_function(X)
f2 = self.second_objective_function(X)
g = ???????
out["F"] = np.column_stack([f1, f2])
out["G"] = np.column_stack([g])
my_problem = MyProblem()
algorithm = NSGA2(
pop_size=40,
n_offsprings=10,
sampling=get_sampling("bin_random"),
crossover=get_crossover("bin_hux", prob=0.9, eta=15),
mutation=get_mutation("bin_bitflip", eta=20),
eliminate_duplicates=True)
res = minimize(my_problem,
algorithm,
('n_gen', 100),
verbose=False)
我的问题是如何定义我的约束方程。 sum(X)等于一个值,不小于一个值。
第二个问题是,我对这个问题使用了正确的采样、交叉和变异算法吗?希望x中1的个数是固定的
总的来说,尝试解决子集选择问题。这可以通过定制遗传算法来完成。
我已经为 Subset Selection 写了一个例子。
所有演化运算符都会考虑数组中 1 的最大数量。这意味着永远不会违反约束。通常,您还可以定义一个 Repair 运算符,将所有违反阈值的值清零。
但是,代码可能需要针对您的特定问题进行更多自定义,但您可以随意将其用作蓝图。
我对这个不错的优化包 pymoo 很陌生。看完文档后,我仍然无法针对我的具体问题实施这个包。以下是 objective 函数和约束:
Objective:
1) min(f1); 2) min(f2)
约束条件
1)x =0 or 1; 2) sum(x)=9
这是我当前的代码:
class MyProblem(Problem):
def __init__(self):
super().__init__(n_var=13,
n_obj=2,
n_constr=1,
xl=0,
xu=1)
def first_objective_function(self, x):
y = ''my main function''
return y
def second_objective_function(self, x):
y = ''my second main function''
return y
def _evaluate(self, X, out, *args, **kwargs):
f1 = self.first_objective_function(X)
f2 = self.second_objective_function(X)
g = ???????
out["F"] = np.column_stack([f1, f2])
out["G"] = np.column_stack([g])
my_problem = MyProblem()
algorithm = NSGA2(
pop_size=40,
n_offsprings=10,
sampling=get_sampling("bin_random"),
crossover=get_crossover("bin_hux", prob=0.9, eta=15),
mutation=get_mutation("bin_bitflip", eta=20),
eliminate_duplicates=True)
res = minimize(my_problem,
algorithm,
('n_gen', 100),
verbose=False)
我的问题是如何定义我的约束方程。 sum(X)等于一个值,不小于一个值。
第二个问题是,我对这个问题使用了正确的采样、交叉和变异算法吗?希望x中1的个数是固定的
总的来说,尝试解决子集选择问题。这可以通过定制遗传算法来完成。 我已经为 Subset Selection 写了一个例子。 所有演化运算符都会考虑数组中 1 的最大数量。这意味着永远不会违反约束。通常,您还可以定义一个 Repair 运算符,将所有违反阈值的值清零。
但是,代码可能需要针对您的特定问题进行更多自定义,但您可以随意将其用作蓝图。