|
|
|
Пропорциональное распределение
|
|||
|---|---|---|---|
|
#18+
Stax, Да, по "горизонтали" и по "вертикали". Необязательно на SQL, можно и на PL/SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 12:39 |
|
||
|
Пропорциональное распределение
|
|||
|---|---|---|---|
|
#18+
Cane Cat Fisher, В Вашем алгоритме мне самым проблемным кажется шаг №2. Представьте, отрядов 30 - 50, среди них есть "легкие", т.е. те, чей коэффициент мал. При распределении значительного количества типов объектов этого коэффициента может не хватать, чтобы получить объект любого конкретного типа, но в сумме на один, какой либо, объект хватает. Определить какой, можно только распределив все и посмотрев у какого типа остался "лишний" объект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 12:50 |
|
||
|
Пропорциональное распределение
|
|||
|---|---|---|---|
|
#18+
Почему-то мне кажется, что это один из вариантов задачи о рюкзаке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 14:36 |
|
||
|
Пропорциональное распределение
|
|||
|---|---|---|---|
|
#18+
DymSigОпределить какой, можно только распределив все и посмотрев у какого типа остался "лишний" объект. если сразу распределить точно , то потом лишний может быть и не 1 напр точно 0.4 0.4 0.4 0.4 - 4 распределили поровну но 10 частей с весом по 10 если округлим получим 10 нулей и неустойку 4 поетому сразу округлять и остаток распределять между оставшимсями но опять же 4 еденички можно очень даже по разному расставить на 10мест Код: plsql 1. если условие убрать, то очень легко придумать случай когда распределить не удастся нужны теоретики (или хотя-бы кто помнит что-то из дискретной) является ли условие SUM(SQUAD.CNT) = SUM(OBJ.CNT) необходимым/достаточным ... задачка скорее все известная (воможно имеет имя - типа пионерские рюбзаки) тогда решение наверняка описано в той же вики зы заполнять матрицу и перебором подгонять результат, не считаю решением ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 14:51 |
|
||
|
Пропорциональное распределение
|
|||
|---|---|---|---|
|
#18+
Stax, Совершенно верно. И таких, где 0.4, 0.4 и т.д., а в итоге все нули, на реальных данных несколько подразделений. Про SUM(SQUAD.CNT) = SUM(OBJ.CNT) - в реальности подразделения имеют "вес" (численность), но привести этот "вес" к количеству предметов, зная их общее число, не сложная задача. Погрешность округления списывается на самые "толстые" подразделения. Все вполне объяснимо, заказчик понимает. А вот красиво распределить по типам, коих много и они имеют разную ценность, а количество предметов одного типа может быть относительно небольшим, у меня пока не получается. Сбрасывать погрешность в одно место, например, также, самым "толстым" подразделениям - не вариант, у них получается много, а у "худых" вообще ничего. В результате должен формироваться отчет, типа список подразделений с численностью, матрица вот этого распределения и "итого по строке", "итого по столбцу", т.е. перекосы будут очевидны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 15:46 |
|
||
|
Пропорциональное распределение
|
|||
|---|---|---|---|
|
#18+
DymSig, Код: plsql 1. погрешность не должна расти, она будет ити на пользу полстосумам (так договорились), но не больше +-0.5 (округляем, больше нікак не получітся) самый простой пример если SUM(SQUAD.CNT) = SUM(OBJ.CNT) не выполняется матрица 2х10 (распределить равномерно вес 10 по 10) распределяем 4 -получаем 4 и 6 нулей распределяем 92 - две 10 и 8 девяток 10 во всех столбцах никак не получить можно попробовать a) 1) формируем первую строку и сохраняем доп информацию по оруглению -1 уменьшили, +1 увеличили 0-повезло (целое число) 2) в следующих строках не просто округляем, а с учетом как поступали в предыдущих стараясь свести сумму еденичек к нулю ============ б) для нечетных строк, если число стоит в нечетном столбце - ceil, в нечетном -floor и наоборот для четных строк, если число стоит в нечетном столбце - floor, в нечетном -ceil с) для нечетных строк, сортировка CNT DESC для четных строк, сортировка CNT ASC так по столбцах уменьшится накопление погрешности, но точности всеравно не будет зы чувствую, что должен быть алгоритм, кроме перебора ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.11.2017, 16:53 |
|
||
|
Пропорциональное распределение
|
|||
|---|---|---|---|
|
#18+
Код: plsql 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. на исходных данных проходят оба теста ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 11:52 |
|
||
|
Пропорциональное распределение
|
|||
|---|---|---|---|
|
#18+
MazoHist, Код: plsql 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. 20924907 Код: plaintext 1. 2. 3. 4. ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 12:04 |
|
||
|
Пропорциональное распределение
|
|||
|---|---|---|---|
|
#18+
Stax, решал для случая SUM(SQUAD.CNT) = SUM(OBJ.CNT) Небольшая правка Код: plsql 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 12:21 |
|
||
|
Пропорциональное распределение
|
|||
|---|---|---|---|
|
#18+
Кстати говоря. Последний вариант для SUM(OBJ.CNT) > SUM(SQUAD.CNT) работает по принципу авторТрем самым толстым комсомольцам по груше, остальным не повезло..., т.е. "отряд не примет больше того что может унести", в обратном случае понятно - недостача, при распределении просто кончаются предметы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 12:36 |
|
||
|
Пропорциональное распределение
|
|||
|---|---|---|---|
|
#18+
MazoHistStax, решал для случая SUM(SQUAD.CNT) = SUM(OBJ.CNT) Небольшая правка не совсем пропорционально делит Код: plsql 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. имхо надо автор9 9 9 9 8 1 1 1 0 1 0 0 0 1 1 ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 12:59 |
|
||
|
Пропорциональное распределение
|
|||
|---|---|---|---|
|
#18+
Подкрутил сортировку. Код: plsql 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. получилось такое 12345198999210111302000 для 20924849 получилось такое 123451211169142323331929301213 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 13:14 |
|
||
|
Пропорциональное распределение
|
|||
|---|---|---|---|
|
#18+
MazoHistПодкрутил сортировку. получилось такое 12345198999210111302000 еще б 2-ку разбить на единички но мож DymSig и етого будет достаточно ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 13:21 |
|
||
|
Пропорциональное распределение
|
|||
|---|---|---|---|
|
#18+
Staxеще б 2-ку разбить на единички Код: plsql 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. 12345199899210111301100 на [msg_id=20924907] дает результат чуть хуже 1234511101610152423331829302212 играясь row_number() в b1 можно корректировать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 13:50 |
|
||
|
Пропорциональное распределение
|
|||
|---|---|---|---|
|
#18+
MazoHist, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. o\s123110220113010 а ожидается: o\s123111120113001 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.11.2017, 16:40 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39550137&tid=1884944]: |
0ms |
get settings: |
7ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
136ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 203ms |
| total: | 410ms |

| 0 / 0 |
