Выбрать дату в календареВыбрать дату в календаре

Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 131 След.
Задача о Ранцах, Нужна консультация по возможностям алгоритмов раскроя материала.
 
Не знаю, актуальна ли еще задача или нет?
Для решения можно использовать линейное программирование, по исходному описанию 10A + 10Б рюкзаков по 5 отделений глубиной 50/60 см и шириной 10/15/20 см - не очень большая вариативность, можно перебрать все возможные комбинации, свести задачу к построению целочисленной линейной модели с правильным указанием целевой функции и решить задачу симплекс-методом.
Теорема Ферма, Доказательство Теоремы Ферма
 
Цитата
MCH написал:
ничего дополнительно не подключали?
в Python целочисленная арифметика по умолчанию - длинная.
Все целочисленные операции: +, -, *, // (целочисленное деление), ** (степень), % (остаток от деления) - производятся с длинными числами, не ограниченными по количеству знаков, ничего подключать не нужно.

Обычно длинка работает достаточно быстро, т.к. реализована на C++, сравнивал с вычислениями на dotNet (в частности PascalABC.NET), Python большие числа Фибоначчи рассчитал значительно быстрее, чем BigInteger в PascalABC
Теорема Ферма, Доказательство Теоремы Ферма
 
Ну и проверка данной "шутки" в Python:
Код
print(24576 ** 4 + 48767 ** 4 - 49535 ** 4)

результат:3072
Теорема Ферма, Доказательство Теоремы Ферма
 
Решение на Python в пару строчек:
Код
a, b, c, n = 3987, 4365, 4472, 12
print(f'a^n: {a**n}', f'b^n: {b**n}', f'c^n: {c**n}', f'a^n + b^n: {a**n + b**n}', f'a^n + b^n - c^n: {a**n + b**n - c**n}', sep='\n')

Результат:
Код
a^n: 16134474609751291283496491970515151715346481
b^n: 47842181739947321332739738982639336181640625
c^n: 63976656348486725806862358322168575784124416
a^n + b^n: 63976656349698612616236230953154487896987106
a^n + b^n - c^n: 1211886809373872630985912112862690
Изменено: MCH - 13.11.2023 13:11:12
Alisa GPT пишет свой первый макрос
 
Цитата
Бахтиёр написал:
видать намного умнее чем Алиса
Задал идентичный вопрос Алисе, получил точно такой же ответ, возможно Алиса переспрашивает у Chat GPT
Скрытый текст
Преобразование числа в буквы и обратно, Convert number to letters and back
 
А если сразу генерировать буквенно-цифровую строку из 10  символов, должно быть быстрее, а уникальность определяется огромным числом вариантов (но не гарантируется), если нужно, то можно обратно в число преобразовать
Равномерно распределить массив чисел
 
678, 804, 133, 114, остальное единицы - расчет зависает
Вычисление больших чисел
 
В зависимости от задач можно предложить:
1. Написать собственную UDF на VBA для расчета больших чисел
2. Использовать сторонние библиотеки, которые позволяют вычислять в Excel
https://www.cyberforum.ru/blogs/829006/blog5196.html
https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=102871

