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

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

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

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

З.Ы.

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

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

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

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

А нельзя найти наименьший шаг прирощения и оперировать им?
...
Рейтинг: 0 / 0
08.06.2010, 23:49:23
    #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
09.06.2010, 00:02:44
    #36676761
mikhail_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм поиска суммы
Жара, моск плавится. Предыдущий мой пассаж - в игнор.
...
Рейтинг: 0 / 0
09.06.2010, 00:03:37
    #36676762
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм поиска суммы
В подобного рода задачах ставят цели несколько отличные от алгоритмических. К примеру - минимизировать износ двигателя.
...
Рейтинг: 0 / 0
09.06.2010, 00:14:48
    #36676779
mikhail_n
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм поиска суммы
Воопщем вот те две крайности:

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

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

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

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

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

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

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

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

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

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

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

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

+и что понимается под максимальным приближением ?
...
Рейтинг: 0 / 0
09.06.2010, 14:41:23
    #36678266
rstudio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм поиска суммы
реализовывал такое точь в точь.
Рекурсивно решай, строчек десять кода ...
...
Рейтинг: 0 / 0
09.06.2010, 15:28:40
    #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
09.06.2010, 15:43:58
    #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
09.06.2010, 15:55:36
    #36678526
rstudio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм поиска суммы
И еще немного эвристики.
Отсортировать в обратном порядке. Это гарантия что в первую очередь будут использоваться самые большие шаги и дальше, если не будут найдены подходящие комбинации, меньшие шаги.

list.Add(2.6)
list.Add(1.3)
list.Add(0.7)
list.Add(0.2)
...
Рейтинг: 0 / 0
09.06.2010, 16:04:36
    #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
09.06.2010, 18:23:31
    #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
09.06.2010, 19:08:48
    #36679059
rstudio
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм поиска суммы
код пади подлинее чем на визуал васике
так "навищо платыты бильше"(с)
...
Рейтинг: 0 / 0
09.06.2010, 19:11:22
    #36679069
Mozok
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Алгоритм поиска суммы
rstudio,

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

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

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


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