Помогите решить задачку. Надо придумать алгоритм набора произвольного сопротивления Rx из N последовательно соединенных резисторов стандартных номиналов. Пока решаю перебором, но надо что-то пошустрее.
Простейший алгоритм - на каждом шаге берем максимальное сопротивление R из ряда, не большее Rx. Затем присваиваем Rx=Rx-R, и повторяем. Останавливаемся при достижении заданной точности, или после N итераций. Хотя это конечно и быстро, но по сравнению с перебором во многих случаях дает либо более длинные цепочки при той же точности, либо меньшую точность при той же длине цепочки.
Добавлено спустя 5 минут 19 секунд: Кстати, у вас перебор оптимизирован? например, когда перебираем цепочки, все время храним "чемпиона" - самую лучшую из найденных. Перебирая остальные, заранее отбрасываем цепочки которые достигли той же длины. Такая простецкая оптимизация очень часто разгоняет переборные алгоритмы в десятки раз.
elmot писал(а):когда перебираем цепочки, все время храним "чемпиона" - самую лучшую из найденных. Перебирая остальные, заранее отбрасываем цепочки которые достигли той же длины.
Да, такое есть. Но все равно скорость очень быстро падает с ростом длины ряда.
Michael_K писал(а):Не существует оптимального решения.
Какого порядка цифры? Ряд резисторов действительно "стандартный" (в нем можно найти закономерность?)... Он неограничен в обе стороны? (то есть от пикоом до тераом ) Если ряд не очень длинный, то, вероятно, имеет смысл дополнить его наборами всех "пар резисторов" (троек, четверок и т.д.) А потом уже натравить ваш "жадный" алгоритм.
А какой интерес? Академический? Или практчиеский? Если практический, то плясать надо от: 1) Числа резисторов -> чем меньше, тем лучше 2) Наличия резисторов -> Давно замечено, что всегда не хватает резисторов 1К, 4К7, 10К и т.д., но полно всяких 1К2, 6К2 и т.д. 3) Точности -> Зачем мне подбирать на пуллап связку резисторов 5245Ом, если я могу воткнуть любой в диапазоне 2К-10К???
Шкала логарифмическая (приблизительно). То есть, грубо, можно подбирать значения "слева направо". Полный перебор - это алгоритм с отсечениями в небольшом диапазоне (перебор от Rx/2 до Rx - для ряда E24 это "всего" 7 или 8 значений). Надо покумекать...
короче обычный bsf поиск всегда найдет оптимальное решение с точки зрения и точности и количества резисторов.
Добавлено спустя 1 час 37 секунд: Без эвристики на больших значениях время поиска стремилось к бесконечности. Приделал простенькую эвристику, которая сперва проверяла резисторы, максимально близкие к искомому значению. Считает почти мгновенно:
по количеству резисторов. 1 резистор = 1 единица стоимости. Конечно, можно задать стоимость резисторам (например, соответствующую реальной стоимости или величине, обратной количеству имеющихся резисторов конкретного номинала) Все это лишь усложнит задачу с точки зрения выработки функции оценки