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;

Ответы (0 шт):