thedeemon: (office)
[personal profile] thedeemon
Называются ли разработчики космической программы космическими программистами?

В наше темное время, когда NASA закрылось, а Роскосмос вставляет датчики положения вверх ногами, регулярно бороздя космическими кораблями пашни Казахстана и просторы Тихого океана, вся надежда человечества сосредоточена на небольшой группе людей, знакомых с кроссплатформенной игрушкой Kerbal Space Program, а надежда этих людей лежит сегодня на вас: нужно написать программу, которая бы изобретала ракеты, оптимально приспособленные под параметры миссии. Входных параметров всего два: масса полезного груза и Delta-V бюджет миссии (определяемый планируемым маршрутом корабля), программа должна придумать конфигурацию ракеты минимальной массы, способной подняться в космос и доставить груз по назначению.
Подробное описание задачи здесь. Там же ссылка на онлайн-калькулятор, в котором можно проверить свое решение и посмотреть, как идет расчет.

Задача проходит в рамках октябрьского конкурса по функциональному программированию, но с измененными правилами. Побеждает не тот, кто пришлет решение раньше, а тот, чьи ракеты для предложенных миссий окажутся легче, а поиск конфигураций - быстрее. Ответы с найденными конфигурациями, ссылками на исходники и указанием времени работы оставляйте здесь. Комментарии будут скрыты в течении 72 часов. Открытое обсуждение условий на страничке конкурса, ну и тут тоже можно, только могут быть некоторые задержки с открытием таких комментов.



Upd: время вышло, ответы открыты, подводим итоги:

  Mun Kerbol Moho sumlanguage
Nikita Beloglazov 224.325 113.899467.7125 805.9365Clojure
Sanny Sanoff 223.6125 128.975 504.75 857.3375Java
Alex Pashkov222.7875116.1499552890.9374Haskell
kerbal_nut 225.05 115.462499603.30943.8125Python


Похоже, наш победитель - Никита Белоглазов с решением на Clojure!
Если есть вопросы или лучшие идеи по оценке решений, еще не поздно тут обсудить.
Я думаю, окончательные результаты опубликует у себя хозяин конкурса ФП(ФП) [livejournal.com profile] _darkus_.
From: [identity profile] livejournal.livejournal.com
Пользователь [livejournal.com profile] _darkus_ сослался на вашу запись в записи «Октябрьский конкурс по ФП запущен (http://users.livejournal.com/_darkus_/697327.html)» в контексте: [...] математических задач, которые обычно задаю я. Приглашайтесь. Комментарии с ответами ждём здесь [...]

Date: 2013-10-11 06:33 am (UTC)
From: [identity profile] macrop.livejournal.com
Интереснно как программирование в Космонафтике отличается в NASA и у нас...
Про ихнее очень много наслышан и читал много...
From: [identity profile] serge shikov (from livejournal.com)
Что в НАСА, что у нас?

Это весьма упрощенная игрушечная постановка.
From: [identity profile] thedeemon.livejournal.com
Совершенно верно, задача игрушечная. Но сама по себе довольно занятная, т.к. перебор требует слишком много времени, а динамическое программирование тут не работает, по крайней мере, я не увидел способа. Метод ветвей и границ тоже не сильно помогает.
From: [identity profile] serge shikov (from livejournal.com)
Да, причем условия задачи не дают применить одну хорошую эвристику: брать параметры, близкие к реальным, применяемым в жизни :) Ну хотя бы потому, что минимальные ускорения для второй и последующих ступеней ограничены снизу, что по-идее должно сразу отсекать применение движков типа ионных (впрочем, их и так нет в наличии :)
Edited Date: 2013-10-12 05:33 am (UTC)
From: [identity profile] thedeemon.livejournal.com
В игре есть такой ионный двигатель:
http://wiki.kerbalspaceprogram.com/wiki/PB-ION_Electric_Propulsion_System
Но это больше для мелкого маневрирования, в данной задаче его не используем. Из используемых ближе всего к ионному
http://wiki.kerbalspaceprogram.com/wiki/LV-N_Atomic_Rocket_Engine
Он очень эффективен в вакууме, но слабоват по тяге. Если их взять несколько штук в одной ступени, то больше 5 м/с^2 получить несложно.
From: [identity profile] alex pashkov (from livejournal.com)
Дим, а почему, собственно
динамическое программирование тут не работает
?
Моё решение - это как раз динпрог. Правда, где-то явно закрался баг (возможно, косяк с вещественной арифметикой), иначе бы он мне нашёл все оптимальные решения. Но изъяна в логике я пока не вижу.

