powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм поиска суммы
25 сообщений из 117, страница 1 из 5
Алгоритм поиска суммы
    #36676692
admiral.diver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемые, прошу подсказки в следующем вопросе. Тема жизненная. Есть спутниковая антена, к ней мотор. Хочу запрограммировать алгорит поворота антены к спутнику, но поиски пока не увенчались успехом.

Описание задачи:
Есть к примеру четыре константных шага мотора: 0.2 0.7 1.3 2.6
Есть длинна пути равная: 86

Задача: найти сумму шагов мотора, которая максимально бы приближалась к заданной.

Пример: 2.6 + 2.6 + 2.6 .... + 1.3 = 86

З.Ы.

Комбинация чисел может быть любой.
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36676711
Альмалексия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
admiral.diver,

в голову приходит только деление на цело.

Попробуй общую сумму разделить на больший. Остаток на более меньший шаг. Тут будут погрешности, но они зависемы от шага.

Более точный ответ, я думаю, только перебором можно определить.

А нельзя найти наименьший шаг прирощения и оперировать им?
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36676752
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это шутко, да? Ну возьми 430 шагов по 0.2 или 43 шага по 0.7 и 43 шага по 1.3.

Вообще задача имеет счётное число решений. Любая комбинация четырёх натуральных чисел n1, n2, n3, n4 такая что

0 < 86 / (sqrt(0.2^2 + 0.7^2 + 1.3^2 + 2.6^2)*sqrt(n1^2 + n2^2 + n3^2 + n4^2)) < 1

должна быть решением.
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36676761
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Жара, моск плавится. Предыдущий мой пассаж - в игнор.
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36676762
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В подобного рода задачах ставят цели несколько отличные от алгоритмических. К примеру - минимизировать износ двигателя.
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36676779
mikhail_n
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Воопщем вот те две крайности:

максимальное количество шагов - 430 по 0.2
минимальное количество шагов - 33 по 2.6, 1 по 1.3, 1 по 0.7

между этими двумя вариантами - ещё туева хуча. Тебе все штоль нужны?
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36676802
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Задача описана - максимизировать точность приближения.

Но кажется, что это развод на зачетную задачу =)
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36676809
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это не инженерная постановка. Ибо несеръёзно всё. Лучше-бы
её описывать в алгоритмических традициях. Типа там.. "Knapsack
problems", "Translocation of masses" e.t.c.
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36676829
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

не забываем про задачу о ранце :).
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36677752
admiral.diver
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mozokmayton,

не забываем про задачу о ранце :).

Очень интересный вариант решения. Посижу после работы над ним. Возможно это то что мне нужно.

Собственно начальные данные представлены образно. В действительности шаг мотора описывается числом с точностью до тысячных (т.е. три знака после запятой). Почему они так сделали - хз. Задача действиетльно реальна. Если кому не вериться, могу предоставить доку по РЕСИВЕРУ. Погрешность перемешения устроит с точностью до сотых или хотя бы до десятых.

Спасибо всем, кто подкинул идей. Может что еще подскажите, буду признателен.
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36677946
Альмалексия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mozok,

А вот я забыл =) Действительно, это именно то, что нужно.
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36678015
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
АльмалексияMozok,

А вот я забыл =) Действительно, это именно то, что нужно.

имхо, деление нацело оптимальней.
ведь тебе не количество способов нужно, а один (и неужели самый оптимальный?)
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36678226
Valer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если можно менять направление движения ( вращения ),
то алгоритм с рюкзком не подходит
например 0.5 = 0.7 - 0.2

+и что понимается под максимальным приближением ?
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36678266
rstudio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
реализовывал такое точь в точь.
Рекурсивно решай, строчек десять кода ...
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36678416
rstudio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
Imports System.Collections.Generic

Public Class Form1

    Dim max As Integer =  10 
    Dim count As Integer
    Dim page_up As Integer =  1 
    Dim page_down As Integer =  2 

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim list As New List(Of Double)
        list.Add( 0 . 1 )
        list.Add( 0 . 9 )
        list.Add( 0 . 3 )
        list.Add( 0 . 5 )
        list.Add( 0 . 8 )
        list.Add( 0 . 5 )
        list.Add( 0 . 6 )

        Dim way As New List(Of Double)
        Me.Find(list, way,  0 ,  1 . 8 )


    End Sub

    Private Function Find(ByRef valueList As List(Of Double), _
                          ByRef wayList As List(Of Double), _
                          ByVal currValue As Double, _
                          ByVal targetValue As Double) As Boolean

        For Each value As Double In valueList
            currValue += value

            'save way list
            wayList.Add(value)

            Dim ret As Boolean
            If (currValue = targetValue) Then
                ret = True
            Else
                'not used values
                Dim newList As New List(Of Double)
                newList.AddRange(valueList)
                newList.Remove(value)

                ret = Me.Find(newList, wayList, currValue, targetValue)
            End If

            If ret Then
                Return True
            Else
                wayList.RemoveAt(wayList.Count -  1 )
            End If
        Next

        Return False
    End Function

