Pyomo:具有非负整数属性的变量,给出浮点值

Pyomo: variable with NonNegativeInteger proprieties giving float value

提问人:Igor Matsumoto 提问时间:4/6/2023 最后编辑:Igor Matsumoto 更新时间:4/6/2023 访问量:97

问:

我试图优化从田间采摘并运输到工厂的甘蔗秸秆包。

法典:

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。我想错了吗?

Python 优化 浮点整 pyomo

评论

0赞 Erwin Kalvelagen 4/7/2023
这是正常行为。在混合整数规划中,整数变量可能略微非整数,这是可行的(这是一个容差问题)。您可以在进一步处理之前对其进行四舍五入。

答: 暂无答案