А логика такая.
Берём все разрешённые спецификацией конфигурации одной ступени - это будет множество S. Это уже почти фазовое пространство для динпрога, только нужно в него перетащить еще совместные ограничения на стартовую массу, дефицит дельта-v и высоту ракеты (они все моноиды, т.ч. с полугрупповым свойством всё будет хорошо). Итак, фазовое пространство X = S x M x V x H. В роли "времени" или "слоя" для динпрога будет, естественно, выступать номер ступени.

Стартуем динпрог со множества всех разрешённых спецификацией конструкций головной части (наличие центральной секции, acc_vac >= 5.0).

Далее на каждом слое динпрога отсекаем:
- все ракеты, не удовлетворяющие динамическим требованиям в вакууме (acc_vac >= 5.0)
- все ракеты, не удовлетворяющие динамическим требованиям в атмосфере (dv <= 5000 => acc_atm >= 15.0)  (Ха! как раз это условие неправильное, вот и нашлась ошибочка...)
- все ракеты, не проходящие по суммарной высоте (h <= 7)
- все ракеты, не проходящие по взлётной массе (начинаем с 700т, потом - масса наилучшего найденного so far претендента на решение)
- все ракеты, которые "хуже" одной из уже имеющихся в текущем слое, т.е. (m1,dv1,h1) <= (m2,dv2,h2)
(на деле тут чуть тоньше, т.к. надо учитывать еще тип ступени и её диаметр - но это несущественно)

Среди оставшихся вариантов ищем претендента на решение, т.е. конфигурацию с наименьшей массой из имеющих отрицательный дефицит (атмосферного) дельта-v. (И вот сюда-то как раз надо проверку dv <= 5000 => acc_atm >= 15.0 добавить)

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

Останавливаем процесс либо после 7 слоёв, либо после опустошения текущего множества разрешённых конфигураций.
Если к этому моменту у нас есть претендент на решение, то он им и является.

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

p.s. Эх, измельчала космонавтика... 700т максимальной стартовой массы. То ли дело Сатурн-5 со своими 2800т (!)
p.p.s. Возможный баг спецификации: нет требования, чтобы высота ступени третьего типа не превосходила высоту ступени первого типа, к которой она крепится; калькулятор это тоже не энфорсит
p.p.p.s. А в чём фишка Laythe? И что такое "РОБОТОТЕХНИКА"?
From: [identity profile] thedeemon.livejournal.com
Возможно, я просто не с той стороны к динпрогу подходил, надо над твоим вариантом подумать еще. Исходники не покажешь, кстати?

700 тонн это следствие наложенных мной тут в задаче ограничений, в самой игре можно намного больше ракеты строить, плюс еще твердотопливные бустеры есть, которые мы тут не использовали.

Про высоты ступеней самое смешное, что такая проверка изначально была, но потом я от нее отказался:

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

Laythe - далекая планета, и в рамках ограничений этой задачи туда можно было отправить лишь тонны 3 груза, для более тяжелого груза нужна ракета побольше. Это я выяснил уже после начала контеста, но менять не стал, ибо вдруг решение все же есть и просто я не нашел, а также интересно было проверить, как программы участников будут обрабатывать случай отсутствия решения.

РОБОТОТЕХНИКА - это часть программы _darkus_'a в рамках его серии конкурсов. Он в них какие-то слова прячет, которые по идее надо в течении года собирать и потом как-то в очки конвертировать. Сам не знаю подробностей.
From: [identity profile] thedeemon.livejournal.com
>Среди оставшихся вариантов ищем претендента на решение, т.е. конфигурацию с наименьшей массой из имеющих отрицательный дефицит (атмосферного) дельта-v.

А что значит "отрицательный дефицит (атмосферного) дельта-v"?
Из подходящих ступеней на этом уровне выбираем самую легкую что-ли? Я не вижу, почему это должно давать оптимальное решение. Среди лучших найденных решений часто самая верхняя ступень имеет много баков с топливом.
From: [identity profile] alex pashkov (from livejournal.com)
> Из подходящих ступеней на этом уровне выбираем самую легкую что-ли?

Нет, конечно. Видимо, я непонятно изложил.
Попробуй прочитать алгоритм, пропустив абзац, начинающийся со слов "Среди оставшихся вариантов...".

Это и будет схема для динпрога. Вся её соль заключается в возможности на каждом слое отсеять (львиную) часть конфигураций, которые "хуже", чем какие-то из уже известных. Под словом конфигурация я понимаю не одну ступень, а всю построенную ракету.

А теперь добавляем в этот алгоритм запоминание текущего лучшего решения ("Среди оставшихся вариантов бла-бла-бла...")

