LINUX.ORG.RU

Алгоритм поиска для узкой задачи


0

0

Задача... есть параметры квартир, они загружены в массив. Нужно найти более подходящие варианты для элемента i, где $a[i]->{Type} != $a[n]->{Type}. Притом, что $x->{SSize}, $x->{ESize} и $x->{Price} могут быть не объявлены, т.е. undef или по Сишному == 0.
Смысл подсчитать в процентах какой элемент на сколько подходит к варианту i.
Такого рода поиском никогда не занимался... от сюда думы и опробование разных вариантов ничего хорошего не дали =)

Описываем:
$a[0]->{Type} = 0; #Buy
$a[0]->{SSize} = 1;
$a[0]->{ESize} = 10;
$a[0]->{Price} = 5000;
$a[0]->{PriceOne} = 0; #Boolean
$a[0]->{SellPart} = 0; #Boolean

и например

$a[1]->{Type} = 1; #Seil
$a[1]->{SSize} = 3;
$a[1]->{ESize} = 7;
$a[1]->{Price} = 300;
$a[1]->{PriceOne} = 1; #Boolean
$a[1]->{SellPart} = 0; #Boolean

Первые 4 ключа хеша я думаю всем ясны, а вот:
PriceOne - если истина, то цена указана за один квадратный метр квартиры, следовательно при установленном флаге на примере $a[1] мы получаем что цена квартиры колеблица от 3*300 до 7*300
SellPart - если истина, то квартиру можно продать (но не купить!) по частям ;) следовательно я думаю если флаг установлен то если цена варианта входит в цену i, тогда годиться +n%.

Думаю вряд ли кто мне тут будет писать алгоритм, хотя если кто захочет помочь плиз можно на perl, C, Pascal и даже на qbasic :)

Я больше жду помощи объяснить мне в каком направлении делать... я дошел до того, что надо рассмотреть все варианты когда переменные объявлены и не объявлены (undef) и для каждого варианта уже просчитывать процент схожести! Но тут слишком большой и громоздский код получается :(
Есть ли какие другие идеи реализации?

ЗЫ: Если нет... буду сам дальше думать как и думал =)

★★★

>рассмотреть все варианты когда переменные объявлены и не объявлены

Не используй undef. Определи каждый параметр как пару (min,max),undef=(-бесконечность,+бесконечность), True=(1,1) False=(0,0). Или, как вариант, (значение,окрестность), undef=(0,бесконечность), True=(1,0), False=(0,0).

Нужна ф-я, определяющая "соответствие" параметра, что-то типа "наколько один диапазон пересекается с другим", если непересекаются, то значение <100%, насколько - зависит от "расстояния" и "длинны" диапазона. Применив ко всем параметрам получишь массив %ов, которые осталось правильно просуммировать(отдельная тема).

DonkeyHot ★★★★★
()

>слишком большой и громоздский код

Тогда получится приблизительно так(Python):

best=[(reduce(operator.mul, [fit(apt[param],req[param]) for param in req.keys()], 1.0),apt) for apt in Apts] где Apts - список предложений, req - запрос.

Сортируешь и на печать.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot

> Не используй undef. Определи каждый параметр как пару (min,max),undef=(-бесконечность,+бесконечность), True=(1,1) False=(0,0). Или, как вариант, (значение,окрестность), undef=(0,бесконечность), True=(1,0), False=(0,0).

Не совсем понял что такое True,False :(

Mrak ★★★
() автор топика
Ответ на: комментарий от Mrak

>Не совсем понял что такое True,False :(

"Флаговые" значения - типа Да/Нет. У тебя было 1 и 0. Кстати в варианте с "окресностями" fit будет красивее.

DonkeyHot ★★★★★
()

А еще, определив класс "координаты" с вычитанием, возвращающим расстояние автоматом получишь условия "не дальше 300 м от кабака 'Пьяный Клиент'"(если добавишь координаты последнего).

DonkeyHot ★★★★★
()

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

> Смысл подсчитать в процентах какой элемент на сколько подходит к варианту i.

нихрена не понимаю

ugly-ugly-fucker
()
Ответ на: комментарий от ugly-ugly-fucker

Там в куске кода был вызов ф-ии с таким названием.

DonkeyHot ★★★★★
()
Ответ на: комментарий от ugly-ugly-fucker

>Определенно, программирование на некоторых языках оказывает разрушительное влияние на способность внятно излагать свои мысли.

А как тебе вот это(Mrak * (*) (01.12.2004 22:47:12)):

>Не совсем понял что такое True,False

DonkeyHot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.