Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование в широком смысле слова > Алгоритмика

Алгоритмика Об алгоритмах вообще; методы, обсуждения способов решения

Ответ
 
Опции темы
Старый 20.08.2011, 19:03   #1
genroelgvozo
Нуждающийся
 
Регистрация: 08.05.2008
Сообщений: 87
Написано 9 полезных сообщений
(для 15 пользователей)
Геометрическая задачка

Итак одна геометричесая задача. Прошу сказать кто какое решение видит.
Даны N точек в трехмерном пространстве (координаты известны)
найти координаты точки, такой что, расстояние от нее до самой дальней из данных точек было бы наименьшим из всех возможных
(Offline)
 
Ответить с цитированием
Старый 20.08.2011, 20:01   #2
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Геометрическая задачка

Центр что ли?
1.Берешь для каждой точки и в цикле узнаешь максимальное расстояние до точки из множества. Пишешь данные в массив array[n]. Потом выбираешь из массива ту у которой минимальное значение. Это будет та точка.

2.Еще можно для каждой посчитать сумму всех расстояний до других точек и выбрать ту, что с минимальной суммой.
В первом варианте получится точка где-то по центру множества, а во втором там где плотность выше.
(Offline)
 
Ответить с цитированием
Старый 20.08.2011, 20:06   #3
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Геометрическая задачка

Мой вариант:
1) сложить все x|y|z точек и поделить на N. Получим cx, cy, cz
2) Перебрать все точки, находить растояние от неё до С. r = (cx-x)^2+(cy-y)^2+(cz-z)^2
(корень убрать для скорости)
3) та, у которой r минимальна - исходная



upd: вот накатал =)
#include <cstdio>

struct point
{
    
float xyz;
    
point()
    {
        
0;
        
0;
        
0;
    }
};

float get_r(point apoint b)
{
    return (
a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z);
}

int main()
{
    
int n;
    
scanf("%d", &n);
    
point c;
    
point *mas = new point[n];

    for(
int i 0ni++)
    {
        
scanf("%f %f %f", &mas[i].x, &mas[i].y, &mas[i].z);
        
c.+= mas[i].x;
        
c.+= mas[i].y;
        
c.+= mas[i].z;
    }

    
c./= n;
    
c./= n;
    
c./= n;

    
float min_r get_r(mas[0], c);
    
int min_i 0;

    for(
int i 1ni++)
    {
        
float r get_r(mas[1], c);
        if(
min_r)
        {
            
min_r r;
            
min_i i;
        }
    }

    
printf("\n%f %f %f\n"mas[min_i].xmas[min_i].ymas[min_i].z);

    return 
0;

(Offline)
 
Ответить с цитированием
Старый 21.08.2011, 18:23   #4
genroelgvozo
Нуждающийся
 
Регистрация: 08.05.2008
Сообщений: 87
Написано 9 полезных сообщений
(для 15 пользователей)
Ответ: Геометрическая задачка

Мда, извеняюсь не правильно написал
найти другую точку (отличную от данных) такую чтобы, от неет растояние до самой дальней из данных точек было наименьшим

Кстати Ден, ты случаем на кодфорсес не обитаешь?)
а то твою темку увидел про проверяющую систему, и задачка про префиксы вроде как оттуда, хотя может и с тимуса
(Offline)
 
Ответить с цитированием
Старый 21.08.2011, 19:11   #5
den
Дэвелопер
 
Аватар для den
 
Регистрация: 13.02.2010
Сообщений: 1,645
Написано 620 полезных сообщений
(для 2,419 пользователей)
Ответ: Геометрическая задачка

Мда, извеняюсь не правильно написал
найти другую точку (отличную от данных) такую чтобы, от неет растояние до самой дальней из данных точек было наименьшим
ну тогда:
сложить все x|y|z точек и поделить на N. Получим cx, cy, cz - координаты искомой точки.

#include <cstdio>

int main()
{
    
int n;
    
float cx 0cy 0cz 0;
    
scanf("%d", &n);
    for(
int i 0ni++) 
    {
        
float xyz;
        
scanf("%f %f %f", &x, &y, &z);
        
cx += x;
        
cy += y;
        
cz += z;
    }
    
printf("\n%f %f %f\n"cx/ncy/ncz/n);

хотя что уж слишком просто, наверника неправильно

Кстати Ден, ты случаем на кодфорсес не обитаешь?)
а то твою темку увидел про проверяющую систему, и задачка про префиксы вроде как оттуда, хотя может и с тимуса
на кодефорсес иногда решаю
а ещё на нашем сайте: contester.tsure.ru
(Offline)
 
Ответить с цитированием
Старый 21.08.2011, 19:34   #6
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Геометрическая задачка

Ужасный инженерный способ:
Представляешь, что у каждой точки есть масса. Считаешь общий момент инерции относительно произвольной точки.

Твоя точка это та в которой момент инерции минимальный. Есть маааленькая кучка формул из термеха как находить весь этот ужас и считать момент инерции относительно другой оси если известен относительно другой. Из них можно выкопать нужный алгоритм. И это будет правильно, но надо ли оно тебе?