> А что значит "отрицательный дефицит (атмосферного) дельта-v"?

Параметр dv у конфигурации в моём решении - это сколько ей не хватает до заданного в условиях задачи дельта-v.
Т.е. не бюджет, а его дефицит. Так удобнее. Получается вот что:
dv (i) = dv (i+1) - isp_vac * g_ln_m_i

Но когда мы проверяем, является ли некоторая конфигурация решением, то для нижней ступени нужно смотреть на
dv_atm (1) = dv (2) - isp_atm * g_ln_m_i

Ну и там же надо проверять условие, которое я ошибочно поставил в правила отсечения:
dv (i) <= 5000 => acc >= 15.0, i=1..n

p.s. Мои исходники - это крайне неидиоматический хаскель. Показывать их стыдно :-)
From: [identity profile] thedeemon.livejournal.com
А, кажется, начинаю понимать, спасибо.
From: [identity profile] thedeemon.livejournal.com
_darkus_, хозяин этой серии конкурсов, слезно просит посмотреть исходники, пусть и крайне неидиоматичные. Решение-то интересное, и язык расово верный.

Date: 2013-10-11 04:43 pm (UTC)
From: [identity profile] urod.livejournal.com
Программа должна быть именно на функциональном языке? С++ (С, Алгол-60, ПЛ/1, Кобол) не подойдёт?

Date: 2013-10-12 03:10 am (UTC)
From: [identity profile] thedeemon.livejournal.com
На любом языке можно.

Начальный сабмишен

Date: 2013-10-11 08:46 pm (UTC)
From: [identity profile] kerbal-nut.livejournal.com
Решения получены халтурным Монте-Карло за 110с каждое.

Кстати, я ещё в процессе экспериментирования с калькулятором получил зелёную строчку "РОБОТОТЕХНИКА" под листингом расчётов, правда соответствующую ракету для Mun не сохранил. Повторный запуск строчки не дал, поэтому я предполагаю что она служит индикатором рекорда.

https://github.com/Vlad-Shcherbina/kerbal/blob/b71541f5b4218cfad342bb3e288184ad752946bc/production/monte_carlo_solver.py

Mun
330.5625 7011.15932633
[
    {
        "fuel": "FL-T100 Fuel Tank", 
        "engine": "LV-T45 Liquid Fuel Engine", 
        "central": true, 
        "numSideParts": 2, 
        "numEngines": 1, 
        "height": 3
    }, 
    {
        "fuel": "Rockomax X200-16 Fuel Tank", 
        "engine": "LV-T45 Liquid Fuel Engine", 
        "central": true, 
        "numSideParts": 6, 
        "numEngines": 7, 
        "height": 1
    }, 
    {
        "fuel": "Rockomax X200-32 Fuel Tank", 
        "engine": "Rockomax \"Mainsail\" Liquid Engine", 
        "central": true, 
        "numSideParts": 3, 
        "numEngines": 4, 
        "height": 3
    }
]

Kerbol
220.95 12074.873437
[
    {
        "fuel": "FL-T400 Fuel Tank", 
        "engine": "LV-N Atomic Rocket Engine", 
        "central": true, 
        "numSideParts": 2, 
        "numEngines": 1, 
        "height": 1
    }, 
    {
        "fuel": "Rockomax X200-8 Fuel Tank", 
        "engine": "Rockomax \"Mainsail\" Liquid Engine", 
        "central": true, 
        "numSideParts": 3, 
        "numEngines": 1, 
        "height": 2
    }, 
    {
        "fuel": "Rockomax Jumbo-64 Fuel Tank", 
        "engine": "Rockomax \"Mainsail\" Liquid Engine", 
        "central": true, 
        "numSideParts": 3, 
        "numEngines": 4, 
        "height": 1
    }
]

Условие

Date: 2013-10-11 11:07 pm (UTC)
From: [identity profile] nikita beloglazov (from livejournal.com)
Вопрос следующий: верно ли то, что число двигателей на каждой ступени влияет только на тягу, а на импульс никак не влияют?
Edited Date: 2013-10-11 11:35 pm (UTC)

Re: Условие

Date: 2013-10-12 03:12 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Да, на тягу и массу. Поскольку в пределах одной ступени двигатели одинаковые, общий удельный имульс у них такой же, как у одного. Если бы были разные, пришлось бы пересчитывать по более сложной формуле:
http://wiki.kerbalspaceprogram.com/wiki/Cheat_Sheet

Date: 2013-10-12 03:22 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Уже есть первое решение, c ракетой до Mun массой 330 тонн. Хинт: его можно улучшить еще на 100 тонн по меньшей мере.

