Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,66 +1,92 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
-
|
| 3 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
|
| 5 |
-
#
|
| 6 |
-
def
|
| 7 |
-
|
|
|
|
|
|
|
|
|
|
| 8 |
restricoes_parsed = []
|
| 9 |
-
#
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
for line in r_data.strip().split('\n'):
|
| 14 |
parts = line.split()
|
| 15 |
if len(parts) == 4:
|
| 16 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
else:
|
| 18 |
-
return "
|
| 19 |
|
| 20 |
-
# Chamar
|
| 21 |
-
result = resolver_graficamente(
|
| 22 |
-
|
| 23 |
-
|
| 24 |
-
|
|
|
|
| 25 |
|
| 26 |
-
#
|
| 27 |
-
output_text = f"##
|
| 28 |
f"**Função Objetivo:** {result['funcao_objetivo']}\n" \
|
| 29 |
-
f"**
|
| 30 |
-
for i, (a1, a2, op, b) in enumerate(result['restricoes']):
|
| 31 |
-
output_text += f"- R{i+1}: {a1}x1 + {a2}x2 {operador_str(op)} {b}\n"
|
| 32 |
-
|
| 33 |
-
output_text += f"\n**Vértices da Região Factível e valores de Z:**\n"
|
| 34 |
-
for v in result['vertices_info']:
|
| 35 |
-
output_text += f"- {v['nome']}: {v['coordenadas']} -> Z = {v['valor_z']:.2f}\n"
|
| 36 |
|
| 37 |
-
|
| 38 |
-
|
| 39 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 40 |
|
| 41 |
-
# Gradio pode
|
| 42 |
return output_text, result['figura'], \
|
| 43 |
-
f"{result['solucao_otima_vertices']}", \
|
| 44 |
-
f"{result['valor_otimo_z']:.2f}", \
|
| 45 |
-
|
| 46 |
|
|
|
|
| 47 |
iface = gr.Interface(
|
| 48 |
-
fn=
|
| 49 |
inputs=[
|
| 50 |
-
gr.Number(label="Coeficiente c1 (x1)"),
|
| 51 |
-
gr.Number(label="Coeficiente c2 (x2)"),
|
| 52 |
-
gr.Radio(["maximizar", "minimizar"], label="Tipo de Otimização"),
|
| 53 |
-
gr.Textbox(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
],
|
| 55 |
outputs=[
|
| 56 |
gr.Markdown(label="Detalhes da Resolução"),
|
| 57 |
-
gr.Plot(label="Gráfico da Região Factível"),
|
| 58 |
-
gr.Textbox(label="
|
| 59 |
-
gr.Textbox(label="Valor Ótimo
|
| 60 |
gr.Textbox(label="Status da Região Factível")
|
| 61 |
],
|
| 62 |
title="Resolvedor Gráfico de Programação Linear (2 Variáveis)",
|
| 63 |
-
description="Insira os parâmetros do seu problema de PL e visualize a solução graficamente."
|
| 64 |
)
|
| 65 |
|
| 66 |
-
|
|
|
|
|
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
+
import numpy as np
|
| 3 |
+
import matplotlib.pyplot as plt
|
| 4 |
+
import itertools
|
| 5 |
+
from scipy.spatial import ConvexHull # Certifique-se de que sua função resolver_graficamente usa isso
|
| 6 |
+
# Importar a função resolver_graficamente e suas auxiliares (cole o código acima aqui ou em um módulo separado)
|
| 7 |
+
# ... COLE AQUI O CÓDIGO COMPLETO DE `resolver_graficamente` E SUAS FUNÇÕES AUXILIARES ...
|
| 8 |
|
| 9 |
+
# Função wrapper para Gradio: processa as entradas do usuário
|
| 10 |
+
def gradio_solver(c1_val, c2_val, opt_type, restricoes_raw):
|
| 11 |
+
# 1. Parsear os coeficientes da função objetivo
|
| 12 |
+
c_coeffs = [float(c1_val), float(c2_val)]
|
| 13 |
+
|
| 14 |
+
# 2. Parsear as restrições
|
| 15 |
restricoes_parsed = []
|
| 16 |
+
# Formato esperado: "a1 a2 operador b" por linha (ex: "2 1 le 10")
|
| 17 |
+
for line in restricoes_raw.strip().split('\n'):
|
| 18 |
+
if not line.strip(): # Ignora linhas vazias
|
| 19 |
+
continue
|
|
|
|
| 20 |
parts = line.split()
|
| 21 |
if len(parts) == 4:
|
| 22 |
+
try:
|
| 23 |
+
a1 = float(parts[0])
|
| 24 |
+
a2 = float(parts[1])
|
| 25 |
+
op = parts[2].lower()
|
| 26 |
+
b = float(parts[3])
|
| 27 |
+
if op not in ['le', 'ge', '<=', '>=']:
|
| 28 |
+
raise ValueError("Operador inválido. Use 'le' (<=) ou 'ge' (>=).")
|
| 29 |
+
# Normaliza para 'le' ou 'ge' para a função resolver_graficamente
|
| 30 |
+
op = 'le' if op == '<=' else 'ge' if op == '>=' else op
|
| 31 |
+
restricoes_parsed.append((a1, a2, op, b))
|
| 32 |
+
except ValueError as e:
|
| 33 |
+
# Retorna um erro detalhado para o usuário se o parsing falhar
|
| 34 |
+
return "Erro de parsing na restrição: " + str(e) + ". Verifique o formato.", None, None, None, None
|
| 35 |
else:
|
| 36 |
+
return "Formato de restrição inválido. Use 'a1 a2 operador b' por linha.", None, None, None, None
|
| 37 |
|
| 38 |
+
# Chamar a função principal de resolução
|
| 39 |
+
result = resolver_graficamente(c_coeffs, opt_type, restricoes_parsed)
|
| 40 |
+
|
| 41 |
+
# Fechar a figura do matplotlib para evitar vazamento de memória em execuções sucessivas
|
| 42 |
+
if result['figura'] is not None:
|
| 43 |
+
plt.close(result['figura']) # Importante!
|
| 44 |
|
| 45 |
+
# Preparar as saídas para o Gradio
|
| 46 |
+
output_text = f"## Resolução do Problema de PL\n\n" \
|
| 47 |
f"**Função Objetivo:** {result['funcao_objetivo']}\n" \
|
| 48 |
+
f"**Status da Região Factível:** {result['regiao_factivel_status']}\n"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
|
| 50 |
+
if result['regiao_factivel_status'] != 'Vazia' and "ilimitada" not in result['regiao_factivel_status']:
|
| 51 |
+
output_text += f"\n**Vértices da Região Factível:**\n"
|
| 52 |
+
for v_info in result['vertices_info']:
|
| 53 |
+
output_text += f"- {v_info['nome']}: {v_info['coordenadas']} -> Z = {v_info['valor_z']:.2f}\n"
|
| 54 |
+
|
| 55 |
+
output_text += f"\n**Solução Ótima:** {result['solucao_tipo_msg']}\n" \
|
| 56 |
+
f"**Vértice(s) Ótimo(s):** {[f'({v[0]:.2f}, {v[1]:.2f})' for v in result['solucao_otima_vertices']]}\n" \
|
| 57 |
+
f"**Valor Ótimo de Z:** {result['valor_otimo_z']:.2f}\n"
|
| 58 |
|
| 59 |
+
# O Gradio pode receber diretamente a figura do matplotlib
|
| 60 |
return output_text, result['figura'], \
|
| 61 |
+
f"{[f'({v[0]:.2f}, {v[1]:.2f})' for v in result['solucao_otima_vertices']]}" if result['solucao_otima_vertices'] else "N/A", \
|
| 62 |
+
f"{result['valor_otimo_z']:.2f}" if result['valor_otimo_z'] is not None else "N/A", \
|
| 63 |
+
result['regiao_factivel_status']
|
| 64 |
|
| 65 |
+
# Definindo a interface Gradio
|
| 66 |
iface = gr.Interface(
|
| 67 |
+
fn=gradio_solver,
|
| 68 |
inputs=[
|
| 69 |
+
gr.Number(label="Coeficiente c1 (para x1)", value=3.0),
|
| 70 |
+
gr.Number(label="Coeficiente c2 (para x2)", value=2.0),
|
| 71 |
+
gr.Radio(["maximizar", "minimizar"], label="Tipo de Otimização", value="maximizar"),
|
| 72 |
+
gr.Textbox(
|
| 73 |
+
label="Restrições (uma por linha, formato: 'a1 a2 operador b')",
|
| 74 |
+
value="2 1 <= 10\n1 1 <= 8", # Exemplo padrão
|
| 75 |
+
lines=5,
|
| 76 |
+
placeholder="Exemplo:\n2 1 le 10\n1 1 le 8\n(use 'le' para <=, 'ge' para >=)"
|
| 77 |
+
)
|
| 78 |
],
|
| 79 |
outputs=[
|
| 80 |
gr.Markdown(label="Detalhes da Resolução"),
|
| 81 |
+
gr.Plot(label="Gráfico da Região Factível e Solução Ótima"),
|
| 82 |
+
gr.Textbox(label="Coordenadas do(s) Vértice(s) Ótimo(s)"),
|
| 83 |
+
gr.Textbox(label="Valor Ótimo da Função Objetivo (Z)"),
|
| 84 |
gr.Textbox(label="Status da Região Factível")
|
| 85 |
],
|
| 86 |
title="Resolvedor Gráfico de Programação Linear (2 Variáveis)",
|
| 87 |
+
description="Insira os parâmetros do seu problema de PL com duas variáveis e visualize a solução graficamente."
|
| 88 |
)
|
| 89 |
|
| 90 |
+
# Iniciar a interface Gradio
|
| 91 |
+
if __name__ == "__main__":
|
| 92 |
+
iface.launch()
|