Центр тяжести.
Центром тяжести тела называется точка, относительно которой суммарный момент сил тяжести, действующих на систему, равен нулю. Например, в системе, состоящей из двух одинаковых масс, соединённых несгибаемым стержнем, и помещённой в неоднородное гравитационное поле (например, планеты), центр масс будет находиться в середине стержня, в то время как центр тяжести системы будет смещён к тому концу стержня, который находится ближе к планете (ибо вес массы P = m·g зависит от параметра гравитационного поля g), и, вообще говоря, даже расположен вне стержня.

Можно для двух-трех точек определить вектор направления гравитации. Поидее они пересекутся, там центр тяжести

В твоем случае f=G*m*M/R^2

Здесь G — гравитационная постоянная, равная примерно 6,6725Ч10-11 мі/(кг·сІ).

Направлена по вектору соединяющему точку для которой считаешь. Складываешь N векторов. результат показывает в сторону центра тяжести.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
HolyDel (21.08.2011)
Старый 21.08.2011, 19:42   #7
genroelgvozo
Нуждающийся
 
Регистрация: 08.05.2008
Сообщений: 87
Написано 9 полезных сообщений
(для 15 пользователей)
Ответ: Геометрическая задачка

к сожалению это не центр тяжести
и кстати в термехе не такие уж и сложные формулы)
и то что назвал ден как раз центр масс и считает, только учитывая то что массы у точек одинаковы
а вот точка из задачи ищется по другому
я знаю итерационный метод, хотелось бы узнать есть ли какой нибудь точный
(Offline)
 
Ответить с цитированием
Старый 21.08.2011, 19:53   #8
genroelgvozo
Нуждающийся
 
Регистрация: 08.05.2008
Сообщений: 87
Написано 9 полезных сообщений
(для 15 пользователей)
Ответ: Геометрическая задачка

Да именно, тут не сумарный момент минимален (ну или равен нулю) а лишь одно расстояние
вот пример
5 точек
5 0 0
-5 0 0
0 3 4
4 -3 0
2 2 -2
центр тяжести для них (при условии равенства масс) 1.2 0.4 0.4
а ответ к задаче точка 0 0 0
от этой точки расстояние до самой дальней наименьшее
(Offline)
 
Ответить с цитированием
Старый 21.08.2011, 19:55   #9
dsd
Мастер
 
Аватар для dsd
 
Регистрация: 13.06.2011
Сообщений: 1,103
Написано 481 полезных сообщений
(для 1,836 пользователей)
Ответ: Геометрическая задачка

Момент инерции зависит от расстояний масс от оси инерции, где минимальный там расстояния наименьшие.
(Offline)
 
Ответить с цитированием
Старый 21.08.2011, 19:58   #10
genroelgvozo
Нуждающийся
 
Регистрация: 08.05.2008
Сообщений: 87
Написано 9 полезных сообщений
(для 15 пользователей)
Ответ: Геометрическая задачка

у центра тяжести минимальна сумма, но из этого не следует (если ты хорошо математику учил) что наибольший элемент наименьший
да и че споришь, я тебе пример привел, не веришь сам проверь
(Offline)
 
Ответить с цитированием
Старый 22.08.2011, 11:16   #11
genroelgvozo
Нуждающийся
 
Регистрация: 08.05.2008
Сообщений: 87
Написано 9 полезных сообщений
(для 15 пользователей)
Ответ: Геометрическая задачка

Все таки я нашел точное решение, которое работает за O(n^4) что достаточно много
Короче по теореме хелли и следующей из нее теореме юнга можно перебрать все двойки тройки и четверки точек и найти центр наименьшего шара, включающих их. После выбрать центр наименьшего из полученных шаров. Но такое решение в систему по времени не проходит, проходит только приближенное
там по условие может быть погрешность не больше 10-6
ну а численных решений неколько, самое быстрое это три вложенных тернарных поиска по координатам (хотя многие делали и одним)
(Offline)
 
Ответить с цитированием
Старый 26.08.2011, 01:59   #12
alcoSHoLiK
Дэвелопер
 
Регистрация: 17.01.2006
Сообщений: 1,512
Написано 78 полезных сообщений
(для 110 пользователей)
Ответ: Геометрическая задачка

Интересная задачка. Только по-моему, это задача оптимизации, поэтому физическими способами ее и не получается решить. Для практических задач эффективней искать численным способом решение, мне кажется. Есть разные итеративные методы.

С досадой обнаружил факт, что практически все знания по этой теме выветрелись из головы со времен универа.
(Offline)
 
Ответить с цитированием
Старый 26.08.2011, 18:02   #13
genroelgvozo
Нуждающийся
 
Регистрация: 08.05.2008
Сообщений: 87
Написано 9 полезных сообщений
(для 15 пользователей)
Ответ: Геометрическая задачка

ну итеративных много, как я уже сказал можно тернарник
а если по проще то вообще брать любую точку и все время приблидаться во сколько то раз к самой дальней, уменьшая кооэфициэнт приближения, итак пока не получим нужную погрешность, но этот будет во многих случаях дольше чем тернарник
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 23:27.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com