Date: 2013-10-12 03:28 pm (UTC)
From: [identity profile] kerbal-nut.livejournal.com
Зачем нужен двигатель "LV-T45 Liquid Fuel Engine"? У он тяжелее, у него меньше тяга, а в остальном он такой же как "LV-T30 Liquid Fuel Engine".

Также избыточным кажется бак "Rockomax X200-8 Fuel Tank".

Date: 2013-10-12 04:52 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
T45 может управлять направлением тяги, что на практике очень хорошее свойство, с неуправляемым двигателем обеспечить ровный взлет и маневрирование довольно сложно.

Бак Х200-8 отличается от аналога того же объема своим диаметром. Если под ним большой двигатель и сверху тоже что-то большое, ставить узкий бак может быть плохо, т.к. крепкость и устойчивость конструкции падает, в этом месте велик шанс разлома.

Но все эти тонкости уже за пределами данной задачи.

точность

Date: 2013-10-12 05:13 pm (UTC)
From: [identity profile] sanny sanoff (from livejournal.com)
у тебя в коде:

log (13.5 / 11.5) * 370 * 9.816 = 582.3517051814985

у меня в JS/Haskell/Java:

Prelude> log (13.5 / 11.5) * 370 * 9.816
582.3516776610459

Чото не так, есть мизерный шанс, что это будет влиять, но всё равно непонятно. ELM сам считает логарифм?

Re: точность

Date: 2013-10-12 05:51 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
У него в прелюде нет натурального логарифма, поэтому код такой, с не самым точным е:
dV = logBase 2.718281828 (m_start / m_end) * isp * 9.816
Завтра могу сделать поточнее.

Re: точность

Date: 2013-10-12 10:58 pm (UTC)
From: [identity profile] sanny sanoff (from livejournal.com)
Обязательно исправь. Т.к. борьба будет идти за 4 знак наверняка 8)

Re: точность

Date: 2013-10-13 04:22 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Поправил. Оказалось, там даже еще запущеннее было: при генерации JS вещественные константы обрезаются до еще меньшего числа знаков, да еще и с ошибкой в последнем. :)

Re: точность

Date: 2013-10-12 11:59 pm (UTC)
From: [identity profile] sanny sanoff (from livejournal.com)
А ничего, что Isp для второй ступени и выше всегда считается в вакууме, даже если сама ступень целиком входит в начальные 5000?

Re: точность

Date: 2013-10-13 04:06 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Считать по-хорошему было бы слишком сложно. Плотность атмосферы там падает плавно экспоненциально с высотой, и у Kerbin'a официальная граница атмосферы - 70 км. Пришлось бы чуть ли не весь взлет посекундно моделировать. Так что оставим такое упрощение с первой ступенью, хоть это и приводит к забавным конфигурациям.

атмосфера

Date: 2013-10-13 04:20 pm (UTC)
From: [identity profile] serge shikov (from livejournal.com)
Ну там не так уж и сложно все с тягой, экспонента для плотности, да и все, но вот где взять высоту без учета программы тангажа? Не то чтобы набор дифуров там был уж очень сложным, но это явно была бы уже совсем другая задача.

Re: атмосфера

Date: 2013-10-13 05:01 pm (UTC)
From: [identity profile] thedeemon.livejournal.com
Совершенно верно, результат бы зависел от траектории, а она в игре определяется тем, как игрок рулит ракетой. Поэтому до такой точности доводить нет смысла.

Решение

Date: 2013-10-13 03:42 pm (UTC)
From: [identity profile] nikita beloglazov (from livejournal.com)
1. m = 10.4, ∆V = 7000 (codename: Mun)
Масса: 224.32500000000002
Время: 40сек
Конфигурация: https://github.com/nbeloglazov/fpcontests/blob/master/rocketscience-october-2013/mun.json
https://github.com/nbeloglazov/fpcontests/blob/master/rocketscience-october-2013/mun.json

2. m = 1.5, ∆V = 12000 (codename: Kerbol)
Масса: 113.89999999999999
Время: 115 сек
Конфигурация: https://github.com/nbeloglazov/fpcontests/blob/master/rocketscience-october-2013/kerbol.json

3.m = 11.0, ∆V = 10500 (codename: Moho)
Масса: 467.71250000000003
Время: 74 сек
Конфигурация: https://github.com/nbeloglazov/fpcontests/blob/master/rocketscience-october-2013/moho.json

4. m = 12.0, ∆V = 14800 (codename: Laythe)
Решение не найдено.

