首页 > 解决方案 > 使用 Pulp 解决线性规划 python

问题描述

嗨,这是我的代码,我需要帮助。这是另一个代码的简单版本,真正的我在起点使用 50,在目的地使用 70.. 有两件事我不知道该怎么做:

我不知道该怎么做的第一件事:我想限制优化中使用的 orign 数量,在这种情况下,我只想使用 3 个“原点”,但必须使用所有目标

其次,我想打印在solve()之后我使用的每个组合旁边的距离,我使用ind rnd.randint 创建的距离

tks 引起注意 =)

from pulp import *
import pandas as pd 
from random import randint
import numpy as np

rnd = np.random
rnd.seed(1)
seed = 1 
origin = ["1","2","3","4","5"]

destination = ["a","b","c","d","e","f","g"]

demand = {"a":1,"b":1,"c":1,"d":1,"e":1,"f":1,"g":1}

distance = {"1":{"a":rnd.randint(1,50),"b":rnd.randint(1,50),"c":rnd.randint(1,50),"d":rnd.randint(1,50),"e":rnd.randint(1,50),"f":rnd.randint(1,50),"g":rnd.randint(1,50)},
"2":{"a":rnd.randint(1,50),"b":rnd.randint(1,50),"c":rnd.randint(1,50),"d":rnd.randint(1,50),"e":rnd.randint(1,50),"f":rnd.randint(1,50),"g":rnd.randint(1,50)},
"3":{"a":rnd.randint(1,50),"b":rnd.randint(1,50),"c":rnd.randint(1,50),"d":rnd.randint(1,50),"e":rnd.randint(1,50),"f":rnd.randint(1,50),"g":rnd.randint(1,50)},
"4":{"a":rnd.randint(1,50),"b":rnd.randint(1,50),"c":rnd.randint(1,50),"d":rnd.randint(1,50),"e":rnd.randint(1,50),"f":rnd.randint(1,50),"g":rnd.randint(1,50)},
"5":{"a":rnd.randint(1,50),"b":rnd.randint(1,50),"c":rnd.randint(1,50),"d":rnd.randint(1,50),"e":rnd.randint(1,50),"f":rnd.randint(1,50),"g":rnd.randint(1,50)}

}

prob = LpProblem("Exercise", LpMinimize)



Routes = [(i, j) for i in origin for j in destination if j in distance[i]]

qual = LpVariable.dicts("Qual Centroide é atendedido por qual Postp",Routes,0)

prob += lpSum(qual[(i,j)]*distance[i][j] for (i,j) in Routes)


for j in destination:
     
    prob += lpSum(qual[(i,j)] for i in origin if (i,j) in Routes) == demand[j]




prob.solve()
print("Status: ", LpStatus[prob.status])
list1 = []
count = 0
for v in prob.variables():
    if v.varValue > 0:
        count += 1
        list1.append(v.name)
        print(v.name, "=", v.varValue)
new_list = []

for elemento in list1:
        new_list.append((re.findall('\d+', elemento)))

#print(new_list)

flattened = [item for sublist in new_list for item in sublist]
#print(flattened)

flattened = list(dict.fromkeys(flattened))
#print(flattened) 
print("\nNumber of origin used = ",len(flattened)-1)

print("Number of destination used (i need to use them all) = ", count)

标签: pythonnumpypulp

解决方案


推荐阅读