-1

我正在解决 Python 中的一个最小化问题,该问题以使整个网络/图形中的数据包丢失最小的方式在图的边缘上分配数据包容量。数据包在节点上按照泊松分布生成。问题是 scipy.optimize.minimize() 不能只接受整数作为目标函数loss_obj(x)的输入。它对满足约束的所有浮点值进行操作。方法find_loss()查找边e的损失,假设k作为其容量。我只粘贴下面的优化函数,因为原始代码超过 300 行。

#here we find loss of an edge e of the graph 
def find_loss(e,lmd,q,k): 
    edge_pmf=find_final_dist(e,lmd,q) 
    l_e=sum(edge_pmf[k+1:])
    return l_e       

net_cap=12 #this is the net capacity to be allocated over the edges

#The minimization function 
x0=[1]*a  
for i in range(a):
    x0[i]=net_cap/a

#x=[c1,c2,c3,...]
def loss_obj(x):
    s=0 
    for i in range(len(x)):
       l=find_loss(edge_enum[i],lamd,q,m.floor(x[i]))  
       s+=l 
    return s 
print('Initial guess ',x0)    
def constraint(x):
    b=sum(x[0:]) 
    return b-net_cap 

con={'type':'eq','fun':constraint}   
b=(0,net_cap)
bounds=[]
for i in range(a):
    bounds.append(b)    
cap_op=minimize(loss_obj,x0,method='SLSQP',constraints=con,bounds=bounds)
print('\n',cap_op.x)

这是显示的输出:

Initial guess  [0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5]

 [0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5 0.5
 0.5 0.5 0.5 0.5 0.5 0.5]

虽然我在这里展示了一个只有 24 个元素的向量来演示这个问题,但我的网络有 104 个边,因此无法用 scipy.optimize.brute() 或 itertools.combinations() 解决,因为系统无法处理太大的数组并给出一个内存错误。线性规划问题不是我的目标,所以 PuLP 不是一个好的解决方案。有人可以找出一种方法来最小化整数输入函数吗?

4

1 回答 1

0

既然损失函数很明确,那么使用贝叶斯优化(BO)怎么样?它根据贝叶斯规则建议的先前猜测进行“智能猜测”。以下是 BO 在 Python 中的一种流行实现,它的文档很清楚。

https://github.com/fmfn/BayesianOptimization

于 2020-03-22T15:44:34.010 回答