Вообще программа ищет решение, пока не истечёт время, попутно сохраняя лучшие решения. Таймаут настраивается, по умолчанию - 2 минуты.

Исходник и описание алгоритма: https://github.com/nbeloglazov/fpcontests/tree/master/rocketscience-october-2013

Язык: clojure

Время написания: часов 10-12.

Re: Решение

Date: 2013-10-15 09:54 pm (UTC)
From: [identity profile] x-a-e-p.livejournal.com
А если total-mass не подбирать с каким-то шагом, а дихотомией искать?

Re: Решение

Date: 2013-10-22 11:22 am (UTC)
From: [identity profile] nikita beloglazov (from livejournal.com)
Я пробовал дихотомией. Но проблема в том, что там пространство масс, для которых найдётся решение прервыно. Т.е. для первой задачи моя программа могла найти решения для масс 224, 260, а для 251 и 252 не находила. И если бы дихотомия попала на 251, то она бы решила, что меньше не может быть и сделала бы 251 нижней границей.

Финальный сабмишен

Date: 2013-10-13 07:02 pm (UTC)
From: [identity profile] kerbal-nut.livejournal.com
Mun
225.05 7001.99753996
[
    {
        "fuel": "FL-T200 Fuel Tank", 
        "engine": "LV-T30 Liquid Fuel Engine", 
        "central": true, 
        "numSideParts": 2, 
        "numEngines": 1, 
        "height": 3
    }, 
    {
        "fuel": "FL-T800 Fuel Tank", 
        "engine": "LV-T30 Liquid Fuel Engine", 
        "central": true, 
        "numSideParts": 6, 
        "numEngines": 7, 
        "height": 2
    }, 
    {
        "fuel": "Rockomax X200-32 Fuel Tank", 
        "engine": "Rockomax \"Skipper\" Liquid Engine", 
        "central": true, 
        "numSideParts": 4, 
        "numEngines": 5, 
        "height": 1
    }, 
    {
        "fuel": "FL-T200 Fuel Tank", 
        "engine": "Rockomax \"Mainsail\" Liquid Engine", 
        "central": true, 
        "numSideParts": 2, 
        "numEngines": 3, 
        "height": 1
    }
]

Kerbol
115.4625 12015.2296636
[
    {
        "fuel": "FL-T400 Fuel Tank", 
        "engine": "LV-N Atomic Rocket Engine", 
        "central": true, 
        "numSideParts": 0, 
        "numEngines": 1, 
        "height": 3
    }, 
    {
        "fuel": "FL-T400 Fuel Tank", 
        "engine": "LV-T30 Liquid Fuel Engine", 
        "central": false, 
        "numSideParts": 2, 
        "numEngines": 2, 
        "height": 3
    }, 
    {
        "fuel": "Rockomax X200-16 Fuel Tank", 
        "engine": "LV-T30 Liquid Fuel Engine", 
        "central": true, 
        "numSideParts": 6, 
        "numEngines": 7, 
        "height": 1
    }, 
    {
        "fuel": "FL-T100 Fuel Tank", 
        "engine": "Rockomax \"Skipper\" Liquid Engine", 
        "central": true, 
        "numSideParts": 2, 
        "numEngines": 3, 
        "height": 3
    }
]

Moho
603.3 10504.0617543
[
    {
        "fuel": "FL-T800 Fuel Tank", 
        "engine": "LV-N Atomic Rocket Engine", 
        "central": true, 
        "numSideParts": 2, 
        "numEngines": 3, 
        "height": 1
    }, 
    {
        "fuel": "FL-T400 Fuel Tank", 
        "engine": "LV-N Atomic Rocket Engine", 
        "central": true, 
        "numSideParts": 4, 
        "numEngines": 5, 
        "height": 1
    }, 
    {
        "fuel": "Rockomax Jumbo-64 Fuel Tank", 
        "engine": "Rockomax \"Mainsail\" Liquid Engine", 
        "central": true, 
        "numSideParts": 2, 
        "numEngines": 3, 
        "height": 2
    }, 
    {
        "fuel": "Rockomax Jumbo-64 Fuel Tank", 
        "engine": "Rockomax \"Mainsail\" Liquid Engine", 
        "central": true, 
        "numSideParts": 4, 
        "numEngines": 5, 
        "height": 1
    }, 
    {
        "fuel": "FL-T800 Fuel Tank", 
        "engine": "Rockomax \"Mainsail\" Liquid Engine", 
        "central": true, 
        "numSideParts": 6, 
        "numEngines": 7, 
        "height": 2
    }
]


В предположении что тороидалный двигатель в центральной части действительно не нужен и что моя программа правильна, Laythe решений не имеет.

