Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Программирование Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
Ребят, вот уже не первый месяц я понимаю, что можно сделать проще, а не изобретать велосипед.

Например на сервере mssql хранятся данные:
Отгрузка:
CREATE TABLE #shipment
(	
	[shipment_sales_channel_name]    [varchar](25)    NULL,
	[shipment_branch_name]           [varchar](100)   NULL,
	[shipment_customer_name]         [varchar](100)   NULL,
	[shipment_priority]              [tinyint]        NULL,
	[shipment_date]                  [datetime]       NULL,
	[shipment_kg]                    [decimal](11, 5) NULL,	
) 


График работы:
create table #schedule_work
(
	 dt_tm			datetime	not null
	,dw			smallint	    null
)


Список машин :
create table #cars
(
	 car		int		not null
	,volume		dec(11,5)	    null
)


Например задача, мне нужно сделать график отгрузки, с учетом графика работы и вместимости машин. Алгоритм должен заполнить машину на 99%-100%, кол-во машин ограничено, заказ нельзя разделять (в 1 машину можно больше 1 заказа, но нельзя 0.5 заказа). Задача стандартная в логистике.

На выходе:
График отгрузки по дням
Объем отгрузки по дням
Кол-во машин по дням
Лог какой заказ в какой машине и когда будет огрузка


я не спрашиваю как мне сложить 2 числа и получить результат.
Алгоритм все считает в 2 хранимках на сервере, но мне кажется, реализация на t-sql мягко говоря это не то.

Поделитесь опытом где писали сложные расчеты и какой язык использовали?
Можете посоветовать, что посмотреть и что почитать.


Спасибо

Сообщение было отредактировано: 3 сен 19, 12:19
3 сен 19, 09:28    [21962243]     Ответить | Цитировать Сообщить модератору
 Re: на чем создать расчет, поделитесь опытом.  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19590
Focha
что посмотреть и что почитать
Ну, вероятно, алгоритмически - про задачу линейного раскроя (как правило, она рассматривается как частный случай задачи о рюкзаке).

Focha
где писали сложные расчеты и какой язык использовали?

Данная задача - несложная, пока нет лимита по ресурсам. А у тебя их и не будет, вероятно... так что пофиг. какой язык лучше знаешь, на том и пиши... да хоть в Excel поиск решения используй.
3 сен 19, 11:24    [21962324]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
Akina
Focha
что посмотреть и что почитать
Ну, вероятно, алгоритмически - про задачу линейного раскроя (как правило, она рассматривается как частный случай задачи о рюкзаке).


Как решить я знаю, цифры умею не только складывать.

Akina
Focha
где писали сложные расчеты и какой язык использовали?

Данная задача - несложная, пока нет лимита по ресурсам. А у тебя их и не будет, вероятно... так что пофиг. какой язык лучше знаешь, на том и пиши... да хоть в Excel поиск решения используй.


Я смотрю вы это делаете в Excel
3 сен 19, 16:16    [21962653]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 19590
Focha
Я смотрю вы это делаете в Excel
У меня вообще таких задач нет. Но когда появляются (было лет семь назад, помнится) - Эксель вполне себе справился.

Уж больно всё неопределённо. Задача-то в общем случае NP, так что SQL под неё не заточен. И те две SP если её и решают, то либо реализуют тот же алгоритм, либо обрабатывают большие массивы, пользуясь тем, что данные локальные.

Наверное, есть средства, либо специально под этот класс задач заточенные, либо несложно к ним применимые... та же генетика, к примеру. Но увы, конкретных не назову, не моя область.
3 сен 19, 16:28    [21962663]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
Akina
Наверное, есть средства, либо специально под этот класс задач заточенные, либо несложно к ним применимые... та же генетика, к примеру. Но увы, конкретных не назову, не моя область.



Мне данная область интересна, но куда копать пока не пойму.
3 сен 19, 17:31    [21962740]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
L.Otujktd
Member

Откуда:
Сообщений: 81
Focha,

Добрый вечер! Если есть алгоритм то все-равно на каком языке это реализовывать.
Проще наверное перевести все в объектное представление и реализовать все на с#. Тк при желании можно спокойно прикрутить и тесты и orm и отлаживать проще
3 сен 19, 21:06    [21962865]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 32478
Блог
Я бы запихнул расчет в clr-процедуру
3 сен 19, 22:16    [21962898]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
mayton
Member

Откуда: loopback
Сообщений: 42897
Автор пишет что у него уже есть 2 хранимки которые все считают.

Но автор считает что это - не феньшуй.

