我正在学习优化,我是OpenOpt的新手。
我想表示每个都有3个资源使用指标(CPU,内存和网络)的进程,我想根据以下限制将N个进程分配给组/ bin:
sum(cpu) within a group < 100
sum(mem) within a group < 100
sum(net) within a group < 100
Minimize(number of groups) or maximize the sum of each resource within a group.
理想情况下,我希望有这种类型的输出:
VM 1 assigned to group 1
VM 2 assigned to group 1
VM 3 assigned to group 1
VM 4 assigned to group 2
VM 5 assigned to group 2
VM 6 assigned to group 3
... and so on
问:我怎么能这样做?如果无法使用OpenOpt执行此操作,是否还有其他可以帮助我解决此问题的库?
这是我的初始代码: https://github.com/vonpupp/mdbp/blob/master/ksp_2.py
非常感谢!
答案 0 :(得分:0)
这个想法是为每个项目分配权重(在这种情况下,所有项目都相同),并最大化受约束限制的项目数量。
这是项目的创建方式:
def gen_vms():
tg = tracegen.TraceGenerator()
trace = tg.gen_trace()
items = [{
'name': 'item %d' % i,
'weight': 1,
'cpu': t[0],
'mem': t[1],
'disk': t[2],
'net': t[3],
'n': 1
} for i,t in islice(enumerate(trace), 200)]
return items
这就是约束的创建方式:
def add_constraint(values, constraint):
return values[constraint] < 99
def add_constraints(values, constraint_list):
return [add_constraint(values, constraint) for constraint in constraint_list]
def gen_costraints(constraint_list):
global constraints
constraints = lambda values: (add_constraints(values, constraint_list))
解决过程是这样的:
def solve_host():
global items
global constraints
p = KSP('weight', list(items), constraints = constraints)
result = p.solve('glpk', iprint = -1)
有关如何执行此操作的详细信息,请访问:https://github.com/vonpupp/2013-sbrc-experiments/blob/e2e8a2be320c8f77d67a5bc6bb822510564e80f3/myksp_oo.py