Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/41: Рейтинг темы: голосов - 41, средняя оценка - 4.90
Заблокирован

Выполнение оптимизации на VB6.0 по раскрою

08.09.2015, 21:44. Показов 8879. Ответов 34
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Прошу помощи.

Научите, пожалуйста, бегло решать оптимизационные задачи на раскрой материалов с помощью Visual Basic 6.0

Условия. На рынке имеется неограниченное количество досок, длиной 350 см. Нам нужно подсчитать оптимальную закупочную партию для выполнения заказа, чтобы отходы, оставшиеся обрезки — были минимальные.
По принципу одного дня: купили, распилили и продали. Нет склада, где хранить обрезки — поэтому все остатки вывозятся на свалку, как мусор.
По заказу клиента нужны следующие заготовки:
1) длина заготовки № 1 = 185 см, количество — 127 штук;
2) длина заготовки № 2 = 165 см, количество — 178 штук;
3) длина заготовки № 3 = 143 см, количество — 335 штук;
4) длина заготовки № 4 = 87 см, количество — 526 штуки;
5) длина заготовки № 5 = 26 см, количество — 958 штуки.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.09.2015, 21:44
Ответы с готовыми решениями:

Перебор по раскрою квадрата в Visual Basic 6.0
Здравствуйте! Пожалуйста, помогите составить программу на перебор в Solver Excel. Написать программу для раскроя квадрата на...

Резак для бумаги применительно к раскрою стеклотекстолита
Дикий, может быть даже тупой вопрос: собсно, сабж! Кто-нибудь реально пробовал? Плотность листового текстолита ~160..200 г/м2 (при...

Windows 2000 Rus VB6, VB6 Resource Editor отсутствует
В Windows 2000 Rus + SP3 проинсталлировал Visual Studio 6 + MSDN Full (вся студия на 6 CD-R). В VB6 “Add-In Manager” всего три компонента,...

34
Заблокирован
09.09.2015, 00:55  [ТС]
Вроде бы "детская задача" для компьютера. Искал более 3-х часов аналог кода на любом языке программирования. Тщетно. Пытался сделать упор на ведущие языки. Впустую. Немного призадумался: чему же учат в вузах? Альтернативность сейчас очень актуальная тема.

Google: программа С++ для оптимального раскроя партии досок (труб)
Google: программа Java для оптимального раскроя партии досок (труб)

Трудностей не боюсь. Скачиваю любые программы. Бесполезно.

Например: снимок ниже.
Cutting Line version 2.49. 23 July 2007 ~ 2500 Kb download http://www.cuttinghome.com/Downloade.html
Миниатюры
Выполнение оптимизации на VB6.0 по раскрою  
0
Заблокирован
09.09.2015, 03:18  [ТС]
От досады решил посчитать вручную на калькуляторе, думаю: за 15 минут управлюсь. Засек время.

Решение:
127 досок l=350: 127 * [350 - (185 + 165)] = 0
(178 – 127)= 51 доска l=350: 51 * [350 – (165 + 2*87)] = 561
335/2 = 162(1) доски l=350: 162 * [350 – (2*143 + 2*26)] = 1944
(526 – 2*51)/3 = 141(1) доска l=350: 141 * [350 – (3*87 + 3*26)] = 1551
(958 – 2*162 – 3*141)/13 = 211/13 = 16(3) досок l=350: 16 * [350 – (13*26)] = 192
Покрываем остатки:
1 доска l=350: 1 * [350 – (1*143 + 1*87 + 3*26)]= 42

Потребуется досок l=350: 127 + 51 + 162 + 141 + 16 + 1 = 498 штук
В том числе пойдут на отходы: (0 + 561 + 1944 + 1551 + 192 + 42)/350 = 4290/350 = 12,26 штук
Процент отходов: 12,26/498 * 100% = 2,46 %

Считал чуть меньше часа.
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
09.09.2015, 08:56
Общая длина заготовок: 171440 метров
171440/350 = 489.82 - это минимально необходимое количество досок

А у Вас "Потребуется досок = 498 штук"

Если вычесть отходы 498-12,26 = 487,74

Что-то не сходится. Или я неправильно понял Ваши расчёты?
1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
09.09.2015, 09:18
Лучший ответ Сообщение было отмечено Willi2001 как решение

Решение

Цитата Сообщение от Willi2001 Посмотреть сообщение
Считал чуть меньше часа.
Считал чуть меньше 3-х минут, долго данные вводил в программу. Расчет ТС верный!
Программу написал Никита Однороб
Результат выводится в файл в папку с программой ( UTF-8 кодировка) и на экран.
Исходник на PureBasic, сама программа и результат работы можно скачать.
Вложения
Тип файла: rar Examples.rar (27.7 Кб, 54 просмотров)
0
Заблокирован
09.09.2015, 11:28  [ТС]
Pro_grammer! SoftIce! Огромное спасибо.
Сейчас скачаю дистрибутив PureBasic.

Попытался перепроверить свои рассуждения и подсчёты.

А) По условию:
1) 185 * 127 = 23495 см
2) 165 * 178 = 29370 см
3) 143 * 335 = 47905 см
4) 87 * 526 = 45762 см
5) 26 * 958 = 24908 см
(23495 + 29370 + 47905 + 45762 + 24908)/350 = 171440/350 = 489,83 штуки
498 – 489,83 = 8,17 штуки
489,83/498 * 100% = 98,36 % — как КПД
Процент брака: 100% – 98,36% = 1,64 % (?) — возникает противоречие: 1,64 ≠ 2,46 — см. выше!