Верно?
4 сен 19, 08:23    [21962965]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
L.Otujktd
Если есть алгоритм то все-равно на каком языке это реализовывать.
Проще наверное перевести все в объектное представление и реализовать все на с#. Тк при желании можно спокойно прикрутить и тесты и orm и отлаживать проще
Я вот думал о C# и CLR, но хочу узнать ваше мнение, каким образом у вас построены расчеты / алгоритмы / бизнес процессы или как еще там называют это


Критик
Я бы запихнул расчет в clr-процедуру
А вы делали большие и сложные расчеты на CLR или просто так сказали?


mayton
Автор пишет что у него уже есть 2 хранимки которые все считают.
Но автор считает что это - не феньшуй.
Верно?
Да, ваш комментарий 100% отображает мою проблемы.
4 сен 19, 08:42    [21962972]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 820
Focha,

Я бы оставил хранимки. Если они делают дело, то чудесно. Если считаете, что алгоритм не оптимальный, то нужно поискать другой алгоритм. Наверняка есть что-то специализированное. Ну и соответственно внешнее и затратное по всем параметрам.
4 сен 19, 11:02    [21963087]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
KreatorXXI
Focha,

Я бы оставил хранимки. Если они делают дело, то чудесно. Если считаете, что алгоритм не оптимальный, то нужно поискать другой алгоритм. Наверняка есть что-то специализированное. Ну и соответственно внешнее и затратное по всем параметрам.


Алгоритм оптимальный, работает быстро, считает все правильно.
Мне интересен подход, как другие делают расчеты не на SQL, произвести "сложные" расчеты и заложить алгоритм.
4 сен 19, 11:26    [21963128]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
mayton
Member

Откуда: loopback
Сообщений: 42897
Focha

Сколько времени в среднем работает расчет графика отгрузки?

Сообщение было отредактировано: 5 сен 19, 10:00
4 сен 19, 11:26    [21963131]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
mayton
KreatorXXI,
Сколько времени в среднем работает расчет графика отгрузки?

данный кусок работает ~10 секунд, а все 2 минуты. я думаю где-то есть истина, что такие расчеты "легче" разработать на чем-то другом.
4 сен 19, 14:28    [21963471]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
KreatorXXI
Member

Откуда: Москва
Сообщений: 820
Focha,

не на SQL делают, когда не хотят привязываться к конкретному SQL. Либо PL этого SQL убогий (или его совсем нет). Ну ещё может быть, что задача специфическая, совсем не ложится под возможности конкретного SQL. А у Вас уже всё на сервере. Круто!
4 сен 19, 14:50    [21963505]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
mayton
Member

Откуда: loopback
Сообщений: 42897
Focha,

Твоя цель - уменьшить время работы алгоритма?
4 сен 19, 16:44    [21963669]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
mayton
Focha,
Твоя цель - уменьшить время работы алгоритма?
нет, моя цель узнать какие еще есть варианты.
4 сен 19, 17:15    [21963719]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
mayton
Member

Откуда: loopback
Сообщений: 42897
Focha
mayton
Focha,
Твоя цель - уменьшить время работы алгоритма?
нет, моя цель узнать какие еще есть варианты.

Выше по тексту тебе предложили хранимые процедуры на базе clr.
Хороший вариант. Я плюсую т.к и T-SQL и CLR это технологии
от одного производителя. И соотв. проблем с типами не будет.
Все будет совместимо.

Далее нам говорить тут в топике не очем. Т.к. код ты не показал.
И я... и все здесь присутствующие чувствуют себя дураками обсуждая
то чего не видно.

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

Выдавливать мысли из нас без кода... это как говорил мой бывший босс - высасывать гной из грязного пальца.

Надеюсь на твоё понимание.
4 сен 19, 17:20    [21963726]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
Focha
Member

Откуда: Москва
Сообщений: 455
mayton
Focha
пропущено...
нет, моя цель узнать какие еще есть варианты.

Выше по тексту тебе предложили хранимые процедуры на базе clr.
Хороший вариант. Я плюсую т.к и T-SQL и CLR это технологии
от одного производителя. И соотв. проблем с типами не будет.
Все будет совместимо.

Далее нам говорить тут в топике не очем. Т.к. код ты не показал.
И я... и все здесь присутствующие чувствуют себя дураками обсуждая
то чего не видно.

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

Выдавливать мысли из нас без кода... это как говорил мой бывший босс - высасывать гной из грязного пальца.

Надеюсь на твоё понимание.


