0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 9
1

Сложная задача

22.11.2019, 05:31. Показов 679. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. Есть такая задача, которую никак не могу решить: товары отгружаются дистрибьюторам (A-G) каждый день. Данные, которые есть в таблице, как-то формируются(не пояснили как), но они не устраивают, поэтому нужно написать код на изменение данных, но есть некоторые условия. Нужно сделать так, чтобы по дням более менее равномерно шла отгрузка. Значения в ячейках целостно. То есть, допустим, если рассмотреть дистрибьютора F, то можно переместить товар во второй день, станет столбец (0 18 0 0 0 0 0), либо в третий день, станет (0 10 8 0 0 0 0), либо вообще - (0 0 0 0 0 8 10), и так далее. Сумма по столбцам остаётся неизменна, конечно же.
Есть понимание, что нужно найти среднее в день, и потом смотреть отклонения от него, и считать их сумму по модулю, чтобы как раз-таки её минимизировать.
И вот возникает вопрос: будет необходимо сделать множество итераций, так как количество вариантов перестановок огромно, или всё-таки можно это сделать с помощью рекурсии? И как это сделать?
Наверно не совсем доходчиво объяснила, но если у кого-то хоть какие-то идеи будут, пишите, задавайте вопросы, всё поясню.
Спасибо.
Вложения
Тип файла: xlsx Пример.xlsx (9.0 Кб, 7 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2019, 05:31
Ответы с готовыми решениями:

супер сложная задача
Учусь на финансовом , по информатике задали такую вот задачу на зачет , искал в гугле но нечего...

Сложная задача Ексель
Цех выпускает детали А и В. На производство детали А рабочий тратит 10 часов, на производство...

Сложная формула
Здравствуйте! Помогите пожалуйста составить формулу. Имеется отсортированный по убыванию любой...

сложная формула
Ребята, помогите с формулой, пожалуйста, нужно для рвсчета зп. подробности во вложени. заранее...

10
209 / 184 / 43
Регистрация: 02.08.2019
Сообщений: 586
Записей в блоге: 23
22.11.2019, 08:30 2
зайка007, привет мне кажется рекурсия не нужна
можно сделать такой алгоритм
1) считаем кол-во дней
2) сумма по всем дистрибьюторам
3) среднее находим на 1-н сумма по всем дистрибьюторам/считаем кол-во дней
4) рскидываем макросом по дистрибьюторам что бы в строчке не было блошь среднего и с учетом суммы по каждому дистр
как то так)
1
5965 / 3169 / 706
Регистрация: 23.11.2010
Сообщений: 10,577
22.11.2019, 09:05 3
Цитата Сообщение от зайка007 Посмотреть сообщение
как-то формируются(не пояснили как), но они не устраивают,
это практическая задача или учебная?
По таблице получается, что надо поработать хорошо один день, немного во второй, а потом рейс в день и курить бамбук...
1
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 9
22.11.2019, 09:23  [ТС] 4
Fairuza, практическая задача. Да, по таблице так и есть. Но почему-то начальство хочет, чтобы было более равномерное распределение.
0
5965 / 3169 / 706
Регистрация: 23.11.2010
Сообщений: 10,577
22.11.2019, 09:30 5
зайка007, тогда возникает ряд вопросов.
Сколько машин развозит, расстояние до каждого дистрибьютора, может ли заезжать одна машина в несколько адресов, сколько груза берет одна машина. Сколько груза можно отгружать каждый день (мин/макс)
И, главное, что конкретно надо минимизировать?
1
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 9
22.11.2019, 09:39  [ТС] 6
Fairuza, хорошие вопросы)
Задача была поставлена так, как я её описала. Предоставляя данные, начальство посчитало, видимо, что этого будет достаточно.
На сколько известно, дело не в минимизации затрат, а именно в равномерном (относительно) распределении по дням, не изменяя значения (ну то, что я описывала выше) перенося их, либо суммируя.
0
5965 / 3169 / 706
Регистрация: 23.11.2010
Сообщений: 10,577
22.11.2019, 09:51 7
зайка007, в таком случае предлагаю два варианта.
Или попросить начальство конкретизировать хотелки, или воспользоваться советом art1289, а потом сказать "я художник, я так вижу")))
1
209 / 184 / 43
Регистрация: 02.08.2019
Сообщений: 586
Записей в блоге: 23
22.11.2019, 12:32 8
зайка007, Решил сложную задачу)))

