How to select the best result and the best variables from them
RafaHPSUnicamp opened this issue · 4 comments
Hi, I just wanted to know how to select the best results from the Playtpus code that I adapted from LINGO software. Because the Playtpus gives me a lot of good results. For example, I wanted ONLY ONE result, and the best result. How I can do that from this code?
#variaveis
S_preco = 1069.23
F_preco = 1071.09
OB_preco = 2006.66
OR_preco = 2669.21
B_preco = 2540.47
S_custo = 533.17
F_custo = 569.89
OB_custo = 1384.39
OR_custo = 1466.34
B_custo = 2389.89
S_total = 2329278
S_percentoleo = 0.2057
C_percentoleo = 0.0064
OBF_percentoleo = 0.22
OR_massamolar = 873*0.000001
M_massamolar = 32*0.000001
B_massamolar = 292*0.000001
G_massamolar = 92*0.000001
S_capacidade = 3600000
OR_capacidade = 367200
B_capacidade = 887760*(880/1000)
S_demanda = 80638
F_demanda = 398984
OB_demanda = 164700
OR_demanda = 164700
B_demanda = 77634
from platypus import NSGAII, Problem, Real
def belegundu(vars):
S_comercio = vars[0]
F_comercio = vars[1]
OB_comercio = vars[2]
OR_comercio = vars[3]
B_total = vars[4]
S_insumo = vars[5]
C_insumo = vars[6]
OB_total = vars[7]
OR_total = vars[8]
OR_biodiesel = vars[9]
MOL = vars[10]
M_insumo = vars[11]
G_comercio = vars[12]
objs = [1*(S_comercio*S_preco - S_comercio*S_custo + F_comercio*F_preco - F_comercio*F_custo + OB_comercio*OB_preco - OB_comercio*OB_custo + OR_comercio*OR_preco - OR_comercio*OR_custo + B_total*B_preco - B_total*B_custo)]
constrs = [
S_total - S_comercio - S_insumo,
S_insumo - C_insumo - F_comercio - OB_total,
C_insumo - 0.04*S_insumo,
OB_total - (F_comercio*OBF_percentoleo)/(1 - OBF_percentoleo),
OB_total - OB_comercio - OR_total,
OR_total - OR_comercio - OR_biodiesel,
OR_biodiesel - MOL*OR_massamolar,
M_insumo - 3*MOL*M_massamolar,
B_total - 3*MOL*B_massamolar,
G_comercio - MOL*G_massamolar,
S_insumo - S_capacidade,
OR_total - OR_capacidade,
B_total - B_capacidade,
S_comercio - S_demanda,
F_comercio** - F_demanda,
OB_comercio - OB_demanda,
OR_comercio - OR_demanda,
B_total - B_demanda
]
return objs, constrs
problem = Problem(13, 1, 18)
problem.types[:] = [Real(0, 2329278), Real(0, 2329278), Real(0, 2329278), Real(0, 2329278), Real(0, 2329278), Real(0, 2329278), Real(0, 2329278), Real(0, 2329278), Real(0, 2329278), Real(0, 2329278), Real(0, 2329278), Real(0, 2329278), Real(0, 2329278)]
problem.constraints[0] = "==0"
problem.constraints[1] = "==0"
problem.constraints[2] = "==0"
problem.constraints[3] = "==0"
problem.constraints[4] = "==0"
problem.constraints[5] = "==0"
problem.constraints[6] = "==0"
problem.constraints[7] = "==0"
problem.constraints[8] = "==0"
problem.constraints[9] = "==0"
problem.constraints[10] = "<=0"
problem.constraints[11] = "<=0"
problem.constraints[12] = "<=0"
problem.constraints[13] = ">=0"
problem.constraints[14] = ">=0"
problem.constraints[15] = ">=0"
problem.constraints[16] = ">=0"
problem.constraints[17] = ">=0"
problem.function = belegundu
problem.directions[:] = Problem.MAXIMIZE
algorithm = NSGAII(problem)
algorithm.run(1000)
feasible_solutions = [s for s in algorithm.result if s.feasible]
for solution in algorithm.result:
print(solution.objectives)
for solution in algorithm.result:
print(solution.variables)
Remember that I adapted from this LINGO code:
MAX = L_soja + L_farelo + L_oleobruto + L_oleorefinado + L_biodiesel;
L_soja = S_comercio*S_preco - S_comercio*S_custo;
L_farelo = F_comercio*F_preco - F_comercio*F_custo;
L_oleobruto = OB_comercio*OB_preco - OB_comercio*OB_custo;
L_oleorefinado = OR_comercio*OR_preco - OR_comercio*OR_custo;
L_biodiesel = B_total*B_preco - B_total*B_custo;
!variaveis de preço e de custo (em R$/t);
S_preco = 1069.23;
F_preco = 1071.09;
OB_preco = 2006.66;
OR_preco = 2669.21;
B_preco = 2540.47;
S_custo = 533.17;
F_custo = 569.89;
OB_custo = 1384.39;
OR_custo = 1466.34;
B_custo = 2389.89;
!quantidade inicial de soja;
S_total = 2329278; !t;
!produção dos subprodutos;
S_total = S_comercio + S_insumo;
S_insumo = C_insumo + F_comercio + OB_total; !t;
C_insumo = 0.04*S_insumo;
S_percentoleo = 0.2057;
C_percentoleo = 0.0064;
OBF_percentoleo = 0.22;
OB_total = (F_comercio*OBF_percentoleo)/(1 - OBF_percentoleo);
!balanceamento das massas do óleo;
OB_total = OB_comercio + OR_total;
!balanceamento das massas do óleo refinado;
OR_total = OR_comercio + OR_biodiesel;
!estequiometria da reação do biodiesel (massas molares em kg/mol);
OR_biodiesel = MOL*OR_massamolar;
M_insumo = 3*MOL*M_massamolar;
B_total = 3*MOL*B_massamolar;
G_comercio = MOL*G_massamolar;
SUM_REAGENTES = OR_biodiesel + M_insumo;
SUM_PRODUTOS = B_total + G_comercio;
!constantes da reação estequiometrica (convertido de g/mol para t/mol) ;
OR_massamolar = 873*0.000001;
M_massamolar = 32*0.000001;
B_massamolar = 292*0.000001;
G_massamolar = 92*0.000001;
!restrições (capacidade maxima);
S_insumo <= S_capacidade;
OR_total <= OR_capacidade;
B_total <= B_capacidade;
!restrições (demanda mínima);
S_comercio >= S_demanda;
F_comercio >= F_demanda;
OB_comercio >= OB_demanda;
OR_comercio >= OR_demanda;
B_total >= B_demanda;
!constantes das restrições (em t);
S_capacidade = 3600000;
OR_capacidade = 367200;
B_capacidade = 887760*(880/1000); !Convertido de metros cubicos (m³) para kg, e consequentemente em toneladas;
S_demanda = 80638;
F_demanda = 398984;
OB_demanda = 164700;
OR_demanda = 164700;
B_demanda = 77634;
@RafaHPSUnicamp did someone answer you?
This issue is stale and will be closed soon. If you feel this issue is still relevant, please comment to keep it active. Please also consider working on a fix and submitting a PR.
Just commenting so that the issue is not closed since we did not get an answer.
This issue is stale and will be closed soon. If you feel this issue is still relevant, please comment to keep it active. Please also consider working on a fix and submitting a PR.