我正在尝试执行解决python中的优化问题的方法。至此,我已经对Scipy熟悉了,但是我无法在具有唯一整数值的约束下正确使用它。
下面的示例可能更适合mlrose标签。
总的来说,我正在尝试创建一个瑞士配对,我看过几篇文章,其中一篇建议使用“惩罚矩阵”,以尽量减少惩罚。这是我所做的:
import mlrose
import numpy as np
# Create Penalty Matrix
x = np.round(np.random.rand(8,8)*50)
z = np.eye(8, dtype=int)*100 + x
print(z)
# fitness problem given a penalty matrix and an order
def pairing_fittness(order, panalty):
print(order)
order = np.array(order)
a = np.bincount(order)
order = order.reshape(-1, 2)
PF = 0
for pair in order:
print("{}, {}: {}".format(pair[0],pair[1], panalty[pair[0],pair[1]]))
PF = PF + panalty[pair[0],pair[1]]
print("Real PF: ",PF)
print("order penalty: {}".format((np.max(a) - 1) * 1000))
return (PF + (np.max(a) - 1) * 1000)
尝试解决的问题之一是创建一个具有唯一值的数组(同一玩家不能在同一回合中玩两次),这就是为什么重复值较高(1000)的原因
kwargs = {'panalty': z}
fitness_cust_problem_fun = mlrose.CustomFitness(pairing_fittness, **kwargs)
problem = mlrose.DiscreteOpt(length = 8,
fitness_fn = fitness_cust_problem_fun,
maximize = False,
max_val = 8,
)
best_state, best_fitness = mlrose.simulated_annealing(
problem,
max_attempts = 300,
max_iters = 100000,
random_state = 1)
print(best_state)
print(best_fitness)
无论我做什么,使用6个以上的变量都无法找到用于优化它的唯一值数组。虽然我可以在Excel中做到(Solver> Evolutionary)。
我正在寻找一个更好的工具(我使用scipy.optimize,但我不确定它是否适用于整数问题,因为我用mlrose获得了更好的结果)或关于如何改善我的优化问题的建议,可解决的。