Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2010, 17:27   #1
max1m9
 
Регистрация: 13.12.2009
Сообщений: 6
По умолчанию Построение матрицы вариантов раскроя

Здравствуйте!Хотел бы спросить совета хорошо разбирающихся в VBA людей(сам увлекаюсь VBA около года).
Есть следующая задача:
Пусть имеются заготовки длиной L м. Из них нужно нарезать m деталей, длины которых задаются элементами массива Li. Требуется получить матрицу A вариантов раскроя.
У меня получается следующее:
Код:
Построение матрицы вариантов раскроя
Const i0 = 8, j0 = 2 ' Координаты левой верхней ячеки «матрицы»
Dim m As Integer, N As Integer, L As Single
Dim Li() As Single, Ki() As Integer
' Создание одного варианта раскроя
Sub Cre_Var(ByVal k)
Dim Lk, ii
If k >= m Then Exit Sub
Lk = 0 ' Какая общая длина предыдущих вариантов
For ii = 1 To k
Lk = Lk + Ki(ii) * Li(ii)
Next ii
L0 = L - Lk ' Остаток
k = k + 1
Ki(k) = Int(L0 / Li(k)) ' Max количество одной след. детали
Call Cre_Var(k) ' Рекурсивный вызов
End Sub
Sub Matr_Raskr()
Dim Lk, ii
L = Cells(1, 3) ' Длина заготовки
m = Cells(2, 3) ' Количество деталей
ReDim Li(1 To m) As Single ' Описываем массив «длин» деталей
ReDim Ki(1 To m) As Integer ' Описываем массив количества деталей
For i = 1 To m
Li(i) = Cells(4, i + 1) ' Формируем массив «длин» деталей
Next i
N = 0
Ki(1) = Int(L / Li(1)) ' Max количество одной 1-ой детали
For i = 1 To m - 1
Lk = 0
For ii = 1 To i
Lk = Lk + Ki(ii) * Li(ii)
Next ii
Ki(i) = Int(Lk / Li(i)) ' Max количество одной i-той детали
While Ki(i) > 0
N = N + 1
' Очистка одного варианта
For ii = i + 1 To m
Ki(ii) = 0
Next ii
' Создание нового варианта
Call Cre_Var(i)
' Вывод варианта
Call Out_Variant(N, Ki, Li)
' Очистка одного варианта
For ii = 1 To i - 1
Ki(ii) = 0
Next ii
Ki(i) = Ki(i) - 1
Wend
Next i
End Sub
' Вывод варианта
Sub Out_Variant(N, Ki, Li)
Cells(i0 + N - 1, j0 - 1) = N
Ls = 0 ' Общая длина варианта
For j = 1 To m
Cells(i0 + N - 1, j0 + j - 1) = Ki(j)
Ls = Ls + Ki(j) * Li(j)
Next j
Cells(i0 + N - 1, j0 + m + 1) = Ls
End Sub
Проблема состоит в том,что выводиться лишний вариант,при том даже превышающий имеющиеся остатки.
max1m9 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Оптимизация раскроя в Excel Анита Помощь студентам 1 04.05.2010 17:28
Построение матрицы в VBA по заданным параметрам. krmn Помощь студентам 5 24.12.2009 19:26
Построение обратной матрицы lecume Общие вопросы C/C++ 2 18.12.2009 00:06
Алгоритм линейного раскроя (финальный рывок) AXS Общие вопросы Delphi 16 06.02.2009 16:33
обработка вариантов ответа из матрицы Alar Общие вопросы Delphi 0 29.10.2006 11:06