https://github.com/Vlad-Shcherbina/kerbal/blob/23fa93a496b05c4f1f54b59be87c69c572389e03/production/solve_all.sh

Для получения данных конструкций солвер запускался в два процесса с ограничением в 110с.

Первые три миссии я ещё попробую ради интереса запустить ночью в большое число процессов и с большим таймлимитом.

Re: Финальный сабмишен

Date: 2013-10-14 08:33 am (UTC)
From: [identity profile] kerbal-nut.livejournal.com
В моей программе есть ошибки, потому что исчерпывающий, по замыслу, перебор не смог найти Kerbol с массой 112.2125 и Moho с массой 467.7125.

Но вот зато решение для Mun:
222.725 7001.34188801
[
    {
        "fuel": "FL-T200 Fuel Tank", 
        "engine": "LV-T30 Liquid Fuel Engine", 
        "central": true, 
        "numSideParts": 6, 
        "numEngines": 1, 
        "height": 1
    }, 
    {
        "fuel": "FL-T400 Fuel Tank", 
        "engine": "LV-T30 Liquid Fuel Engine", 
        "central": true, 
        "numSideParts": 3, 
        "numEngines": 4, 
        "height": 3
    }, 
    {
        "fuel": "Rockomax Jumbo-64 Fuel Tank", 
        "engine": "Rockomax \"Mainsail\" Liquid Engine", 
        "central": true, 
        "numSideParts": 0, 
        "numEngines": 1, 
        "height": 1
    }, 
    {
        "fuel": "Rockomax Jumbo-64 Fuel Tank", 
        "engine": "Rockomax \"Mainsail\" Liquid Engine", 
        "central": false, 
        "numSideParts": 2, 
        "numEngines": 2, 
        "height": 1
    }, 
    {
        "fuel": "FL-T800 Fuel Tank", 
        "engine": "Rockomax \"Mainsail\" Liquid Engine", 
        "central": true, 
        "numSideParts": 2, 
        "numEngines": 3, 
        "height": 2
    }
]
it took 14797.9s

Re: Финальный сабмишен

Date: 2013-10-14 08:51 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Круто! Похоже на оптимум. Надо будет построить и запустить.

IKS

Date: 2013-10-13 08:49 pm (UTC)
From: [identity profile] alex pashkov (from livejournal.com)
Mun 10.4 7000
; m=222.78750000000002
; dv=7027.3617714100865
; t=0m9.444s
[
    {
        "height": 1,
        "central": true,
        "numSideParts": 3,
        "engine": "LV-T30 Liquid Fuel Engine",
        "numEngines": 1,
        "fuel": "FL-T400 Fuel Tank"
    },
    {
        "height": 3,
        "central": true,
        "numSideParts": 3,
        "engine": "LV-T30 Liquid Fuel Engine",
        "numEngines": 4,
        "fuel": "FL-T400 Fuel Tank"
    },
    {
        "height": 1,
        "central": true,
        "numSideParts": 6,
        "engine": "LV-T30 Liquid Fuel Engine",
        "numEngines": 7,
        "fuel": "FL-T800 Fuel Tank"
    },
    {
        "height": 1,
        "central": true,
        "numSideParts": 4,
        "engine": "Rockomax \"Skipper\" Liquid Engine",
        "numEngines": 5,
        "fuel": "Rockomax X200-32 Fuel Tank"
    },
    {
        "height": 1,
        "central": true,
        "numSideParts": 2,
        "engine": "Rockomax \"Mainsail\" Liquid Engine",
        "numEngines": 3,
        "fuel": "FL-T100 Fuel Tank"
    }
]

Kerbol 1.5 12000
; m=116.14999999999999
; dv=12020.901040814302
; t=0m5.611s
[
    {
        "height": 1,
        "central": true,
        "numSideParts": 2,
        "engine": "LV-N Atomic Rocket Engine",
        "numEngines": 1,
        "fuel": "FL-T400 Fuel Tank"
    },
    {
        "height": 1,
        "central": true,
        "numSideParts": 2,
        "engine": "LV-T30 Liquid Fuel Engine",
        "numEngines": 3,
        "fuel": "Rockomax X200-16 Fuel Tank"
    },
    {
        "height": 3,
        "central": true,
        "numSideParts": 6,
        "engine": "LV-T30 Liquid Fuel Engine",
        "numEngines": 7,
        "fuel": "FL-T400 Fuel Tank"
    },
    {
        "height": 1,
        "central": true,
        "numSideParts": 2,
        "engine": "Rockomax \"Skipper\" Liquid Engine",
        "numEngines": 3,
        "fuel": "FL-T400 Fuel Tank"
    }
]

