252106862eder commited on
Commit
4e296cf
·
verified ·
1 Parent(s): 965c49e

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +69 -43
app.py CHANGED
@@ -1,66 +1,92 @@
1
  import gradio as gr
2
- # Importe sua função resolver_graficamente aqui
3
- # from your_module import resolver_graficamente
 
 
 
 
4
 
5
- # Adapte a função para ser compatível com Gradio (receber inputs como Gradio espera e retornar outputs para Gradio)
6
- def run_solver(c1_val, c2_val, opt_type, r_data):
7
- c = [float(c1_val), float(c2_val)]
 
 
 
8
  restricoes_parsed = []
9
- # r_data seria uma string que o usuário digita, e você precisaria fazer o parse
10
- # Por exemplo, "2 1 <= 10\n1 1 <= 8" -> parsear em lista de tuplas
11
-
12
- # Exemplo simples de parsing (idealmente mais robusto)
13
- for line in r_data.strip().split('\n'):
14
  parts = line.split()
15
  if len(parts) == 4:
16
- restricoes_parsed.append((float(parts[0]), float(parts[1]), parts[2], float(parts[3])))
 
 
 
 
 
 
 
 
 
 
 
 
17
  else:
18
- return "Erro no formato das restrições.", None, None, None, None
19
 
20
- # Chamar sua função de resolução
21
- result = resolver_graficamente(c, opt_type, restricoes_parsed)
22
-
23
- if result['regiao_factivel_status'] == 'Vazia':
24
- return "Região factível vazia. Não há solução.", None, None, None, None
 
25
 
26
- # Formatar a saída textual
27
- output_text = f"## Resultado da Otimização\n" \
28
  f"**Função Objetivo:** {result['funcao_objetivo']}\n" \
29
- f"**Restrições:**\n"
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
- output_text += f"\n**Solução Ótima:** {result['solucao_tipo_msg']}\n" \
38
- f" Vértice(s) Ótimo(s): {[v for v in result['solucao_otima_vertices']]}\n" \
39
- f" Valor Ótimo de Z: {result['valor_otimo_z']:.2f}\n"
 
 
 
 
 
40
 
41
- # Gradio pode exibir matplotlib figures diretamente
42
  return output_text, result['figura'], \
43
- f"{result['solucao_otima_vertices']}", \
44
- f"{result['valor_otimo_z']:.2f}", \
45
- f"{result['regiao_factivel_status']}"
46
 
 
47
  iface = gr.Interface(
48
- fn=run_solver,
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(label="Restrições (Ex: '2 1 <= 10\n1 1 <= 8')", lines=5)
 
 
 
 
 
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="Vértices Ótimos"),
59
- gr.Textbox(label="Valor Ótimo de Z"),
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
- iface.launch()
 
 
 
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()