Delphi Придумать алгоритм выборки и перерасчета цен с множеством входных переменных
Придумать алгоритм выборки и перерасчета цен с множеством входных переменных
Представим есть товар его цена будет зависеть от входных переменных X1 X2...Xn как зовутся переменные и что за товар не известно (на том уровне кода, где должно это быть) переменные type double все X... это не просто значения, а диапазон значений (например от A до B c шагом С)
Пример
X[0].A:=0 //от 0
X[0].B:=10; //до 10
X[0].C:=1; //шаг 1
ResultPrice:=Main(X[0]);
Result.X:=X1;
Result.Price:=ResultPrice;
что бы посчитать для каждого возможного варианта свою цену нужно от 0 до 10 пройтись в цикле и записать все Result в array также Иксов входных может быть как 1 так и 100 у меня не возникает проблем на этом этапе перебрать все варианты возможных комбинаций и для них посчитать цену проблема в том что количество итераций всех возможных вариантов может быть миллиарды, а выходная цена интересует как можно больше скажем первые 1000 вариантов (это переменная ResultPrice) т.е все остальные итерации миллиард минус 1000 были лишними
в Main(X[0]); выполняется расчет и что он там делает мне не должно быть известно
нужен какой-то алгоритм который будет понимать зависимости от передаваемых данных в Main к получаемому ResultPrice и если цена скажем на 40% меньше минимального значения уже посчитанного то пропускать Main
Как я не думал все бъется об преграду, а друг в каком то варианте итераций есть такая комбинация значений при которой ResultPrice будет входить в первую 1000 результатов, а я его пропущу ссылаясь что у твоего ж соседа результат намного меньше чем у тебя.
Как оказалось это не страшно т.к эта цена будет выбиваться из всего остального фона и не будет соответствовать реальности поэтому вроде задача упростилась, а что делать пока не знаю
сделаю набросок кода, что бы понятнее А вот ссылка на модуль для прогона разных вариантов комбинаций
procedure TForm1.Panel3Click(Sender: TObject);
type
TVar = record
NameVar:string;
Value:double;
end;
TParamResult =record
ListVar:TArray<TVar>;
Price:Double;
end;
TItemDiapozone = record
Name:string;
Min:Double;
Max:Double;
Step:Double;
Value: Double;
end;
function GetCountOfDiapozone(V:TArray<TItemDiapozone>):int64;
begin
// получает кол-во итераций для набора переменных (комбинация разных вариантов значений)
// здесь код уже у меня есть большой поэтому не выкладываю
end;
function GetOneValueOfDiapozone(V:TArray<TItemDiapozone>;I:int64):TArray<TVar>;
begin
// получает список переменных с одним из возможных значений
// здесь код уже у меня есть большой поэтому не выкладываю
end;
function MainExp(ListVar:TArray<TVar>):double;
begin
// тут не известно что делается и мне знать не положено
end;
function Check:boolean;
begin
// тут нужна проверка которую не знаю как реализовать
// т.к CountIteration может быть оч много а память компа и время нашей жизни ограничено, что бы ждать CountIteration вызовов MainExp
end;
var
InputX: TArray<TItemDiapozone>;
var
CountIteration,I:int64;
ResultPrice:TParamResult;
ResultList:TList<TParamResult>;
begin
CountIteration:=GetCountOfDiapozone(InputX);
for I := 0 to CountIteration-1 do
begin
ResultPrice.ListVar:= GetOneValueOfDiapozone(InputX,I);
if Check { вот здесь нужна какая проверка нужно ли MainExp запускать или пропустить} then
begin
ResultPrice.Price:=MainExp(ResultPrice.ListVar);
ResultList.Add(ResultPrice);
end;
end;
// далее для ResultList идет сортировка от большего к меньшему по TParamResult.Price
// придираться к примеру не нужно
// т.к это пример что бы раскрыть суть вопроса а не загромождать "правильным кодом"
end;