Я запрограммировал задачу потока множества товаров с помощью решателя MIP и CPLEX, но для любого примера, который я привожу, это приводит к 0 как к оптимальному значению. Я считаю, что проблема заключается либо в целевой функции, либо в определении вспомогательной переменной Z, которая предназначена для преобразования продолжающейся переменной x * двоичной переменной y.
import pulp
class MultyCommodityFlow:
def __init__(self, I,J,K,c,f,r,d,s,M,w1,w2,w3,w4):
# Sets
self.I = I # Set of source nodes
self.J = J # Set of destination nodes
self.K = K # Set of commodities
# Parameters
self.c = c # Cost of transporting one unit of commodity k from source i to destination j
self.f = f # Fixed cost for using the route from source i to destination j for commodity k
self.r = r # Revenue generated from transporting one unit of commodity k from source i to destination j
self.d = d # Demand for commodity k at destination j
self.s = s # Supply of commodity k at source i
self.M = M
#initialize the problem
self.problem = pulp.LpProblem("MultyCommodityFlow", pulp.LpMinimize)
#decition variables
self.x = pulp.LpVariable.dicts("x", [(i,j,k) for i in self.I for j in self.J for k in self.K], lowBound=0, cat = pulp.LpContinuous)
self.y = pulp.LpVariable.dicts("y", [(i,j,k) for i in self.I for j in self.J for k in self.K], cat = pulp.LpBinary)
self.v = pulp.LpVariable.dicts("v", [(j,k) for j in self.J for k in self.K], lowBound=0, cat = pulp.LpContinuous)
self.z = pulp.LpVariable.dicts("z", [(i, j, k) for i in self.I for j in self.J for k in self.K], lowBound=0, cat=pulp.LpContinuous)
def build_model(self):
#objective func
self.problem +=pulp.lpSum(self.c[i, j, k] * self.x[i, j, k] for i in self.I for j
in self.J for k in self.K - pulp.lpSum(self.f[i, j, k] * self.y[i, j, k] for i in self.I for j in self.J for k in self.K)
#contraints
#1. Flow conservation at source nodes
for i in self.I:
for k in self.K:
self.problem += pulp.lpSum(self.x[i,j,k] for j in self.J)
Подробнее здесь: https://stackoverflow.com/questions/784 ... imal-value