Arthur-Attili commited on
Commit
6add462
·
verified ·
1 Parent(s): 2135c34

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +69 -28
app.py CHANGED
@@ -84,57 +84,99 @@ def calcular_tempo_parcelas(combinacao):
84
  return ""
85
 
86
  def buscar_combinacoes(credito, entrada, parcela, adm_selecionadas):
 
87
  if not planilha_carregada:
88
  if not carregar_planilha():
89
  return "❌ Erro: planilha não carregada."
 
 
90
  if adm_selecionadas:
91
  grupos = {adm: cotas for adm, cotas in grupos_auto.items() if adm in adm_selecionadas}
92
  else:
93
  grupos = grupos_auto
 
94
  if not grupos:
95
  return "🚫 Nenhuma cota encontrada com os filtros."
96
 
 
97
  if credito > 5000000:
98
- tol_cred, tol_ent, tol_par = 0.50, 0.50, 1.00
99
- max_cotas = 25
 
 
 
100
  elif credito > 100000:
101
- tol_cred, tol_ent, tol_par = 0.25, 0.25, 0.50
102
- max_cotas = 15
 
 
 
103
  else:
104
- tol_cred, tol_ent, tol_par = 0.15, 0.15, 0.30
105
- max_cotas = 15
 
 
 
106
 
107
- cred_min = credito * (1 - tol_cred)
108
- cred_max = credito * (1 + tol_cred)
109
- ent_min = entrada * (1 - tol_ent)
110
- ent_max = entrada * (1 + tol_ent)
111
- parc_min = parcela * (1 - tol_par)
112
- parc_max = parcela * (1 + tol_par)
113
 
114
  resultados = []
 
 
 
115
  for adm, cotas in grupos.items():
116
- for r in range(1, min(max_cotas + 1, len(cotas) + 1)):
117
- for comb in itertools.combinations(cotas, r):
118
- total_cred = sum(c['valor_credito'] for c in comb)
119
- total_ent_base = sum(c['valor_entrada'] for c in comb)
 
 
 
 
 
 
 
 
 
 
 
120
  total_ent = total_ent_base + total_cred * 0.085
121
- total_parc = sum(c['valor_parcela'] for c in comb)
 
122
  if (cred_min <= total_cred <= cred_max and
123
  ent_min <= total_ent <= ent_max and
124
  parc_min <= total_parc <= parc_max):
125
- total_saldo = sum(c['saldo_devedor'] for c in comb)
126
  valor_final = total_ent + total_saldo
127
  diff = abs(valor_final - total_cred)
128
- resultados.append((adm, comb, diff))
129
- if len(resultados) >= 30:
 
 
130
  break
131
- if len(resultados) >= 30:
 
 
132
  break
133
- if len(resultados) >= 30:
 
 
134
  break
135
 
 
 
 
136
  if not resultados:
137
- return "🚫 Nenhuma combinação encontrada."
 
 
 
 
138
  resultados.sort(key=lambda x: x[2])
139
  return formatar_resultados(resultados[:15])
140
 