3. Другой язык программирования с реализованной длинной арифметикой (Python, Java, C# и др.)
Изменено: MCH - 29.06.2023 12:18:36
Как рассчитать N-раз от даты и дня недели по определенным дням, отсчет от даты по конкретным дням
 
Цитата
koshak_pp написал:
формула перестаёт работать,
Формула массива вводится нажатием Ctrl+Shift+Enter
Как рассчитать N-раз от даты и дня недели по определенным дням, отсчет от даты по конкретным дням
 
Цитата
Сергей написал:
Соотв если менять кол-ва посещений и дату первой оплаты все предложенные формулы могут привести к разным результатам
Вы мою формулу из 6го сообщения смотрели, она достаточно универсальна, выходные и рабочие дни задаются строкой "0101000", где 0 - выходной, 1 - рабочий день.
Будут другие условия, формулу легко поправить.
Формула должна корректно вычислять любой график работы в горизонте ближайших - 98 дней (можно исправить на нужный)

И да, формула медленная и постоянна пересчитывается, что дает свои ограничения, по сравнению с математическими формулами.
Изменено: MCH - 21.06.2023 16:36:19
Как рассчитать N-раз от даты и дня недели по определенным дням, отсчет от даты по конкретным дням
 
Вариант, формула массива
Равномерно распределить массив чисел
 
Jack Famous, алгоритм зависит от задачи
Если слагаемых мало - даже перебор подойдет
Если искомая сумма небольшая - динамическое программирование
Если нет жесткого требования к оптимальности результата - жадный алгоритмы с частичными переборами с оптимизациями и отсечениями неперспективных ветвей решения используя эвристики
Можно линейное программирование прикрутить

Код Игоря считает быстро, когда решение точно есть, я пока не разобрался в алгоритме
Равномерно распределить массив чисел
 
Цитата
MCH написал:
поизучаю алгоритм
Пока с алгоритмом до конца не разобрался
Вижу перебор но с отсечением (как бы используем метод ветвей и границ), как только находим результат, останавливаем решение
Возможно ошибаюсь

Если поменять тип переменных с Variant на Long и Double, то можно еще немного ускорить
Что заметил, если точного решения нет (если нельзя ровно разделить на два равных по сумме списка) то расчет уходит в долгую
Например, первое число 999, второе число 1001 и далее 198 двоек
Разделить данный список на два равных по сумме невозможно, можно в одном списке 999 + 99*2, в другом 1001 + 99 *2 (или 999 + 100*2 и 1001 + 98*2), что динамикой решается очень быстро
Изменено: MCH - 16.06.2023 11:01:02
Равномерно распределить массив чисел
 
Ігор Гончаренко, Время работы впечатляет, поизучаю алгоритм
Равномерно распределить массив чисел
 
Цитата
Alien Sphinx написал:
Отработал на 20 числах. Тестировал и 30, но ушел в ошибку run out of memory
Протестировал свой код на 200 чисел (код не менял, добавил случайные данные), общая сумма для поиска - 13 млн, отработал не очень быстро но за разумное время.
Скорость решения и выделяемая память больше зависит от величины искомой суммы, и линейно зависит от количества слагаемых
Сложность алгоритма O(s * n), где s - искомая сумма, n - количество слагаемых, выделяемая память O(s)
Изменено: MCH - 15.06.2023 17:00:35
Равномерно распределить массив чисел
 
Сведение задачи к решению к "Задачи сумма подмножеств"
В первый список помещаем все слагаемые которые дают сумму не более половины общей суммы, во второй список - все остальные слагаемые

На базе решения динамическим программированием:
Количество слагаемых может быть большим (несколько сотен - легко)
Может работать с суммами с копейками
Для каждого слагаемого указывается количество данных слагаемых

Суммы распределяет максимально равномерно, если это возможно, но по количеству слагаемых списки могут различаться и не быть равномерными
Если нужно и количество слагаемых распределить примерно поровну, то можно реализовать другой алгоритм
Изменено: MCH - 15.06.2023 15:18:40
Комбинаторика: составить уникальные комбинации элементов массива
 
Нужны все перестановки:
9 5 2
9 2 5
5 9 2
5 2 9
2 9 5
2 5 9
или что-то другое?
VBA. Распределение паллет
 
Пришлите на почту из профиля или выложите здесь пример исходных данных
Озвучьте бюджет проекта.

На вскидку обычный рюкзак с двумя ограничениями (по весу и по кол-ву), возможно подойдет решение задачи "сумма подмножеств" и ее вариации. Алгоритмы аналогичные как в "задаче упаковки в контейнеры" (Bin packing problem) / "задача раскроя" (Cutting stock problem)
В зависимости от исходных данных и их кол-ва можно будет решить оптимально с помощью линейного программирования.
Изменено: MCH - 08.06.2023 09:09:24
Расположение товара на паллете, Зная длину и ширину оптимально разместить товар на паллете
 
В рамках текущего набора данных можно распределить все товары на 6 паллет
При этом паллеты будут высотой от 1500 до 1650 мм
Монопаллет (с одним товаром) будет только один
Остальные можно распределить - не более трех различных товаров на паллете
в двух - трех паллетах верхний ряд будет сборный

На сколько является важным потратить много времени на расчет укладки  и уложить товар на 6 паллет или допустимо раскидать по быстрому весь товар на 7 паллет, где будет 2 или 3 монопаллета, остальное распределено жадным алгоритмом без явной оптимизации?
Расположение товара на паллете, Зная длину и ширину оптимально разместить товар на паллете
 
Исходя из информации из предыдущего сообщения, то указанный объем можно разместить на 6ти паллетах 800х1200х1650
Для этого нужно еще ограничения: сколько разных товаров может быть на паллете (скорее всего предпочтительно один товар на паллете и минимизация сборных паллет)
В теории, если сложить все объемы товаров и разделить на максимальный объем паллета (800х1200х1650) то получается 4,999... паллет, т.е. в 5 паллет точно не поместится, т.к. при укладке есть потери пространства.
Изменено: MCH - 30.05.2023 17:32:37
Расположение товара на паллете, Зная длину и ширину оптимально разместить товар на паллете
 
Задача укладка на паллет относится к 3D укаладке и в общем случае достаточно сложная. можно ее упростить и решать задачу 2D укладки каждого товара по слоям
Можно использовать следующий алгоритм:
1. объединяем схожие размеры товаров
2. раскладываем каждый вид товара на паллет в один слой, для этого используем 2D раскладку с возможностью вращения коробок (см. вложение)
3. раскладываем полученные карты раскладки на целые палеты с учетом ограничения по высоте паллета, при этом можно объединять разные слои товаров, если это приводит к уменьшению количества целых паллет. Возможно нужно еще вводить ограничение по весу паллета, т.к. он обычно регламентируется.
4. то что не влезает в паллет размещаем на сборных паллетах, либо в ручную либо частично автоматизируем процесс.

Пример 2D укладки во вложении.
Если задачи разовые, то можно использовать данный калькулятор как помощник для определения оптимальной укладки коробок по слоям, если задача регулярная и объемная, то нужно реализовывать нормальный алгоритм раскладки. На первом этапе может подойти даже жадный алгоритм, далее нужно применить генерацию оптимальных схем раскладки и с помощью линейного программирования (симплекс метода) определять минимальное кол-во паллет.
Подгонка до нужного числа
 
Дополнил решение, сделал второй вариант (изменение кол-ва):
1. Пропорционально меняем количество под нужную сумму
2. Цены не меняем (округляем до нужной точности)
3. Подгоняем цены, меняя некоторые позиции в ценах (+/- несколько копеек)
Подгонка до нужного числа
 
Решение отсюда: https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=message&FID=1&TID=142792
Меняйте значение в D2 и смотрите результат
Изменено: MCH - 22.05.2023 08:23:38
Получить все бинарные числа для заданного количества знаков, Get Binary values for target LenNum
 
Цитата
Jack Famous написал:
только непонятно, как это делать
Пример разложения числа на биты через остаток от деления на 2
Генерируем 10 случайных чисел от 0 до 65535 с выводом их битов

Код
Function get_bits(ByVal n As Long, nums As Long) As Long()
    Dim i As Long
    Dim out_array() As Long
    ReDim out_array(nums - 1) As Long
    While n > 0 And i < nums
        out_array(i) = n Mod 2
        n = n \ 2
        i = i + 1
    Wend
    get_bits = out_array()
End Function

Sub print_array(a() As Long)
    Dim x As Variant
    For Each x In a
        Debug.Print x;
    Next x
    Debug.Print
End Sub

Sub test()
    Dim a() As Long, n As Long, i As Long
    For i = 1 To 10
        n = Int(Rnd * 256 * 256)
        a = get_bits(n, 16)
        Debug.Print n,
        print_array a()
    Next i
End Sub


Биты числа в обратном порядке при выводе, нумерация битов в массиве от 0 до nums-1

То что я имел в виду:
разложение целого числа на биты по затратам сопоставимо с разложением десятичного числа на разряды, где каждая цифра может быть либо 0 либо 1, при этом охватываемый диапазон числе с побитным представлением для типа Long - 31 бит
Получить все бинарные числа для заданного количества знаков, Get Binary values for target LenNum
 
Цитата
Ігор Гончаренко написал:
потом чтобы этими ноликами/единичками воспользоваться - нужно каждое значение снова разобрать на 0 / 1в общем - такая себе идея с сомнительным итоговым результатом
Думаю, что по скорости десятки разбирать (при делении на 10), что биты (при делении на 2) будет сопоставимо, только зачем в итоге разделять на десятки, когда можно с битами работать?

самый простой способ получить все варианты с битами: for i = 1 to 2 ^ d - 1
Ограничение для типа Long - 31 бит, это 2 млрд. комбинаций (их еще и перебрать нужно)
Разделение числа на биты аналогично разделению десятичного числа состоящего из цифр 1 и 0 на разряды, а может и быстрее
Изменено: MCH - 12.05.2023 14:58:24
Получить все бинарные числа для заданного количества знаков, Get Binary values for target LenNum
 
Поправил процедуру Игоря, скорость не измерял
Код
Sub Digist01(a() As Double, d As Long)
    Dim i As Long, j As Long, k As Long, t As Long
    ReDim a(2 ^ d - 1) As Double
    i = 1
    k = 1
    
    For t = 1 To d
        For j = 0 To i - 1
            a(i + j) = k + a(j)
        Next j
        i = i * 2
        k = k * 10
    Next t
End Sub
Оптимальный распил досок с наименьшим количеством обрезков.
 
Цитата
александр Ишора написал:
странно, почему Вы не выложили веб версию
Для этого нужно стать Fullstack-разработчиком, возможно это следующий этап моего развития
Для себя вижу связку Python + Django (Backend) и React (Frontend)
Вопрос в мотивации, для чего это мне нужно?
Оптимальный распил досок с наименьшим количеством обрезков.
 
Цитата
александр Ишора написал:
Нашел на просторах вот такой Файл эксель,  
Чем не устраивает решение? Особенно для "дачников" оно хорошо подойдет
Если качество раскроя не устраивает, то можно решить и бесплатной реализацией из ссылки, которую предоставили выше
Пример раскроя во вложении на основе данных из первого поста, исходный рабочий файл можно скачать на excelworld


Цитата
александр Ишора написал:
Вот скажите, такой файл было трудно сделать?
В Вашем файле код VBA открыт, зайдите в редактор VBA и посмотрите, на сколько трудоемко было сделать


PS: Где взяли файл? (Файл не имеет защиты кода VBA, а я точно помню, что выкладывал с паролем)
PPS: в демоверсии нет оптимизированных алгоритмов расчета, поэтому может считать медленно или не очень качественно.
Изменено: MCH - 11.05.2023 11:56:46
Рассчитать % премии по заданной шкале
 
Добавлю свой вариант:
Код
=ЕСЛИ(A2<0,85;0;ЕСЛИ(A2<1;ПРЕДСКАЗ(A2;{0,5:1};{0,85:1});МИН(ПРЕДСКАЗ(A2;{1:1,5};{1:1,1});1,5)))
Получить все бинарные числа для заданного количества знаков, Get Binary values for target LenNum
 
По алгоритму это похоже на динамическое программирование, когда получаем новые данный на базе уже ранее вычисленных и сохраненных в массиве.
Алгоритм относительно быстрый но требует очень много памяти, например, уже для 30 значений не хватит памяти, а это всего лишь 1млрд комбинаций.
Можно реализовать алгоритм, который вычисляет каждое значение на основе предыдущего состояния (как бы итератор), памяти будет затрачено значительно меньше, но вычисления будут отнимать время.
Страницы: 1 2 3 4 5 6 7 8 9 10 11 ... 131 След.
Наверх