код:
Visual Basic
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
60
61
62
63
64
65
Sub AddSred()
    Dim ListObj As ListObject
    Dim lCountDay As Long, lSumm As Long
    Dim dSred  As Double
    Dim Matrica As Variant
    Dim NewMatrica() As Variant
    Dim ArrRow() As Integer
    Dim SummDistr() As Integer
    Dim i As Integer, j As Integer, iCount
    Dim flag   As Boolean
    Set ListObj = ActiveWorkbook.Worksheets(A_Const.SH_MAIN).ListObjects(A_Const.TB_MAIN)
    With ListObj
        Matrica = .DataBodyRange.Range(Cells(1, 2), Cells(.DataBodyRange.Rows.Count, .DataBodyRange.Columns.Count)).Value2
        lCountDay = UBound(Matrica)
        lSumm = WorksheetFunction.Sum(Matrica)
        dSred = lSumm / lCountDay
 
        For i = 2 To .DataBodyRange.Columns.Count
            ReDim Preserve SummDistr(1 To i - 1)
            SummDistr(i - 1) = WorksheetFunction.Sum(.ListColumns(i).DataBodyRange)
        Next i
    End With
 
    For i = 1 To lCountDay
        flag = True
        iCount = 0
        For j = 1 To UBound(SummDistr)
            ReDim Preserve ArrRow(1 To j)
            If SummDistr(j) > Fix(dSred) Then
                If flag Then
                    ArrRow(j) = Fix(dSred) - iCount
                    SummDistr(j) = SummDistr(j) - ArrRow(j)
                    flag = False
                Else
                    ArrRow(j) = 0
                End If
            Else
                If flag Then
                    If i = lCountDay And j = UBound(SummDistr) Then
                        'последний элемент
                        ArrRow(j) = SummDistr(j)
                    Else
                        iCount = iCount + SummDistr(j)
                        If iCount > Fix(dSred) Then
                            ArrRow(j) = SummDistr(j) - (iCount - Fix(dSred))
                            SummDistr(j) = iCount - Fix(dSred)
                            flag = False
                        Else
                            ArrRow(j) = SummDistr(j)
                            SummDistr(j) = 0
                        End If
                    End If
                Else
                    ArrRow(j) = 0
                End If
            End If
        Next j
        ReDim Preserve NewMatrica(1 To i)
        NewMatrica(i) = ArrRow
        ReDim ArrRow(1 To 1)
    Next i
 
    Range(Cells(19, 2), Cells(19 + 7, 1 + 7)).Value = WorksheetFunction.Transpose(WorksheetFunction.Transpose(NewMatrica))
    Call MsgBox("Распределение выполнено!", vbInformation, "Расчет:")
End Sub
Надстройка: Macro Tools VBA – инструменты разработки макросов VBATools

Добавлено через 7 минут
эту строчку не делал универсально так как это не главное
Visual Basic
1
Range(Cells(19, 2), Cells(19 + 7, 1 + 7)).Value = WorksheetFunction.Transpose(WorksheetFunction.Transpose(NewMatrica))
1
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 9
22.11.2019, 13:20  [ТС] 9
art1289, скину тут
Вложения
Тип файла: xlsx Задача на распределение объемов отгрузки.xlsx (27.3 Кб, 8 просмотров)
0
2658 / 1657 / 754
Регистрация: 23.03.2015
Сообщений: 5,214
22.11.2019, 13:26 10
зайка007,

А вы на 2-х фронтах.... работаете....
Цикл в цикле или рекурсия
0
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 9
22.11.2019, 13:28  [ТС] 11
Narimanych, приходится) потому что не знаю, к чему именно это задача относится.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.11.2019, 13:28
Помогаю со студенческими работами здесь

Сложная фильтрация
Добрый день! Есть два столбца, по которым я ищу совпадения с помощью ВПР. После этого мне...

Сложная формула
Помогите пожалуйста . Нужна таблица для просчета стоимости заказа. И вот нужно просчитать сколько...

Сложная перенумерация
Здравствуйте! Задача перенумеровать ячейки с определенным порядком. Объяснить порядок сложно....

Сложная формула массива
Приветствую. Очень непростая (для меня) задачка. В файле всё наглядно изложено. Спасибо.


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru