说,我已经对我的数据集进行了聚类,并且有10个聚类。这些集群不重叠。但现在假设我在所有数据点中更改了某些功能并再次进行群集。现在我还有10个集群。 如果我重复说再说3次,最后我会有50个星团。 每个群集都有一个与其相关的分数,该分数是根据其成分数据点计算的。
这50个群集现在具有重叠的数据点。我想从这50个集群中选择所有可能的非重叠集群,但总得分最高。
一种方法是贪婪的方法,我根据从最高到最小的分数对聚类进行排序。然后选择最高得分的群集。然后从那里继续选择具有已经选择的聚类的非重叠数据点的聚类。但它似乎并不是最佳解决方案,尽管速度很快。
示例:说我有5个具有以下分数的群集:
C1 =(A,B,C,D,E,F)得分= 10
C2 =(A,B,C)分数= 6
C3 =(D,E,F)得分= 6
C4 =(G,H,I,J)得分= 5
C5 =(K,L)得分= 7
贪婪的方法将返回{C1,C4,C5},总分为10 + 5 + 7 = 22,而更好的选择是{C2,C3,C4,C5},总分为6 + 6 + 5 + 7 = 24。
我正在寻找另一种能够提供最佳解决方案或更好解决方案的方法,而不是上面提到的贪婪方法。
答案 0 :(得分:1)
您可以使用操作研究技术解决此问题。
使用
模拟此问题,就像设置分区问题一样Objective function: maximize score
Constraints: each data point is covered exactly once
然后使用MIP求解器或任何其他技术(例如Hill登山者,遗传算法等)解决它。问题的规模非常小,因此可以通过任何优化算法解决。我也在研究类似的问题,但在航空公司机组调度领域。我的问题规模如此之大,以至于可能的船员时刻表(相当于你的星团)对于大约4500个航班(相当于你的数据点)的航班时刻表而言是万亿组合;)
我已经在python中编写了你的例子,我使用了Gurobi的MIP求解器,免费提供学术用途。您也可以使用其他MIP求解器。
这是python代码:
from gurobipy import *
import string
data_points = string.ascii_uppercase[:12]
clusters = []
clusters.append(string.ascii_uppercase[:6])
clusters.append(string.ascii_uppercase[:3])
clusters.append(string.ascii_uppercase[3:6])
clusters.append(string.ascii_uppercase[6:10])
clusters.append(string.ascii_uppercase[10:12])
matrix = {}
for dp in string.ascii_uppercase[:12]:
matrix[dp] = [0]*5
for i in range(0, len(clusters)):
for dp in clusters[i]:
matrix[dp][i] = 1
cost = [10, 6, 6, 5, 7]
# Gurobi MIP model
m = Model("Jitin's cluster optimization problem")
m.params.outputflag = 1
x = m.addVars(len(clusters), vtype=GRB.INTEGER, name='x')
indices = range(0, len(clusters))
coef_x = dict()
obj = 0.0
for i in indices:
coef_x[i] = cost[i]
obj += coef_x[i] * x[i]
m.setObjective(obj, GRB.MAXIMIZE)
flight_in_pairings = [[] for i in range(0, 4228)]
for dp,j in zip(data_points, range(0, len(data_points))):
m.addConstr(sum([x[i]*matrix[dp][i] for i in range(0, len(matrix[dp]))]) == 1, "C"+str(j))
m.optimize()
print('Final Obj:', m.objVal)
m.write('results.sol')
代码的输出:
# Solution for model Jitin's cluster optimization problem
# Objective value = 24
x[0] 0
x[1] 1
x[2] 1
x[3] 1
x[4] 1