без проблем, вот часть, распределяет текущие остатки между заявками с учетом срока годности, мой вопрос был не как реализовать, а где вы производите расчеты и что используете.
Может кто-то делает расчеты на C# CLR или Python или R или не знаю на VBA, пока я не услышал "у нас в компании алгоритмы и расчеты на CLR в основном и часть на SQL"
-- создаем индексы для расчетов		
if (select INDEXPROPERTY(object_id('calc.plan_production_finished_products'),'NoCl_stock_sort_row','IndexID')) is null
	CREATE NONCLUSTERED INDEX NoCl_stock_sort_row ON calc.plan_production_finished_products (stock_sort_row);
						
if (select INDEXPROPERTY(object_id('calc.plan_production_finished_products'),'NoCl_stock','IndexID')) is null
	CREATE NONCLUSTERED INDEX NoCl_stock
	ON calc.plan_production_finished_products (data_type, reason_ignore_in_calculate, sap_id, stock_sort_row)
	INCLUDE (row_id,stock_on_date,stock_kg,stock_current_KOS,stock_KOS_in_day,stock_shipment_kg);
							



-- берем первую заявку
select @shipment_sort_row = min(stock_sort_row) -- ключ строки для которой считаем 			
from calc.plan_production_finished_products
where data_type in ('заявки', 'план продаж') 
	and reason_ignore_in_calculate is null;


-- =============== --
-- ОСНОВНОЙ РАСЧЕТ --
-- =============== --
while not @shipment_sort_row is null
begin
	

			-- заполняем переменные по отгрузке
			select
					 @shipment_row_id	= c.row_id
					,@shipment_sap_id	= c.sap_id
					,@shipment_date		= c.shipment_date
					,@shipment_min_KOS	= c.shipment_min_KOS
					,@shipment_kg		= c.shipment_kg
			from calc.plan_production_finished_products as c
			where c.stock_sort_row = @shipment_sort_row


			-- ==================== --
			-- распределяем остатки --
			-- ==================== --
			set @stock_sort_row = 0

			while not @stock_sort_row is null -- 0 для входа в цикл, если остатки null, то выходим из цикла -- 
			begin
																
							-- заполняем остатки
							select 
									 @stock_row_id		= max(st.row_id)
									,@stock_sort_row	= max(st.stock_sort_row)
									,@stock_on_date		= max(st.stock_on_date)
									,@stock_current_KOS = max(st.stock_current_KOS)
									,@stock_KOS_in_day	= max(st.stock_KOS_in_day)
									,@stock_kg			= max(st.stock_kg)
							from (
										select top 1 
												 st.row_id
												,st.stock_sort_row
												,st.stock_on_date
												,st.stock_current_KOS
												,st.stock_KOS_in_day
												,st.stock_kg - isnull(st.stock_shipment_kg, 0) as stock_kg
										from calc.plan_production_finished_products as st
										where st.sap_id = @shipment_sap_id
										and st.stock_sort_row > @stock_sort_row
										and st.stock_kg - isnull(st.stock_shipment_kg, 0) <> 0
										and st.data_type = 'Остатки'
										and st.reason_ignore_in_calculate is null
										order by st.stock_sort_row
									) as st;



							-- ПРОВЕРКА: если остатков нет
							if @stock_sort_row is null
							begin
								CONTINUE
							end;



							-- ПРОВЕРКА: расчета КОС по заявкам или плану продаж
							if @stock_current_KOS - (@stock_KOS_in_day * DATEDIFF(day,  @stock_on_date, @shipment_date)) <= @shipment_min_KOS
							begin
								CONTINUE
							end;



							-- РАСПРЕДЕЛЯЕМ: если заказали больше чем на остатках, но берем кол-во на остатках или кол-во заказанного
							update calc.plan_production_finished_products
							set stock_shipment_kg = isnull(stock_shipment_kg, 0) + iif(@shipment_kg > @stock_kg, @stock_kg, @shipment_kg)
							where stock_sort_row in (@shipment_sort_row, @stock_sort_row);


							-- ЛОГ: остатков	
							insert into #log_change (json_text)														
							values (N'{ 
										 "data_type"		:"log остатки"
										,"from_row_id"	:' + convert(varchar(9), @stock_row_id) + '
										,"for_row_id"	:' + convert(varchar(9), @shipment_row_id) + '
										,"kg"			:' + convert(varchar(20), iif(@shipment_kg > @stock_kg, @stock_kg, @shipment_kg)  ) + ' 
										}');



							-- ПРОВЕРКА: кол-во отгруженного = 0
							select @shipment_kg = c.shipment_kg - isnull(c.stock_shipment_kg, 0)
							from calc.plan_production_finished_products as c
							where c.stock_sort_row = @shipment_sort_row;

							-- если 0 выходим из цикла
							if @shipment_kg = 0
							begin
								set @stock_sort_row = null
								CONTINUE
							end;

			end;

			select @shipment_sort_row = min(stock_sort_row) -- ключ строки для которой считаем 			
			from calc.plan_production_finished_products
			where data_type in ('заявки', 'план продаж') 
				and reason_ignore_in_calculate is null
				and stock_sort_row > @shipment_sort_row;