End Class
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36678479
rstudio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не вчитался в условия задачи, вот код попроще

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim list As New List(Of Decimal)

        list.Add( 0 . 2 )
        list.Add( 0 . 7 )
        list.Add( 1 . 3 )
        list.Add( 2 . 6 )
        
        Dim way As New List(Of Decimal)
        Me.Find(list, way,  0 ,  10 )


    End Sub

    Private Function Find(ByRef valueList As List(Of Decimal), _
                          ByRef wayList As List(Of Decimal), _
                          ByVal currValue As Decimal, _
                          ByVal targetValue As Decimal) As Boolean

        For Each value As Decimal In valueList
            currValue += value

            'save way list
            wayList.Add(value)

            Dim ret As Boolean
            If (currValue = targetValue) Then
                ret = True
            Else
                ret = Me.Find(valueList, wayList, currValue, targetValue)
            End If

            If ret Then
                Return True
            Else
                wayList.RemoveAt(wayList.Count -  1 )
            End If
        Next

        Return False
    End Function
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36678526
rstudio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И еще немного эвристики.
Отсортировать в обратном порядке. Это гарантия что в первую очередь будут использоваться самые большие шаги и дальше, если не будут найдены подходящие комбинации, меньшие шаги.

list.Add(2.6)
list.Add(1.3)
list.Add(0.7)
list.Add(0.2)
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36678549
rstudio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Окончательный вариант

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim list As New List(Of Decimal)

        list.Add( 2 . 6 )
        list.Add( 1 . 3 )
        list.Add( 0 . 7 )
        list.Add( 0 . 2 )

        Dim way As New List(Of Decimal)
        Me.Find(list, way,  0 ,  86 )


    End Sub

    Private Function Find(ByRef valueList As List(Of Decimal), _
                          ByRef wayList As List(Of Decimal), _
                          ByVal currValue As Decimal, _
                          ByVal targetValue As Decimal) As Boolean

        For Each value As Decimal In valueList
            currValue += value

            'save way list
            wayList.Add(value)

            Dim ret As Boolean
            If (currValue = targetValue) Then
                ret = True
            ElseIf currValue > targetValue Then
                ret = False
            Else
                ret = Me.Find(valueList, wayList, currValue, targetValue)
            End If

            If ret Then
                Return True
            Else
                wayList.RemoveAt(wayList.Count -  1 )
            End If
        Next

        Return False
    End Function
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36678961
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CL>
(defconstant stepLength (list 0.2 0.7 1.3 2.6 -0.2 -0.7 -1.3 -2.6))

STEPLENGTH

>
(defun dist (x y)
(declare (short-float x y))
(abs (- x y))
)

DIST

>
(defun doStep (curLength)
(declare (short-float curLength))
(loop with maxStep = (find-if #'(lambda (x) (= (dist curLength x) (apply #'min (mapcar #'(lambda (x) (dist curLength x)) stepLength)))) stepLength)
return (if (> (abs (- curLength maxStep)) (abs curLength))
curLength
;else
(doStep (- curLength (print maxStep)))
)
)
)

DOSTEP

>(dostep 46)

2.6000000000000001
2.6000000000000001
2.6000000000000001
2.6000000000000001
2.6000000000000001
2.6000000000000001
2.6000000000000001
2.6000000000000001
2.6000000000000001
2.6000000000000001
2.6000000000000001
2.6000000000000001
2.6000000000000001
2.6000000000000001
2.6000000000000001
2.6000000000000001
2.6000000000000001
1.3
0.69999999999999996
-0.20000000000000001
-1.3933298959045715E-14
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36679059
rstudio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код пади подлинее чем на визуал васике
так "навищо платыты бильше"(с)
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36679069
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rstudio,

чем измеряли :)?
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36679091
rstudio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
визуально :)
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36679093
rstudio
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если на шарпе переписать можно и побайтно :)
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36679115
Mozok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rstudio,

загони код в Ворд и посчитай символы.
...
Рейтинг: 0 / 0
Алгоритм поиска суммы
    #36679157
Альмалексия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mozok,

Долго мериться будите?
...
Рейтинг: 0 / 0
25 сообщений из 117, страница 1 из 5
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм поиска суммы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]