PDA

Просмотр полной версии : Функция поиска слагаемых под нужную сумму



xaron
13.02.2015, 10:52
Подскажите пожалуйста как загнать в ПЛК150 макрос подбора суммы по слагаемым ?

Option Explicit

Function LongSumEl(arr(), sm As Long, Optional ds As Long = 0)
'Функция поиска слагаемых под нужную сумму используя динамическое программирование
'Автор MCH (Михаил Ч.) - июнь 2013

'сумма ищется по целочисленным слагаемым
'в основу взят алгоритм описанный здесь
'http://forum.sources.ru/index.php?showtopic=204375
'Если сумма существует, то она будет найдена

'на входе:
'arr() - одномерный массив с исходными данными
'sm - искомая сумма
'ds - погрешность поиска

'на выходе одномерный массив с результатом, либо значение достигнутой точности

Dim out&(), i&, j&, k&, n&, l&, sm1&

n = sm + ds '
sm1 = sm - ds

If n > 80000000 Or n < 0 Then Exit Function
ReDim a&(n)

For i = 1 To n: a(i) = -1: Next i
For i = 1 To UBound(arr)
For j = n - arr(i) To 0 Step -1
If a(j) >= 0 Then
k = j + arr(i)
If a(k) = -1 Then a(k) = j
If k >= sm1 Then
Do
l = l + 1
ReDim Preserve out&(1 To l)
out(l) = k - a(k)
k = a(k)
Loop While k
LongSumEl = out
Exit Function
End If
End If
Next j, i
For i = sm To 1 Step -1
If a(i) >= 0 Then Exit For
Next i
LongSumEl = sm - i
End Function

И вообще это реально или нет ?

Вольд
13.02.2015, 20:06
Оформи свои дела в виде функционального блока (FB), программу пиши на ST.

Валенок
13.02.2015, 22:47
.. и беги, лола, беги от своры злых сторожевых собак )))

xaron
14.02.2015, 11:16
В ST к сожалению не силён......
Думаю сделать передачу массива из 20 элементов в Скаду. Там можно в скрипте всё общитать и вернуть результат в контроллер. Но что то очень громоздко с компьютером получается. Подскажите в какую сторону думать !!!

xaron
14.02.2015, 11:59
.. и беги, лола, беги от своры злых сторожевых собак )))

А причём тут вачдог ? Вроде бы обычная математика.....контроллер должен успеть обработать.

Валенок
14.02.2015, 14:28
....контроллер должен успеть обработать.
..(..sm:=79999998,ds:=1..);
Ключевые слова должен успеть


PS
Но как перевозчика в вечность - видимо это не беспокоит..

xaron
16.02.2015, 09:40
..(..sm:=79999998,ds:=1..);
Ключевые слова должен успеть


PS
Но как перевозчика в вечность - видимо это не беспокоит..

У Вас есть какое то рациональное предложение ?

Вольд
16.02.2015, 11:36
У Вас есть какое то рациональное предложение ?
ПЛК - это не ПК. В программах для ПЛК длинные циклы не приветствуются. Зачем вообще решать эту задачу на ПЛК ?

xaron
16.02.2015, 12:33
ПЛК - это не ПК. В программах для ПЛК длинные циклы не приветствуются. Зачем вообще решать эту задачу на ПЛК ?

Потому что на ПЛК сделан весовой сортировщик. Теперь хочется подбор до нужного веса реализовать (с закольцованным конвейером).
Придётся на ПК прокладку из скады городить (((( Красоты в этом не усматриваю.

Валенок
16.02.2015, 12:52
А Вы можете сами оценить для вызова функции кол-во выполняемых строк (с учетом циклов) для диапазона Ваших задач ?

xaron
16.02.2015, 13:18
А Вы можете сами оценить для вызова функции кол-во выполняемых строк (с учетом циклов) для диапазона Ваших задач ?

Эксель показывает от 600 000 до 1 500 000 возможных комбинаций. Как это в циклы и строки коррелировать ?

Yegor
16.02.2015, 13:30
Назовите для начала диапазоны и погрешности возможных и допустимых масс (индивидуальных пакетов и суммы), а также размеры типичного набора. Как быстро и как часто задачу необходимо решать?

xaron
16.02.2015, 13:48
Назовите для начала диапазоны и погрешности возможных и допустимых масс (индивидуальных пакетов и суммы), а также размеры типичного набора. Как быстро и как часто задачу необходимо решать?

314.322.392.322.319.338.322.375.406.337.321.320.33 6.297.360.338.322.367.334.288.319.327.320.292.367. 368.341.405.256

Реально взвешенные значения.
Допустимая погрешность +- 10 гр.
Подбор до суммы 1000 гр.
Скорость подсчёта менее 2 сек.
Решение каждые 20 сек.

В вложении калькулятор.

kolyan
20.08.2015, 19:46
Назовите для начала диапазоны и погрешности возможных и допустимых масс (индивидуальных пакетов и суммы), а также размеры типичного набора. Как быстро и как часто задачу необходимо решать?

У меня схожая задача.
Есть весы с 12-ю платформами. На них ложатся тушки куриц-бройлеров.
Каждая платформа имеет подсветку.
На дисплее задается необходимый вес и допустимое отклонение.
Весы подсвечивают те платформы, сумма весов которых максимально приближена к заданной с учётом заданного отклонения.
Вот интересно бы код на ST увидеть...
Может, есть у кого?

Валенок
20.08.2015, 22:23
В лоб тупой перебор на поиск ближайшего на целых числах.
Самый сложный случай в нуль-отклонение - 200..250мс.