@@ -175,10 +217,10 @@ def formatar_resultados(resultados):
175
  """
176
  return resposta
177
 
178
- # Carrega a planilha antes de iniciar
179
  carregar_planilha()
180
 
181
- # Interface usando gr.Interface (API automática em /api/predict)
182
  demo = gr.Interface(
183
  fn=buscar_combinacoes,
184
  inputs=[
@@ -193,10 +235,9 @@ demo = gr.Interface(
193
  )
194
  ],
195
  outputs=gr.Textbox(label="Resultados da Busca", lines=20, max_lines=40),
196
- title="🚗 Busca de Combinações de Consórcio Auto",
197
  description="Insira os valores desejados para crédito, entrada e parcela, e filtre por administradora."
198
  )
199
 
200
  if __name__ == "__main__":
201
- demo.launch()
202
- #
 
84
  return ""
85
 
86
  def buscar_combinacoes(credito, entrada, parcela, adm_selecionadas):
87
+ """Versão otimizada: limita combinações e interrompe cedo."""
88
  if not planilha_carregada:
89
  if not carregar_planilha():
90
  return "❌ Erro: planilha não carregada."
91
+
92
+ # Filtra administradoras selecionadas
93
  if adm_selecionadas:
94
  grupos = {adm: cotas for adm, cotas in grupos_auto.items() if adm in adm_selecionadas}
95
  else:
96
  grupos = grupos_auto
97
+
98
  if not grupos:
99
  return "🚫 Nenhuma cota encontrada com os filtros."
100
 
101
+ # Configura tolerâncias e limites de acordo com o valor do crédito
102
  if credito > 5000000:
103
+ tolerancia_credito = 0.50
104
+ tolerancia_entrada = 0.50
105
+ tolerancia_parcela = 1.00
106
+ max_cotas_combinacao = 25
107
+ max_combinacoes_por_adm = 7000
108
  elif credito > 100000:
109
+ tolerancia_credito = 0.25
110
+ tolerancia_entrada = 0.25
111
+ tolerancia_parcela = 0.50
112
+ max_cotas_combinacao = 15
113
+ max_combinacoes_por_adm = 4000
114
  else:
115
+ tolerancia_credito = 0.15
116
+ tolerancia_entrada = 0.15
117
+ tolerancia_parcela = 0.30
118
+ max_cotas_combinacao = 15
119
+ max_combinacoes_por_adm = 4000
120
 
121
+ cred_min = credito * (1 - tolerancia_credito)
122
+ cred_max = credito * (1 + tolerancia_credito)
123
+ ent_min = entrada * (1 - tolerancia_entrada)
124
+ ent_max = entrada * (1 + tolerancia_entrada)
125
+ parc_min = parcela * (1 - tolerancia_parcela)
126
+ parc_max = parcela * (1 + tolerancia_parcela)
127
 
128
  resultados = []
129
+ total_combinacoes_testadas = 0
130
+
131
+ # Para cada administradora
132
  for adm, cotas in grupos.items():
133
+ print(f"🔍 Analisando administradora: {adm} ({len(cotas)} cotas)")
134
+ cotas_para_combinar = cotas
135
+
136
+ # Gera combinações de tamanho 1 até max_cotas_combinacao
137
+ for r in range(1, min(max_cotas_combinacao + 1, len(cotas_para_combinar) + 1)):
138
+ combinacoes_geradas = 0
139
+ for combinacao in itertools.combinations(cotas_para_combinar, r):
140
+ if combinacoes_geradas >= max_combinacoes_por_adm:
141
+ break
142
+
143
+ total_combinacoes_testadas += 1
144
+ combinacoes_geradas += 1
145
+
146
+ total_cred = sum(c['valor_credito'] for c in combinacao)
147
+ total_ent_base = sum(c['valor_entrada'] for c in combinacao)
148
  total_ent = total_ent_base + total_cred * 0.085
149
+ total_parc = sum(c['valor_parcela'] for c in combinacao)
150
+
151
  if (cred_min <= total_cred <= cred_max and
152
  ent_min <= total_ent <= ent_max and
153
  parc_min <= total_parc <= parc_max):
154
+ total_saldo = sum(c['saldo_devedor'] for c in combinacao)
155
  valor_final = total_ent + total_saldo
156
  diff = abs(valor_final - total_cred)
157
+ resultados.append((adm, combinacao, diff))
158
+
159
+ # Se já encontrou 3x o número desejado, interrompe busca
160
+ if len(resultados) >= 45: # 15 * 3
161
  break
162
+
163
+ # Sai do loop de r se já temos resultados suficientes
164
+ if len(resultados) >= 45:
165
  break
166
+
167
+ # Sai do loop de administradoras se já temos resultados suficientes
168
+ if len(resultados) >= 45:
169
  break
170
 
171
+ print(f"🔍 Total de combinações testadas: {total_combinacoes_testadas}")
172
+ print(f"🔍 Combinações válidas encontradas: {len(resultados)}")
173
+
174
  if not resultados:
175
+ # Tenta busca mais ampla (opcional, mas pode ser mantida)
176
+ # Aqui poderia chamar uma função ampla, mas para simplicidade, retorna mensagem
177
+ return "🚫 Nenhuma combinação encontrada com os parâmetros fornecidos."
178
+
179
+ # Ordena pela diferença e pega as 15 melhores
180
  resultados.sort(key=lambda x: x[2])
181
  return formatar_resultados(resultados[:15])
182
 
 
217
  """
218
  return resposta
219
 
220
+ # Carrega a planilha uma vez no início
221
  carregar_planilha()
222
 
223
+ # Interface Gradio (usando Blocks para maior controle, mas Interface também funciona)
224
  demo = gr.Interface(
225
  fn=buscar_combinacoes,
226
  inputs=[
 
235
  )
236
  ],
237
  outputs=gr.Textbox(label="Resultados da Busca", lines=20, max_lines=40),
238
+ title="🚗 Busca de Combinações de Consórcio Auto (Otimizado)",
239
  description="Insira os valores desejados para crédito, entrada e parcela, e filtre por administradora."
240
  )
241
 
242
  if __name__ == "__main__":
243
+ demo.launch()