Пролог - лучший язык для решения такого рода проблем? - PullRequest
3 голосов
/ 19 марта 2010

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

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

a + b + c >= 100
d + e + f >= 50
g + h     >= 30

if (8b + 2e + 7h > 620) then y = 0.8 else y = 1.0
if (d > 35)             then x = 0.9 else x = 1.0

5xa + 8yb + 5c + 3xd + 2ye + 2f + 6xg + 7yh = w.

Мне нужно найти значения a, b, c, d, e, f, g и h, которые минимизируют w.

Обратите внимание, что выше приведен только пример. В реальной программе я бы использовал до 10000 переменных и до 20 предложений if..then. Это исключает линейное программирование как альтернативный метод, потому что для тестирования всех проблем с LP потребовалось бы слишком много ОЗУ и времени.

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

Ответы [ 3 ]

4 голосов
/ 20 апреля 2010

Вы можете взглянуть на программирование логики ограничений: CLP (R), CLP (Q) или CLP (FD). Ваша проблема может быть закодирована в CLP (R) следующим образом (я думаю):

:- use_module(library(clpr)).

test(sol([A,B,C,D,E,F,G,H], [X,Y,W])) :-
    {A >=0, B >=0, C>=0, D>=0, E>=0, F>=0, G>=0, H>=0},
    {A + B + C >= 100},
    {D + E + F >= 50},
    {G + H     >= 30},
    {5*X*A + 8*Y*B + 5*C + 3*X*D + 2*Y*E + 2*F + 6*X*G  + 7*Y*H = W},
    (({8*B + 2*E + 7*H > 620},{Y=0.8}) ; ({8*B + 2*E + 7*H =35},{X=0.9}) ; ({D=

<p>Using SICStus Prolog, I get the following answer:</p>


| ?- test(A).
A = sol([_A,0.0,_B,0.0,_C,_D,30.0,0.0],[1.0,1.0,780.0]),
{_A=100.0-_B},
{_C=50.0-_D},
{_B==0.0},
{_D>=0.0} ? ;
no
3 голосов
/ 19 марта 2010

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

Сначала разбейте задачу на две проблемы (поскольку LP не поддерживает два условия if, которые у вас есть):

Constraints:
a + b + c >= 100
d + e + f >= 50
g + h     >= 30
8b + 2e + 7h > 620

Linear function:
5 * 0.8a + 8 * 1.0b + 5c + 3 * 0.8d + 2 * 1.0e + 2f + 6 * 0.8g + 7 * 1.0h = w

И

Constraints:
a + b + c >= 100
d + e + f >= 50
g + h     >= 30
d > 35

Linear function:
5 * 1.0a + 8 * 0.9b + 5c + 3 * 1.0d + 2 * 0.9e + 2f + 6 * 1.0g + 7 * 0.9h = w

После того, как вы запустите оба по отдельности с помощью решателя LP, решение получит значения a, b, c, d, e, f, g, h и w.Выберите меньшее значение w и соответствующие значения a, b, c, d, e, f, g, h.

Как это работает?

Два if условияэффективно аналогичны другим перечисленным ограничениям, просто они влекут за собой разные значения x и y.Поскольку эти два условия являются взаимоисключающими (учитывая, что оба не могут быть выполнены, поскольку x и y, следовательно, будут иметь разные значения), вы можете разделить их на две отдельные задачи LP.В результате вы решаете проблемы LP индивидуально, и, следовательно, вы получите минимальное значение w.

Для решателя LP перейдите к статье Википедии о линейном программировании, как указано выше.Существуют такие инструменты, как Excel и некоторые другие, которые проще в использовании, но если вам нужна программа, то есть числовые языки, которые хороши в этом, или языки общего назначения, такие как C, которые могут сделать это с библиотекой, такой как glpk.

Надеюсь, это поможет!

1 голос
/ 19 марта 2010

Я раньше не сталкивался с подобными проблемами, поэтому не могу дать вам никаких прямых предложений. Однако я бы не стал использовать для этого Пролог. Пролог действительно хорош для решения символических задач (классическим примером будет головоломка Эйнштейна ), но его математическая поддержка очень неудобна; Такое чувство, что математика была задета как запоздалая мысль.

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