Б) Проверка досок балансовым способом:
1) l=185: 127 * 185 = 23495 см
2) l=165: 127 * 165 + 51 * 165 = 178 * 165 = 29370 см
3) l=143: 162 * 2 * 143 + 1 * 143 = 335 * 143 = 47905 см
4) l=87: 51 * 2 * 87 + 141 * 3 * 87 + 1 * 87 = 526 * 87 = 45762 см
5) l=26: 162 * 2 * 26 + 141 * 3 * 26 + 16 * 13 * 26 + 3 * 26 = 958 * 26 = 24908 см
Итого как НЕТТО: 23495 + 29370 + 47905 + 45762 + 24908 = 171440 см
Отходы: 0 + 561 + 1944 + 1551 + 192 + 42 = 4290 см
Итого как БРУТТО: 171440 + 4290 = 175730 см
Удельный вес отходов по БРУТТО: 4290/175730 * 100 = 2,44 %
Переводим в общее количество досок при закупке: 175730/350 = 175730/350 = 502,09 (!?) штуки
Здóрово!! Полный… "крах идеи предпринимательства"! Погорели! Придётся покупать 503 доски.
Удельный вес отходов по ФАКТУ: (4290 + 350)/(350 * 503) * 100 = 2,64 % — возможно ошибаюсь.

Пояснение. Путаюсь в русском языке. Как писать "штук" или "штуки"?
Наверно надо по аналогии с килограммами:
При смешанном числе — 12,5 килограмма.
При целом числе — 12 килограммов.
Прошу объяснить правописание "штук(и)" тех, кто силён в грамматике.
0
Заблокирован
09.09.2015, 21:56  [ТС]
Всем, добрый вечер!

locm, спасибо за Русификатор для PureBasic 5.31! Русификация среды программирования PureBasic

Ребята, давайте попробуем переделать авторскую программу Никита Однороба для VB6. По-моему, он справится!

Пока выкладываю все наработки по проблеме.

Программа Никиты Однороба для PureBasic (не вижу кода PureBasic в заголовке)
Кликните здесь для просмотра всего текста
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
;Автор Никита Однороб
 
Structure el
  width.l
  k.l
  List ottr.l()
EndStructure
 
Procedure GetEl(List l.l(), Index)
  PushListPosition(l())
  SelectElement(l(), Index)
  Protected res = l()
  PopListPosition(l())
  ProcedureReturn res
EndProcedure
 
Procedure SetEl(List l.l(), Index, Value)
  PushListPosition(l())
  SelectElement(l(), Index)
  l() = Value
  PopListPosition(l())
