提问人:Igor Matsumoto 提问时间:4/6/2023 最后编辑:Igor Matsumoto 更新时间:4/6/2023 访问量:97
Pyomo:具有非负整数属性的变量,给出浮点值
Pyomo: variable with NonNegativeInteger proprieties giving float value
问:
我试图优化从田间采摘并运输到工厂的甘蔗秸秆包。
法典:
import pandas as pd
import pyomo.environ as pyo
import imple_generator as gen
import verificador as ver
from pyomo.environ import *
from pyomo.opt import SolverFactory
from pyomo.common.timing import TicTocTimer
import datetime
# =============================================================================
# Oliveira utilizou para seu teste, 10 veículos para 20 talhões com 100 testes
# o custo de transporte por tonelada é 4.7
# cada TREMINHÃO cabe de 10 a 12 fardos (SPADOTTO)
# Quantidade de fardos por talhão:
# 153,128,152,118,171
# Precisa de custo ( ok) , Quantidade de Fardos por talhão ( off) , Capacidade caminhão ( ok )
# =============================================================================
def implement(g):
# =============================================================================
# Calcular o tempo Computacional
# =============================================================================
timer = TicTocTimer()
timer.tic('starting timer') # starts the elapsed time timer (from 0)
# =============================================================================
# VARIÁVEIS
# =============================================================================
T = [0,1,2,3,4,5,6,7,8,'n+1'] # TALHÕES ( 4 nós, 7 nós, 9 nós)
# =============================================================================
# T = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16] #Talhões em Oliveira
# =============================================================================
V = [1,2,3,4,5,6,7,8,9,10,11] # VEÍCULOS ( 5,9,13,17,21)
# =============================================================================
# POR RIPOLI, UM TALHÃO TEM 42 FARDOS
# =============================================================================
d = gen.talhao_fardos(len(T)) # FARDOS EM TALHÕES
(c,distancia) = gen.matriz_custo_new(len(T)) # MATRIZ DE CUSTO DE NÓ A NÓ
# =============================================================================
# CAMINHÕES MÉDIA MÍNIMO MÁXIMO ANDRADE ET AL(2018)
# ROMEU E JULIETA:25t 215 169 246
# TREMINHÃO ( três carretas ):45t 355 201 517 WINNER
# RODOTREM: 65t 357 228 628
# =============================================================================
w = 164.93 # Peso de 1 fardo em Quilogramas por RIPOLI(2002) | outros autores falam em 500kg - 700kg
C = gen.caminhao(len(V),w) # CAPACIDADE DOS CAMINHÕES
(porcento,lup,soma,soma1,d,C) = ver.perc(d,C,len(T),len(V),w)
qttalhao = len(T) # tamanho da variável de Talhões
qtveiculo = len(V) # tamanho da variável de veículos
# =============================================================================
# DESENHANDO MODELO
# =============================================================================
model = pyo.ConcreteModel()
# =============================================================================
# DECLARANDO VARIÁVEIS DE DECISÃO
# =============================================================================
model.x = pyo.Var(range(qttalhao-1),range(1,qttalhao),range(qtveiculo), bounds=(0,1),within = pyo.Binary) # Binário
model.y = pyo.Var(range(qttalhao),range(qtveiculo), bounds=(0,None),within = pyo.NonNegativeIntegers) # Inteiro não negativo
model.u = pyo.Var(range(qttalhao-1),range(qtveiculo), bounds=(1,qttalhao-2),within = pyo.NonNegativeIntegers) # Inteiro Positivo
x = model.x
y = model.y
u = model.u
# =============================================================================
# NOMEANDO AS RESTRIÇÕES
# =============================================================================
model.talhao = pyo.ConstraintList()
model.dependencia = pyo.ConstraintList()
model.caminhao = pyo.ConstraintList()
model.fluxo = pyo.ConstraintList()
model.goal = pyo.ConstraintList()
model.start = pyo.ConstraintList()
model.subrota = pyo.ConstraintList()
model.noreturn = pyo.ConstraintList()
# =============================================================================
# COLOCANDO AS RESTRIÇÕES
# =============================================================================
for i in range(0,qttalhao-1):
model.talhao.add(expr = sum(y[(i,ve)] for ve in range(0,qtveiculo))==d[0][i])
for k in range(0,qtveiculo):
model.caminhao.add(expr = sum(y[(talh,k)] for talh in range(1,qttalhao-1)) <= C[0][k])
for j in range(1,qttalhao-1):
for k in range(0,qtveiculo):
model.dependencia.add(expr = y[(j,k)] <= sum(d[0][j]*x[(talh,j,k)] for talh in range(1,qttalhao-1) if talh !=j))
for k in range(0,qtveiculo):
model.goal.add(expr = sum(x[(talh,(qttalhao-1),k)] for talh in range(0,qttalhao-1) if talh != 0 )==1 )
model.start.add(expr = sum(x[(0,talh,k)] for talh in range(1,qttalhao-1) if talh != 0)==1 )
for k in range(0,qtveiculo):
for p in range(1,qttalhao-1):
model.fluxo.add(expr = (sum(x[(i,p,k)] for i in range(0,qttalhao-1) if i != p )-sum(x[(p,j,k)] for j in range(1,qttalhao) if p!=j) )==0)
for k in range(0,qtveiculo):
for i in range(1,qttalhao-1):
for j in range(1,qttalhao-1):
if i != j:
model.subrota.add(expr = u[(i,k)]-u[(j,k)]+(qttalhao-1)*x[(i,j,k)] <= (qttalhao-1)-1)
# =============================================================================
# FUNÇÃO OBJETIVO
# =============================================================================
model.obj = pyo.Objective(expr = sum(c[i][j]*x[(i,j,k)] for i in range(0,qttalhao-1) for j in range(1,qttalhao) for k in range(0,qtveiculo)))
# =============================================================================
# model.obj = pyo.Objective(expr = sum(y[i][j]*w for i in range(0,qttalhao-1) for j in range(0,qtveiculo))) # OLIVEIRA
# =============================================================================
# =============================================================================
# APLICANDDO O SOLVER
# =============================================================================
opt = SolverFactory('cplex') # glpk , gurobi[ expired ] , cplex
resultado = opt.solve(model)#, tee=True) # tee = true verifica a factibilidade
dT = timer.toc('Termina execução')
# =============================================================================
# IMPRIMINDO RESULTADO
# =============================================================================
model.pprint() # imprime a modelagem matemática
# =============================================================================
# GRAVANDO OUTPUT
# =============================================================================
print('Função Objetivo = ', model.obj())
with open("output_implemetation"+str(g)+".txt", "w+") as f:
model.pprint(f)
print(resultado, file=f)
print('Função Objetivo = ', model.obj(), file=f)
print('Esta foi a execução ',g)
print(porcento) #TESTE
print("Tempo rodado: %0.1f" % dT)
# pegar o tempo de execução
# se quiser imprimir variável específica model.x.pprint()
hora_atual = datetime.datetime.now()
return(model.obj(),dT,distancia,porcento,soma,soma1,C,len(V),porcento,hora_atual)
结果:
上图显示 y[fields][vehicle]
我认为当我编写 NonNegativeInteger 和 bound=(0,None) 时,它不需要给出浮点值。 像 298.9999999999986824 这样的值,它的 supose 为 299,3.9333151509501845e-11 为 0。我想错了吗?
答: 暂无答案
评论