Moho 11.0 10500
; m= 552
; dv=10524.816027767874
; t=1m45.269s
[
    {
        "height": 1,
        "central": true,
        "numSideParts": 2,
        "engine": "LV-N Atomic Rocket Engine",
        "numEngines": 3,
        "fuel": "FL-T800 Fuel Tank"
    },
    {
        "height": 1,
        "central": true,
        "numSideParts": 4,
        "engine": "LV-N Atomic Rocket Engine",
        "numEngines": 5,
        "fuel": "FL-T400 Fuel Tank"
    },
    {
        "height": 1,
        "central": true,
        "numSideParts": 0,
        "engine": "Rockomax \"Mainsail\" Liquid Engine",
        "numEngines": 1,
        "fuel": "Rockomax Jumbo-64 Fuel Tank"
    },
    {
        "height": 3,
        "central": false,
        "numSideParts": 3,
        "engine": "Rockomax \"Mainsail\" Liquid Engine",
        "numEngines": 3,
        "fuel": "Rockomax X200-32 Fuel Tank"
    },
    {
        "height": 1,
        "central": true,
        "numSideParts": 4,
        "engine": "Rockomax \"Mainsail\" Liquid Engine",
        "numEngines": 5,
        "fuel": "Rockomax Jumbo-64 Fuel Tank"
    },
    {
        "height": 3,
        "central": true,
        "numSideParts": 6,
        "engine": "Rockomax \"Mainsail\" Liquid Engine",
        "numEngines": 7,
        "fuel": "FL-T200 Fuel Tank"
    }
]

Laythe 12.0 14800
решения не существует
; t=1m16.377s

SHA1: 34c7e93f56ccfcf34b83a089e9780a11d40c6735
haskell

p.s. добавил конфигурации ракет
Edited Date: 2013-10-14 06:34 am (UTC)

Date: 2013-10-14 02:35 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Есть еще несколько решений, пока что у всех разные ракеты.

Просьба Алексу и тем, кто еще будет постить: приводите не только массу ракеты, но и саму конфигурацию. Здесь или в виде ссылки.

Date: 2013-10-14 03:23 am (UTC)
From: [identity profile] sanny sanoff (from livejournal.com)
что то мой сабмит сказало отмечен как подозрительный.

Date: 2013-10-14 04:09 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Ничего страшного, сабмит успешно получен.
Это ЖЖ так на посты со ссылками от незнакомых людей реагирует, но они не теряются все равно.

submission

Date: 2013-10-14 03:20 am (UTC)
From: [identity profile] sanny sanoff (from livejournal.com)
https://bitbucket.org/sannysanoff/rock

Программа считает около 3 минут на моей тачке, стало быть может и за 2 минуты на более продвинутой (работает в 8 тредов).

Вначале генерятся все возможные типы ступеней (включая ступени высот 1 2 и 3) получается около 2183 штук.

Потом они комбинируются в цепочки из 1, 2 и 3 - считается верхняя часть (голова) для полета начиная с 5000 км до финиша. Выбирается самый легкий вариант. Потом к нему подбирается "земная", нижняя часть, ведь мы уже знаем вес головы. Выбирается снова самая легкая нижняя часть, которая может этот вес вынести на высоту 5000 км с учетом ограничений.

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

Не нашел случаев, когда голова длиной 3 была бы оптимальнее головы длиной 2. Может на длине 4?

Решения:

I) mass= 223.6125

[ { "fuel": "FL-T200 Fuel Tank",
"engine":"LV-909 Liquid Fuel Engine",
"central": true,
"numSideParts": 2,
"numEngines": 3,
"height": 3}
, { "fuel": "FL-T800 Fuel Tank",
"engine":"LV-T30 Liquid Fuel Engine",
"central": true,
"numSideParts": 6,
"numEngines": 7,
"height": 2}
, { "fuel": "Rockomax X200-32 Fuel Tank",
"engine":"Rockomax \"Skipper\" Liquid Engine",
"central": true,
"numSideParts": 4,
"numEngines": 5,
"height": 1}
, { "fuel": "FL-T100 Fuel Tank",
"engine":"Rockomax \"Mainsail\" Liquid Engine",
"central": true,
"numSideParts": 2,
"numEngines": 3,
"height": 1}
]



II) mass = 128.975