EndProcedure
 
Global NewList ottr.l()
Global v = 1
Global n = 0
 
Global Dim dp.el(9999)
Global k = 0
 
Procedure Test()
  For i = 0 To k-1
    If dp(i)\width = v
      ProcedureReturn 1
    EndIf
  Next
EndProcedure
 
Procedure Find(w)
  For i = 0 To k-1
    If dp(i)\width = w
      ProcedureReturn 1
    EndIf
  Next
  ProcedureReturn 0
EndProcedure
 
Procedure Count()
  ;Считаем
  Protected b = 0
  For j = 0 To n-1
    b = k - 1
    For i = 0 To b
      If GetEl(ottr(), j) + dp(i)\width <= v And Find(GetEl(ottr(), j) + dp(i)\width) = 0
        dp(k)\width = GetEl(ottr(), j) + dp(i)\width
        ForEach dp(i)\ottr()
          AddElement(dp(k)\ottr())
          dp(k)\ottr() = dp(i)\ottr()
        Next
        AddElement(dp(k)\ottr())
        dp(k)\ottr() = j
        k + 1
      EndIf
    Next
    
    If Find(GetEl(ottr(), j)) = 0
      dp(k)\width = GetEl(ottr(), j)
      
      AddElement(dp(k)\ottr())
      dp(k)\ottr() = j
      
      k + 1
    EndIf
    
    If Test() = 1 : Break : EndIf
  Next
EndProcedure
 
Procedure Clear()
  k = 0
  FreeArray(dp())
  Global Dim dp.el(9999)
  
  ForEach ottr()
    If ottr() = 0
      DeleteElement(ottr())
    EndIf
  Next
  
  n = ListSize(ottr())
EndProcedure
 