end;

-- удаляем индексы
drop index NoCl_stock_sort_row on calc.plan_production_finished_products
drop index NoCl_stock on calc.plan_production_finished_products  
4 сен 19, 17:35    [21963749]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
mayton
Member

Откуда: loopback
Сообщений: 42897
Есть описание таблички plan_production_finished_products в виде ddl?
4 сен 19, 17:52    [21963765]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
L.Otujktd
Member

Откуда:
Сообщений: 81
Focha,

Я бы попробовал все перенести в объектное представление и в linq завернуть потихоньку и что-то респараллелить/закешировать. Плюс в это во всем что можно прикрутить визуализацию и красивые диаграммы
4 сен 19, 18:38    [21963804]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
mayton
Member

Откуда: loopback
Сообщений: 42897
А зачем индексы создаются и убиваются? Странная практика.

Из Ораклового опыта... я-бы их 1 раз создал как HIDDEN. И потом в запросах активировал бы когда
надо хинтами.

И еще вопрос
1) Сколько всего строк в табличке plan_production_finished_products?
2) Сколько из них реально используются в расчетах?
4 сен 19, 18:53    [21963827]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 938
Focha
Алгоритм все считает в 2 хранимках на сервере, но мне кажется, реализация на t-sql мягко говоря это не то.

а чего нет? Чем ближе к данным, тем лучше.
считает "всё"
считает быстро
считает правильно
работает - не тронь (с)

если тащить это куда-то ИЗ базы, значит уже лишнюю работу делать
быстрее будет, только если алгоритмы говно, тогда конечно можно взять C++ и заюзать евойные алгоритмы
это будет оптимально.
Focha
А вы делали большие и сложные расчеты

а это разве "большой и сложный"?
сходите к синоптикам, посмотрите, как они погоду считают Картинка с другого сайта.
5 сен 19, 05:14    [21964135]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 938
Focha
данный кусок работает ~10 секунд, а все 2 минуты. я думаю где-то есть истина, что такие расчеты "легче" разработать на чем-то другом.

это от запросов и алгоритма зависит
перетащить данные в C++ будет ещё дольше
но скорость расчётов останется ~такой же, если алгоритм не изменить
5 сен 19, 05:17    [21964137]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 938
where data_type in ('заявки', 'план продаж') 
	and reason_ignore_in_calculate is null;


-- удаляем индексы
drop index NoCl_stock_sort_row on calc.plan_production_finished_products
drop index NoCl_stock on calc.plan_production_finished_products  

мда, ну тут вообще не к БД претензии
если увидим DDL таблицы, думаю будем плакать всем форумом
5 сен 19, 05:25    [21964138]     Ответить | Цитировать Сообщить модератору
 Re: На чем создать расчет, поделитесь опытом  [new]
monstrU
Member

Откуда: Москва
Сообщений: 1164
я бы тут рассматривал выбор - бизнес логику держать в БД или в приложении.
сейчас ты выбрал вариант 2.
у обеих есть плюсы и минусы.
по бд
плюсы - в теории сравнительно быстро работает (на практике как угодно), просто подменить
минусы- трудозатратно в разработке и сопровождении, юнит тесты в архитектуре не предусмотрены

бизнес логика в приложении
плюсы - на вменяемом железе производительность на уровне, разработка на высокоуровневом языке C# или похожем, писать сложную логику проще, юнит тесты применять можно
минусы - обновление выполнять только с обновлением приложения (если это минус) , дополнительно в приложении надо слой бизнес логики строить.

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

у тебя вот написаны 2 процедуры - как ты будешь уверен через 3 месяца, что они поддерживают тот же функционал, что и сегодня без тестов? никак.

обычно заводят логический слой - типа классы OrderService, в котором реализовывают методы, занимающиеся формированием заказа, как у тебя. в БД такие классы не лезут - для этого отдельный слой заводят.

в общем срач не первый на эту темы.

подходов 2 - у каждого есть плюсы и минусы. выбери для себя что тебе важнее по приоритетам и его и используй
5 сен 19, 08:50    [21964189]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Программирование Ответить