[ { "fuel": "FL-T200 Fuel Tank",
"engine":"LV-N Atomic Rocket Engine",
"central": true,
"numSideParts": 6,
"numEngines": 1,
"height": 1}
, { "fuel": "FL-T800 Fuel Tank",
"engine":"LV-T30 Liquid Fuel Engine",
"central": true,
"numSideParts": 4,
"numEngines": 5,
"height": 2}
, { "fuel": "Rockomax X200-16 Fuel Tank",
"engine":"Rockomax \"Skipper\" Liquid Engine",
"central": true,
"numSideParts": 2,
"numEngines": 3,
"height": 2}
]



III) mass = 504.75

[ { "fuel": "FL-T400 Fuel Tank",
"engine":"LV-N Atomic Rocket Engine",
"central": true,
"numSideParts": 3,
"numEngines": 4,
"height": 3},
{ "fuel": "FL-T800 Fuel Tank",
"engine":"LV-T30 Liquid Fuel Engine",
"central": true,
"numSideParts": 6,
"numEngines": 7,
"height": 1}
, { "fuel": "Rockomax Jumbo-64 Fuel Tank",
"engine":"Rockomax \"Mainsail\" Liquid Engine",
"central": true,
"numSideParts": 3,
"numEngines": 4,
"height": 2}
, { "fuel": "Rockomax X200-16 Fuel Tank",
"engine":"Rockomax \"Mainsail\" Liquid Engine",
"central": true,
"numSideParts": 6,
"numEngines": 7,
"height": 1}

]


IV = нет решения.

Maximum dV succeeded: 10767.024886966658 (not enough to reach 14000)

[ { "fuel": "FL-T800 Fuel Tank",
"engine":"LV-N Atomic Rocket Engine",
"central": true,
"numSideParts": 2,
"numEngines": 3,
"height": 1}
, { "fuel": "FL-T800 Fuel Tank",
"engine":"LV-909 Liquid Fuel Engine",
"central": true,
"numSideParts": 6,
"numEngines": 7,
"height": 1}

,
{ "fuel": "Rockomax X200-32 Fuel Tank",
"engine":"Rockomax \"Skipper\" Liquid Engine",
"central": true,
"numSideParts": 3,
"numEngines": 4,
"height": 1}
, { "fuel": "Rockomax X200-32 Fuel Tank",
"engine":"Rockomax \"Mainsail\" Liquid Engine",
"central": true,
"numSideParts": 3,
"numEngines": 4,
"height": 3}
, { "fuel": "Rockomax Jumbo-64 Fuel Tank",
"engine":"Rockomax \"Mainsail\" Liquid Engine",
"central": true,
"numSideParts": 6,
"numEngines": 7,
"height": 1}
]

Date: 2013-10-14 07:34 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Вот такая ракета для полета на Kerbol имеет массу 112.2125:

[{"central":true,"height":1,"engine":"LV-N Atomic","numSideParts":6,"numEngines":1,"fuel":"FL-T200"},

{"central":true,"height":1,"engine":"LV-T30","numSideParts":2,"numEngines":3,"fuel":"X200-16"},

{"central":true,"height":3,"engine":"LV-T30","numSideParts":6,"numEngines":7,"fuel":"FL-T400"},

{"central":true,"height":1,"engine":"Skipper","numSideParts":2,"numEngines":3,"fuel":"FL-T100"}]

Date: 2013-10-16 02:24 pm (UTC)
From: [identity profile] -darkus-.livejournal.com
Обязательно подведу итоги, но чуть позже. Разберусь с делами на работе только...

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

Date: 2013-10-19 08:58 pm (UTC)
From: [identity profile] -darkus-.livejournal.com
Дмитрий, попроси, пожалуйста, коллег прислать ссылки на исходники, хоть и на неидиоматические. Крайне интересно. Решение на Цацкеле очень хотелось бы посмотреть.

Date: 2013-10-20 05:13 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Ссылки на все решения кроме цацкелевого (которое автор слишком стыдится показывать) тут есть в комментах.

Вот мое на хаскеле, в полторы сотни строк:
http://stuff.thedeemon.com/lj/ksp2.hs
Оно бы заняло третье место из пяти, если бы участвовало. Для одной из планет нашло решение лучше, чем у всех конкурсантов. Работает в среднем около минуты.
Не учитывает вес разделителей ступеней, что на качество ответов мало влияет, но истинную массу полученных ей ракет следует проверять в онлайн-калькуляторе.
Edited Date: 2013-10-20 05:16 am (UTC)

Date: 2013-10-20 07:24 pm (UTC)
From: [identity profile] -darkus-.livejournal.com
Хорошо. Благодарю.

Profile

thedeemon: (Default)
Dmitry Popov

December 2025

S M T W T F S
 12 3456
789101112 13
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 29th, 2026 09:25 pm
Powered by Dreamwidth Studios