Procedure Start()
  Protected text$ = ""
  Protected t2$ = ""
  Protected i, p, cc = 0, s = 0, ss = 0, res.d, ost
  v = Val(GetGadgetText(1))
  
  For i = 0 To CountGadgetItems(3)-1
    For p = 1 To Val(GetGadgetItemText(3, i, 0))
      AddElement(ottr())
      ottr() = Val(GetGadgetItemText(3, i, 1))
      n + 1
    Next
  Next
  
  While n > 0
    s = 0
    Debug ListSize(ottr())
    Count()
    SortStructuredArray(dp(), #PB_Sort_Descending, OffsetOf(el\width), #PB_Long, 0, k-1)
    ForEach dp(0)\ottr()
      If GetEl(ottr(), dp(0)\ottr()) <> 0
        text$ + Str(GetEl(ottr(), dp(0)\ottr())) + "  "
        s + GetEl(ottr(), dp(0)\ottr())
        ss + GetEl(ottr(), dp(0)\ottr())
      EndIf
      SetEl(ottr(), dp(0)\ottr(), 0)
    Next
    Clear()
    res = (s)/v*100.0
    text$ + "(" + StrD(res, 2) + "%)" + #CRLF$
    cc + 1
  Wend
  
  res = (v*cc - ss)/(v*cc)*100.0
  text$ + #CRLF$ + "Общий остаток - " + Str(v*cc - ss) + " из " + Str(v*cc) + " (" + StrD(res, 2) + "%)"
  
  t2$ = "Потребуется " + Str(cc) + " кусков" + #CRLF$ + #CRLF$
  
  MessageRequester("", t2$ + text$)
  
   If CreateFile(0, "ОтветText.txt")       
    
      WriteStringN(0,  t2$ )  
    
      WriteString(0, text$)  
   
    CloseFile(0)                       
  Else
    MessageRequester("Information","may not create the file!")
  EndIf
 
 
  
  ClearGadgetItems(3)
  SetGadgetText(1, "")
  SetGadgetText(4, "")
  SetGadgetText(5, "")
  ClearList(ottr())
  v = 0
  n = 0
EndProcedure
 
Procedure OpenWnd()
  OpenWindow(0, 5, 5, 260, 410, "Уголки", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  TextGadget(0, 15, 10, 160, 25, "Длина кусков арматуры (см):")
  SpinGadget(1, 175, 5, 70, 24, 1, 10000, #PB_Spin_Numeric)
  
  TextGadget(2, 5, 35, 250, 24, "Требуемые уголки", #PB_Text_Center)
  ListIconGadget(3, 5, 65, 250, 250, "Количество", 125, #PB_ListIcon_GridLines | #PB_ListIcon_FullRowSelect)
  AddGadgetColumn(3, 1, "Длина", 120)
  
  SpinGadget(4, 5, 320, 120, 24, 1, 100, #PB_Spin_Numeric)
  SpinGadget(5, 130, 320, 120, 24, 1, 1000, #PB_Spin_Numeric)
  
  ButtonGadget(6, 30, 350, 100, 24, "Добавить")
  ButtonGadget(7, 140, 350, 100, 24, "Удалить")
  
  ButtonGadget(8, 80, 380, 100, 24, "Вычислить")
EndProcedure
 
OpenWnd()
 
Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      End
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 6
          If GetGadgetText(4) <> "" And GetGadgetText(5) <> "" And Val(GetGadgetText(5)) <= Val(GetGadgetText(1))
            AddGadgetItem(3, -1, GetGadgetText(4) + Chr(10) + GetGadgetText(5))
            SetGadgetText(4, "")
            SetGadgetText(5, "")
          EndIf
        Case 7
          RemoveGadgetItem(3, GetGadgetState(3))
        Case 8
          If GetGadgetText(1) <> "" And CountGadgetItems(3) > 0
            Start()
          EndIf
      EndSelect
  EndSelect
ForEver
; IDE Options = PureBasic 5.30 (Windows - x86)
; CursorPosition = 131
; FirstLine = 117
; Folding = --
; EnableUnicode
; EnableXP
; CompileSourceDirectory


Данные Pro_grammer по решению задачи в программе, сокращениями. Подсчитываю и корректирую бегло в уме, возможны ошибки!
Кликните здесь для просмотра всего текста
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
[B]Потребуется 498 кусков[/B]
 
 
185  165  (100.00%)
185  165  (100.00%)
... всего 127 раз
185  165  (100.00%)
 
87  87  87  87  (99.43%)
87  87  87  87  (99.43%)
... всего 131 раз
87  87  87  87  (99.43%)
 
165  26  26  26  26  26  26  26  (99.14%)
165  26  26  26  26  26  26  26  (99.14%)
... всего 131 раз
165  26  26  26  26  26  26  26  (99.14%)
 
87  26  26  26  26  26  26  26  26  26  26  (99.14%) — первый раз
87  26  26  26  26  26  26  26  26  26  26  (99.14%)  — второй раз. Всего 2 раза!
 
143  143  26  26  (96.57%)
143  143  26  26  (96.57%)
... всего 167 раз
143  143  26  26  (96.57%)
 
26  26  26  26  26  26  26  26  26  26  26  26  26  (96.57%)
26  26  26  26  26  26  26  26  26  26  26  26  26  (96.57%)
... всего 19 раз
26  26  26  26  26  26  26  26  26  26  26  26  26  (96.57%)
 
143  (40.86%) — первый раз. Всего один раз!
 
[B]Общий остаток - 2860 из 174300 (1.64%)[/B]


На картинке запуск программы Никиты на моём ПК. Скачал демо-PureBasic5.31.
Миниатюры
Выполнение оптимизации на VB6.0 по раскрою  
0
Заблокирован
10.09.2015, 03:16  [ТС]
Цитата Сообщение от Willi2001 Посмотреть сообщение
Данные Pro_grammer по решению задачи в программе, сокращениями. Подсчитываю и корректирую бегло в уме, возможны ошибки!
Стыдно, прошу прощения!
Внёс исправления в "Данные Pro_grammer по решению…"
Кликните здесь для просмотра всего текста
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Потребуется 498 кусков
 
 
185  165  (100.00%) 'строки 4-130 или (130 - 3 = 127 раз)
87  87  87  87  (99.43%) 'строки 131-261 или (261 - 130 = 131 раз)
165  26  26  26  26  26  26  26  (99.14%) 'строки 262-312 или (312 - 261 = 51 раз)
87  26  26  26  26  26  26  26  26  26  26  (99.14%) 'строки 313-314 или (314 - 312 = 2 раза)
143  143  26  26  (96.57%) 'строки 315-481 или (481 - 314 = 167 раз)
26  26  26  26  26  26  26  26  26  26  26  26  26  (96.57%) 'строки 382-500 или (500 - 481 = 19 раз)
143  (40.86%) 'строка 501 или (501 - 500 = 1 раз)
 
Общий остаток - 2860 из 174300 (1.64%) 'по тексту это последняя строка 503


Добавлено через 4 часа 37 минут
Цитата Сообщение от Willi2001 Посмотреть сообщение
От досады решил посчитать вручную на калькуляторе, думаю: за 15 минут управлюсь. Засек время. Решение:
127 досок l=350: 127 * [350 - (185 + 165)] = 0
(178 – 127)= 51 доска l=350: 51 * [350 – (165 + 2*87)] = 561
335/2 = 162(1) доски l=350: 162 * [350 – (2*143 + 2*26)] = 1944
(526 – 2*51)/3 = 141(1) доска l=350: 141 * [350 – (3*87 + 3*26)] = 1551
(958 – 2*162 – 3*141)/13 = 211/13 = 16(3) досок l=350: 16 * [350 – (13*26)] = 192
Покрываем остатки:
1 доска l=350: 1 * [350 – (1*143 + 1*87 + 3*26)]= 42
Исправляю свои счётные ошибки по тексту
Кликните здесь для просмотра всего текста
335/2 = 167(1) доски l=350: 167 * [350 – (2*143 + 2*26)] = 2004 см
(526 – 2*51)/3 = 141(1) доска l=350: 141 * [350 – (3*87 + 3*26)] = 1551 см
(958 – 2*167 – 3*141)/13 = 201/13 = 15(6) досок l=350: 15 * [350 – (13*26)] = 180 см
Покрываем остатки:
1 доска l=350: 1 * [350 – (1*143 + 1*87 + 4*26)]= 16 см

И ещё необходима доска, т. к. в остатке у "26 см" было 6 штук, а пока покрыли 4 штуки.
1 доска l=350: 1 * [350 – (2 * 26)] = 298 см

Потребуется досок l=350: 127 + 51 + 167 + 141 + 15 + 1 + 1 = 503 штуки
В том числе пойдут на отходы: (0 + 561 + 2004 + 1551 + 180 + 16 + 298)/350 = 4610/350 = 13,17 штук
Процент отходов: 13,17/503 * 100% = 2,62 %

Проверка:
КПД = 171440/(503 * 350) = 171440/176050 = 0,9738 или 97,38 %
Совпадает: 2,62% + 97,38% = 100,00 %

Да, плохой у меня получился результат.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38171 / 21106 / 4307
Регистрация: 12.02.2012
Сообщений: 34,697
Записей в блоге: 14
10.09.2015, 09:07
Цитата Сообщение от Willi2001 Посмотреть сообщение
Научите, пожалуйста, бегло решать оптимизационные задачи на раскрой материалов с помощью Visual Basic 6.0
- язык программирования здесь не играет особой роли. Важен алгоритм. Опиши его, а программа в данном случае второстепенна.
2
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
10.09.2015, 11:36
Лучший ответ Сообщение было отмечено Willi2001 как решение

Решение

Посмотрите такой вариант (пока еще "сырой").
Вложения
Тип файла: rar Project1.rar (7.2 Кб, 44 просмотров)
0
Заблокирован
10.09.2015, 11:57  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
Важен алгоритм. Опиши его
Catstail, спасибо. Конкретный пример смотрите ниже. Что надо сделать? Хочется избежать схоластики.

Информация в Интернете крайне скудная. Выбирать не приходится. Прошу тех, кто имеет иное мнение указать конкретные ссылки.

Встретил только как аналог, где приводится вариант расчётов через Excel, слишком муторно. Как всё упростить и показать напрямую через Visual Basic 6.0? Какой будет код?
Курсовая работа: Решение экономических задач с помощью VBA http://ref.by/refs/67/15203/1.html
Кликните здесь для просмотра всего текста
5) Задание на нахождение оптимального раскроя
Для построения математической модели в программе производится перебор
всевозможных вариантов раскроя рулона стандартной длины на рулоны требуемой
для этого в программе используются следующие переменные:
i1,i2,i3,i4 – переменные циклов
a1,a2,a3,a4 – переменные которым присваиваются значения заказанных длин
рулонов.
t – переменная которой ф-ция Floor возвращает наибольшее целое число, не
превышающее данное.
M – минимум среди заказанных длин

2.3.6 Задание на нахождение оптимального раскроя
Составляем таблицу, в которой будут приведены остатки от раскроя на заказ при различных вариантах раскроя.
Например, по условию в соответствии с вариантом стандартная длина раскроя равна 28 метров, т.е. первый вариант раскроя будет составлять 0 рулон длиной 4 м, 0 рулонов длиной 6м и 4 рулона длиной 9 м, рулонов длиной 11 м. не будет, что в сумме даст 27, следовательно: отходы будут составлять 1 метр. Второй вариант, когда 1 рулон по 6 м и два по 11 м, в этом случае остатков не будет и т.д. Всего получается 19 вариантов раскроя.

В программе это будет выглядеть таким образом:
l = 28
a1 = 4: a2 = 6
a3 = 9: a4 = 11
r = 4
m = Application.Min(a1, a2, a3, a4)
t = Application.Floor(l / m, 1)
For i1 = 0 To t
For i2 = 0 To t
For i3 = 0 To t
For i4 = 0 To t
s = 28 - a1 * i1 - a2 * i2 - a3 * i3 - a4 * i4
If s >= 0 And s < m Then
Cells(r, 1).Value = r - 3
Cells(r, 2).Value = i1
Cells(r, 3).Value = i2
Cells(r, 4).Value = i3
Cells(r, 5).Value = i4
Cells(r, 6).Value = s
r = r + 1
End If
Next i4
Next i3
Next i2
Next i1

На листе это будет выглядеть так:
| Длина рулонов на заказ |
|Х |4 |6 |9 |11|Х |
|1 |0 |0 |3 |0 |1 |
|2 |0 |1 |0 |2 |0 |
|3 |0 |1 |1 |1 |2 |
|4 |0 |3 |1 |0 |1 |
|5 |1 |0 |0 |2 |2 |
|6 |1 |1 |2 |0 |0 |
|7 |1 |2 |0 |1 |1 |
|8 |1 |2 |1 |0 |3 |
|9 |1 |4 |0 |0 |0 |
|10 |2 |0 |1 |1 |0 |
|11 |2 |0 |2 |0 |2 |
|12 |2 |1 |0 |1 |3 |
|13 |2 |3 |0 |0 |2 |
|14 |3 |1 |1 |0 |1 |
|15 |4 |0 |0 |1 |1 |
|16 |4 |0 |1 |0 |3 |
|17 |4 |2 |0 |0 |0 |
|18 |5 |1 |0 |0 |2 |
|19 |7 |0 |0 |0 |0 |

Пусть Xj – кол-во стандартных рулонов, разрезанных по варианту j, где
j[1..19]. Ограничения, налагаемые на переменные Xj, связаны с требованием
обеспечить изготовление заказанного кол-ва нестандартных рулонов. Ф-ция
цели учитывает суммарные отходы, получаемые при выполнении заказа. Таким
образом имеем следующую мат. модель:
Минимизировать:
Z=x1+2x3+x4+2x5+x7+3x8+2x11+2x12+2x13+x1 4+x15+3x16+
+2x18 + 4(x5+x6+x7+x8+x9+2x10+2x11+2x12+2x13+3x1 4+4x15+4x16+4x17+5ч18+7x19-
220)+ 6(...-210)+9(...-350)+
+11(...-380)
Отведем диапазон ячеек (i4:i22) под переменные . Введем в диапазон
ячеек (j3:m3) левые части ограничений, определенные слежующими формулами:
=СУММПРОИЗВ($I$4:$I$22;B4:B22)
=СУММПРОИЗВ($I$4:$I$22;c4:c22)
=СУММПРОИЗВ($I$4:$I$22;d4:d22)
=СУММПРОИЗВ($I$4:$I$22;e4:e22)
В ячейку N4 введем ф-цию цели:
=СУММПРОИЗВ($I$4:$I$22;F4:F22)+B3*(СУММП РОИЗВ($I$4:$I$22;B4:B22)-
J3)+C3*(СУММПРОИЗВ($I$4:$I$22;C4:C22)-K3)+D3*(СУММПРОИЗВ($I$4:$I$22422)-
L3)+E3*(СУММПРОИЗВ($I$4:$I$22;E4:E22)-M3)

где в ячейки B3:E3 введены длины, а в ячейки J3:M3 – кол-ва заказанных
рулонов
Выберем команду сервис – Поиск решения — заполним открывшееся
диалоговое окно Поиск решения (Solver):
- Установим целевую ячейку – N4
- Изменяя ячейки I4:I22
- Ограничения:
$I$4:$I$22=целое
$I$4:$I$22>=0
$j$4:$m$4>=$j$3:$m$3
- Функция = минимизация
|Количество рулонов|
|220|210|35|38|Отходы|
| ххх|ххх|0 |0 | ххххххх |
|220|210|35|38|49,99996|
| ххх |ххх|0 |0 | ххххххх |

Примечание. Willi2001 бегло вносил корректуру, поскольку были сильные искажения текста из-за форматирования.
0
Заблокирован
10.09.2015, 12:47  [ТС]
SoftIce, спасибо! Отлично!
Как можно посмотреть сам код программы? Открыл через Notepad: File.exe — ничего не понятно.

Если не трудно напишите, пожалуйста, как можно увидеть саму программу на Visual Basic 6.0?
И ещё: как можно попросить VB6.0? чтобы иногда "он писал как бы короче", например очень много повторов:
1. 165 185 Отходы 0
2. 165 185 Отходы 0
3. 165 185 Отходы 0
4. 165 185 Отходы 0
5. 165 185 Отходы 0
6. …
127. 165 185 Отходы 0

Он сможет просто указать одной строкой, для удобного нашего восприятия:
1. 165 185 Раз: 127 Отходы 0
Миниатюры
Выполнение оптимизации на VB6.0 по раскрою  
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
10.09.2015, 13:09
Лучший ответ Сообщение было отмечено Willi2001 как решение

Решение

Цитата Сообщение от Willi2001 Посмотреть сообщение
Как можно посмотреть сам код программы?
Доведу до ума - покажу.
0
Заблокирован
10.09.2015, 20:51  [ТС]
Catstail! Если вернуться с Луны на Землю, то реальность печальная.

Форум C# для начинающих всегда многолюдный — жизнь бьёт ключом.
Появляется простая задача Оптимальный линейный раскрой
Кликните здесь для просмотра всего текста
Требуется
1. Решить данную задачу оптимальным алгоритмом.
Если можно на простом примере объяснить оптимальный алгоритм.
Только такие наборы бывают посложнее и побольше
400мм 20шт.
1200мм 12шт.
Все надо разместить данные отрезки на отрезкаъ длинной не более 6000мм.
Расстояние между отрезками = 5мм.

Все участники разом онемели, будто Автор (hulk45) попросил что-то непотребное. Больше года длилось молчание. Наконец, совсем недавно, другой участник предложил, перечислив все известные алгоритмы… решение в MS Excel.
И опять наступило полное забвение.
Миниатюры
Выполнение оптимизации на VB6.0 по раскрою  
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
10.09.2015, 21:00
Это тебе не яйца рисовать, тут головой думать надо
1
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
10.09.2015, 21:07
Project1.rar
1
Заблокирован
10.09.2015, 22:42  [ТС]
Цитата Сообщение от SoftIce Посмотреть сообщение
Project1.rar
SoftIce! Колосально! Ничего равного в Интернете не встречал. Наверно, Вы очень талантливы.

Чуть позже покажу работу программ Калашникова Александра — #2 (permalink), скачал и другие его поделки. Если деликатно, то вызывают недоумение.

Для новичков пояснение: каждый раз мой Антивирус при встрече с файлами "exe" несётся к ним со всех ног, стараясь тут же уничтожить, как вредителя. Приходится давать ему подписку на восстановление "убитого файла", тогда он выпускает из Карантина.
Вчера сцепился с целой бандой IObit. Бились на смерть около двух часов, проникли "под маркой установщика". Мы победили. Антивирус предупреждал — нельзя. Не придал значения.
Миниатюры
Выполнение оптимизации на VB6.0 по раскрою  
0
Заблокирован
11.09.2015, 08:46  [ТС]
Цитата Сообщение от Willi2001 Посмотреть сообщение
Чуть позже покажу работу программ Калашникова Александра — #2 (permalink), скачал и другие его поделки. Если деликатно, то вызывают недоумение.
Сколько ни пытался подсчитать — ничего не получилось. Интересно, в чём дело? Кто сможет объяснить причину?
Программа А. Калашникова FastLinearCutting имеет объём 468 Кб — всего один исполняемый файл.
Кликните здесь для просмотра всего текста
Быстрый линейный раскрой http://freesoft.ru/bystryy_lineynyy_raskroy
скачать FC_demo_26.msi - Быстрый линейный раскрой http://freesoft.ru/bystryy_lin... si/getpage
Быстрый линейный раскрой для Windows
Автор: Калашников Александр
Лицензия: Демонстрационная версия
Язык: Русский
Дата: 2004-03-16 / 2015-04-23
Миниатюры
Выполнение оптимизации на VB6.0 по раскрою   Выполнение оптимизации на VB6.0 по раскрою  
0
11.09.2015, 10:44  [ТС]

Не по теме:

Цитата Сообщение от Willi2001 Посмотреть сообщение
Вчера сцепился с целой бандой IObit. Бились насмерть около двух часов
Подумалось, а вдруг кому-то не хватает острых ощущений?
Если в душе живёт романтический рыцарь, жаждущий приключений — то легко и с лихвой найдёте их по этой ссылке
Кликните здесь для просмотра всего текста
Эта Portable-сборка была создана из дистрибутива "PureBasic 5.11 Windows x86". Она не оставляет следов работы в системе и может работать со съемных носителей информации, например внешнего жесткого диска или флешки.
Из дистрибутива ничего не вырезано. Были добавлены наиболее часто используемые библиотеки функций http://soft376.ru/portable/312... table.html

0
11.09.2015, 14:19

Не по теме:

Цитата Сообщение от Willi2001 Посмотреть сообщение
Эта Portable-сборка была создана из дистрибутива "PureBasic 5.11 Windows x86".
Кто программирует на PureBasic, тот знает, что ни какую "Portable-сборку" специально создавать не надо.
Любая его копия при запуске с ключом PureBasic.exe /PORTABLE является таковой из коробки, что и предусмотрено автором PureBasic

Всё остальное шарлатанство и попытка втюхать что то лишнее.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.09.2015, 14:19
Помогаю со студенческими работами здесь

Контроль длины Label. А также VB6 Portable vs VB6 Installed.
Исходя из заголовка темы, вопроса 2: 1.) Как определить, что в Label уже не хватает места для Caption? Длина букв разная. Например,...

Возможно ли: выполнение подпрограммы в отдельном процессе, одновременное выполнение двух подпрограмм?
Всех приветствую :handshake: Пример @echo off call :PROG1 call :PROG2 exit /b :PROG1

Как ускорить выполнение кода? (Получение цвета пикселя, сравнение и выполнение действия)
Всем привет. Нужна консультация экспертов) Программа такая. Есть пиксель на экране, в нем то появляется яркий цвет, то темный (лампочка...

Ставлю задержку на выполнение действий в цикле - задержка ставится почему то на выполнение всего скрипта
Здравствуйте! Код элементарный: $s = $_POST; $s = preg_replace('/ {2,}/',' ',$s); for ($i = 0; $i &lt; strlen($s);...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru