<div dir="ltr">Gracias por el dato, voy a intentarlo.<div>Saludos.</div></div><div class="gmail_extra"><br clear="all"><div><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div><br><br>Manuel Alejandro Estévez Fernández</div><div><br><br></div></div></div></div>
<br><div class="gmail_quote">El 9 de febrero de 2018, 8:06, Daπid <span dir="ltr"><<a href="mailto:davidmenhur@gmail.com" target="_blank">davidmenhur@gmail.com</a>></span> escribió:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div>La forma eficiente de resolver el problema es usando programación dinámica (dynamic programming), y es equivalente a uno de los problemas clásicos: dar cambio en monedas. Hay mucha documentación al respecto, sobre todo en inglés.<br><br>Un par de enlaces, sin garantía de calidad:<br><br><a href="https://interactivepython.org/runestone/static/pythonds/Recursion/DynamicProgramming.html" target="_blank">https://interactivepython.org/<wbr>runestone/static/pythonds/<wbr>Recursion/DynamicProgramming.<wbr>html</a><br><a href="https://es.wikibooks.org/wiki/Programaci%C3%B3n_din%C3%A1mica/Problema_de_las_monedas_con_programaci%C3%B3n_din%C3%A1mica" target="_blank">https://es.wikibooks.org/wiki/<wbr>Programaci%C3%B3n_din%C3%<wbr>A1mica/Problema_de_las_<wbr>monedas_con_programaci%C3%B3n_<wbr>din%C3%A1mica</a><br><br></div><div>Si te interesa, mi recomendación es que estudies programación dinámica en general, en cuanto lo pilles, aplicarlo a tu problema es fácil.<br></div><div><br></div>/David.<br></div><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="h5">2018-01-12 21:35 GMT+01:00 Manuel A. Estevez Fernandez <span dir="ltr"><<a href="mailto:stvzito@gmail.com" target="_blank">stvzito@gmail.com</a>></span>:<br></div></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div class="h5"><div dir="ltr">Hola a todos, tengo la siguiente necesidad:<div><br></div><div>Encontrar una combinación de valores pertenecientes a una colección cuyo resultado sea un numero determinado.</div><div><br></div><div>Algo así:</div><div><table style="border-collapse:collapse;width:180pt" width="240" cellspacing="0" cellpadding="0" border="0">
<colgroup><col style="width:60pt" width="80" span="3">
</colgroup><tbody><tr style="height:15pt" height="20">
<td style="height:15pt;width:60pt" width="80" height="20">id</td>
<td style="width:60pt" width="80">target</td>
<td style="width:60pt" width="80">valores</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">1</td>
<td align="right">100</td>
<td align="right">20</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">1</td>
<td align="right">100</td>
<td align="right">30</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">1</td>
<td align="right">100</td>
<td align="right">50</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">1</td>
<td align="right">100</td>
<td align="right">15</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">1</td>
<td align="right">100</td>
<td align="right">45</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">1</td>
<td align="right">100</td>
<td align="right">60</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">2</td>
<td align="right">150</td>
<td align="right">75</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">2</td>
<td align="right">150</td>
<td align="right">75</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">2</td>
<td align="right">150</td>
<td align="right">100</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">3</td>
<td align="right">1500</td>
<td align="right">900</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">3</td>
<td align="right">1500</td>
<td align="right">500</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">3</td>
<td align="right">1500</td>
<td align="right">600</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">3</td>
<td align="right">1500</td>
<td align="right">1000</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">3</td>
<td align="right">1500</td>
<td align="right">750</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">3</td>
<td align="right">1500</td>
<td align="right">200</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">3</td>
<td align="right">1500</td>
<td align="right">300</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">3</td>
<td align="right">1500</td>
<td align="right">10</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">3</td>
<td align="right">1500</td>
<td align="right">30</td>
</tr>
<tr style="height:15pt" height="20">
<td style="height:15pt" height="20" align="right">3</td>
<td align="right">1500</td>
<td align="right">50</td>
</tr></tbody></table><div><div class="m_8320152609213907243m_321070893811096641gmail_signature"><div dir="ltr"><div><br></div><div>Toda esta información la tengo en un archivo csv. El cual leo y genero un diccionario:</div><div><br></div><div> { </div><div> id : { target : target , values : [ valores ] } </div><div> , id : { target : target , values : [ valores ] } </div><div>}</div><div><br></div><div>con el siguiente codigo realizo un matriz de verdad de la longitud de la cantidad de los valores por ID, y realizo la suma si es lo del target +1-1 con ese vale.</div><div><br></div><div><div>import numpy as np</div><div>import itertools</div><div><br></div><div>for id in in diccionario : </div><div><span style="white-space:pre-wrap"> </span>for tup in itertools.product([0,1] , repeat=len(diccionario[id]['va<wbr>lues'])):</div><div><span style="white-space:pre-wrap"> </span>resultado = np.sum( np.dot( np.array(list(tup)) , np.array( diccionario[id]['valores'] ) ) )</div><div><span style="white-space:pre-wrap"> </span>if ( diccionario[id]['target'] - 1) <= resultado and resultado <= ( diccionario[id]['target'] + 1) :</div><div><span style="white-space:pre-wrap"> </span>print 'ID : ', id, ' Combinacion : ' , tup , 'Valores ', diccionario[id]['valores']</div><div><span style="white-space:pre-wrap"> </span>break<span style="white-space:pre-wrap"> </span></div></div><div><br></div><div><br></div><div><br></div><div>La problematica que tengo es que obviamente entre mas grande sea la cantida de valores la combinaciones serán muchas más. </div><div><br></div><div>Tengo la idea de utilizar un poco de paralelizar, pero no tengo idea de como empezar.</div><div><br></div><div>No sé como hacerlo o si sea posible lo siguiente: </div><div>Lanzar un proceso por ID.</div><div>-Generar una segmentación de la matriz de verdad y asignarla un subproceso</div><div>-Cuando algún subproceso encuentre un resultado válido, lo devuelva y se detengan los subprocesos</div><div>-Avanzar al siguiente ID.</div><div><br></div><div>Saludos y gracias de antemano.</div><div><br></div><div><br><br>Manuel Alejandro Estévez Fernández</div><div><br><br></div></div></div></div>
</div></div>
<br></div></div><span class="">______________________________<wbr>_________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org" target="_blank">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer" target="_blank">https://mail.python.org/mailma<wbr>n/listinfo/python-es</a><br>
<br></span></blockquote></div><br></div>
<br>______________________________<wbr>_________________<br>
Python-es mailing list<br>
<a href="mailto:Python-es@python.org">Python-es@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/python-es" rel="noreferrer" target="_blank">https://mail.python.org/<wbr>mailman/listinfo/python-es</a><br>
<br></blockquote></div><br></div>