在学Optimisation的 时候用到了pulp包,在这里记录总结一下用法。
下面用两个例子来说明
物体移动最小距离问题
假设有n 个箱子和n个物体,箱子固定排列在x轴上,物体则分布在xy平面上,其中箱子和物体的初始位置均为已知。现要将物体放入箱子且使得每个箱子有且仅有一个物体,如何使得物体移动的距离最短?
可以定义
这是典型的整型规划问题,调用pulp包来解决
首先获取数据并得到距离矩阵M
import pulp as plp
import numpy as np
ca = open("PositionCasiers.txt")
ob = open("PositionObjets.txt")
clines = ca.readlines()[1:]
blines = ob.readlines()[1:]
nc = len(clines)
nb = len(blines)
# M est la matrice de distance pour bouger objet j dans la boîte i
M = np.zeros([nc,nb])
Cx = []
Cy = []
Ox = []
Oy = []
for i in range(nc):
linec = clines[i].strip('n')
linec = linec.split('t')
cx = float(linec[0])
cy = float(linec[1])
Cx.append(cx)
Cy.append(cy)
for j in range(nb):
lineb = blines[j].strip('n')
lineb = lineb.split('t')
bx = float(lineb[0])
by = float(lineb[1])
Ox.append(bx)
Oy.append(by)
M[i,j] = np.sqrt((cx-bx)**2 + (cy-by)**2)
现在用c表示M矩阵,最后一行意思是将M写成问题数学描述里的
n = nc
m = nb
set_I = range(1, n+1)
set_J = range(1, m+1)
# c est le paramètre dans la formula
c = {(i,j): M[i-1,j-1] for i in set_I for j in set_J}
定义解