问题描述
基本上,我正在尝试使每个目的地只有一个起点 所有目的地必须只有一个来源 并不一定必须使用所有来源 我希望有人能帮助我,我知道这不是正确的方法,而是我所得到的
.NET 3.5,4,4.52
解决方法
我认为您已经很接近想要的东西,但是您有一些问题。首先,您将Routes
定义为所有可能的路线,而您只为某些路线定义了cost_to_send
。
假设已定义成本的路线是可行的路线,则最好将Routes
定义为:
Routes = [(i,j) for i in origin for j in destination if j in cost_to_send[i]]
我可以看到的另一个问题是第二组约束:
for i in origin:
prob += lpSum(quantity[i][j] for j in destination) == 1
这就是说,对于每个起点,流向所有目的地的总流量必须为1。但是在问题陈述中,您会说:
所有目的地必须只有一个来源,而不是所有来源 一定要使用
但是由于这种限制,您正在强制使用每个原点。消除此约束即可解决问题:
from pulp import *
import pandas as pd
origin = ["a","b","c","d","e","f","g","h"]
destination = ["1","2","3","4","5","6","7","8","9","10"]
offer = {"a":3,"b":3,"c":3,"d":3,"e":3,"f":4,"g":3,"h":3}
demand = {"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1}
cost_to_send = {
"a":{"1":1,"3":1},"b":{"2":1,"9":1},"c":{"5":1,"7":1},"d":{"7":1,"10":1},"e":{"3":1,"8":1},"f":{"1":1,"g":{"4":1,"h":{"1":1,"8":1}
}
prob = LpProblem("Exercise",LpMinimize)
# Routes = [(i,j) for i in origin for j in destination]
Routes = [(i,j) for i in origin for j in destination if j in cost_to_send[i]]
quantity = LpVariable.dicts("quantity de envio",Routes,0)
prob += lpSum(quantity[(i,j)]*cost_to_send[i][j] for (i,j) in Routes)
for j in destination:
prob += lpSum(quantity[(i,j)] for i in origin if (i,j) in Routes) == demand[j]
#for i in origin:
# prob += lpSum(quantity[i][j] for j in destination) == 1
prob.solve()
print("Status: ",LpStatus[prob.status])
for v in prob.variables():
if v.varValue > 0:
print(v.name,"=",v.varValue)
print("Answer ",value(prob.objective))
Returns:
Status: Optimal
quantity_de_envio_('a',_'1') = 1.0
quantity_de_envio_('a',_'2') = 1.0
quantity_de_envio_('a',_'3') = 1.0
quantity_de_envio_('b',_'9') = 1.0
quantity_de_envio_('c',_'5') = 1.0
quantity_de_envio_('c',_'6') = 1.0
quantity_de_envio_('d',_'10') = 1.0
quantity_de_envio_('f',_'4') = 1.0
quantity_de_envio_('f',_'7') = 1.0
quantity_de_envio_('h',_'8') = 1.0
Answer 10.0
请注意,如果您希望给定目的地的需求大于1,但想强制目的地仅接收来自单个来源的输入-那么您将需要添加 binary 每个“路线”的变量来控制每个路线是否开放。然后,您将设置一个约束,即如果这些二进制变量为true,则数量变量只能为非零,然后可以将这些二进制变量的总和限制为== 1。