![](/img/trans.png)
[英]Why is numpy inverse square root "x**(-1/2)" so much slower than "1/np.sqrt(x)"
[英]docplex does not support square root np.sqrt(x), please suggest an alternative solution
我已經用 python 實現了 docplex 模型,一切順利:問題公式、變量、約束和目標函數。 當我試圖計算兩個圓心之間的歐幾里得距離時出現的問題,簡單的 numpy 可以做到 np.sqrt((x2-x1)**2 + (y2-y1)**2)。 請建議我如何解決這個問題,如果不使用平方根,我找不到歐幾里得距離的二次方程。
附加的工作代碼,您是否可以在約束 1 處看到問題。
from docplex.mp.model import Model
import numpy as np
def packing_cplex(CDA, R, H, items):
# continuous variables x,y range from -R to +R
x = [ CDA.continuous_var(name="x{}:".format(i), lb=-R, ub=R)
for i in range(len(items))]
y = [ CDA.continuous_var(name="y{}:".format(i), lb=-R, ub=R)
for i in range(len(items))]
# integer variable z range from 0 to H
z = [ CDA.integer_var(name="z{}:".format(i), lb=0, ub=H)
for i in range(len(items))]
# indicator denotes whether an item is packed into the container
# i=1, .., n, values 1/0
d = [ CDA.binary_var(name="d{}:".format(i))
for i in range(len(items))]
# sqrt root issue--> np.sqrt((x[i]**2 + y[i]**2))
# 1.constraint packed items and container radius
CDA.add_quadratic_constraints(R >= (items[i][0] + (x[i]**2 + y[i]**2)**1 )
for i in range(len(items)))
# 2.constraint packed items and container height
for i in range(len(items)):
CDA.add( CDA.if_then( d[i]==1, H >= ( items[i][1] + z[i] ) ) )
# objective maximise max∑_(i=0 .. n-1 (π * ri^2 * hi * di)
CDA.set_objective("max", np.sum([d[i] * np.pi * items[i][0]**2 * items[i][1]
for i in range(len(items))]))
# radius and height of cylinder container
R, H = 3, 2
volume = np.pi * R**2 * H
# pack, [(ri,hi), ... ([rn,hn]) where ri/hi is radius/height of item
items = [(1,2),(1,2),(1,2),(1,2),(1,2),(1,2),(1,2)]
CDA = Model(name='CDA')
packing_cplex(CDA, R, H, items)
CDA.print_information()
solution = CDA.solve()
utilization = solution._objective / volume
print('Utilization (%) ', utilization)
我期待平方根的替代解決方案
如果你有非線性函數,你可以在 cplex 中使用 CPOptimizer。
例如, https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoononlinear.py
或者平方根:
from docplex.cp.model import CpoModel
mdl = CpoModel(name='buses')
nbbus40 = mdl.integer_var(0,1000,name='nbBus40')
nbbus30 = mdl.integer_var(0,1000,name='nbBus30')
mdl.add(nbbus40*40 + nbbus30*30 >= 300)
#non linear objective
mdl.minimize(mdl.power(nbbus40,0.5)*500 + mdl.power(nbbus30,0.5)*400)
msol=mdl.solve()
print(msol[nbbus40]," buses 40 seats")
print(msol[nbbus30]," buses 30 seats")
並處理您的十進制變量,請參閱
https://github.com/AlexFleischerParis/zoodocplex/blob/master/zoodecimalcpo.py
from docplex.cp.model import CpoModel
mdl = CpoModel(name='buses')
#now suppose we can book a % of buses not only complete buses
scale=100
scalenbbus40 = mdl.integer_var(0,1000,name='scalenbBus40')
scalenbbus30 = mdl.integer_var(0,1000,name='scalenbBus30')
nbbus40= scalenbbus40 / scale
nbbus30= scalenbbus30 / scale
mdl.add(nbbus40*40 + nbbus30*30 >= 310)
mdl.minimize(nbbus40*500 + nbbus30*400)
msol=mdl.solve()
print(msol[scalenbbus40]/scale," buses 40 seats")
print(msol[scalenbbus30]/scale," buses 30 seats")
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.