Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Prolog
Перезагрузить страницу Массивы, матрицы и факты (VIP)
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Passeriformes Passeriformes вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.10.2006
По умолчанию 15.10.2006, 03:14

Здравствуйте,

Вопрос мой такой: Насколько оправдано в VIP использование фактов в качестве индексированных массивов и сильно разреженных матриц?

Например, следующий код строит начальный опорный план классической транспортной задачи методом северо-западного угла (вызов - nwc(1,1))

Код:
class facts - limitations
    a:(integer, real). /*номер склада, количество товара*/
    b:(integer, real). /*номер магазина, количество требуемого товара*/
class facts - answere
    x:(integer,integer,real).    /*номер склада, номер магазина, количество*/

...
    
    nwc(I,_) :- I>n,!.    /*всего n складов*/
    nwc(_,J) :- J>m,!.    /*всего m магазинов*/
    nwc(I,J) :-
        a(I, Ai), b(J, Bj),
        Ai>Bj,!,
        assert(x(I,J,Bj)),
        retractall(a(I,_)),
        assert(a(I,Ai-Bj)),
        nwc(I,J+1),!.
    nwc(I,J) :-
        a(I, Ai), b(J, Bj),
        assert(x(I,J,Ai)),
        retractall(b(J,_)),
        assert(b(J,Bj-Ai)),
        nwc(I+1,J),!.
      nwc(_,_) :-
        write("Error!").
У меня фактически нет опыта программирования на прологе, поэтому, возможно, я делаю что-то странное, пропуская очевидные лучшие варианты. Это я как бы оправдываюсь и прошу быть поснисходительнее :roll:
Ответить с цитированием
  (#2 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 15.10.2006, 13:02

Цитата:
Насколько оправдано в VIP использование фактов в качестве индексированных массивов и сильно разреженных матриц?
Для Вашей задачи, мне кажется, вполне оправдано и достаточно удобно. Для больших таблиц можно, в принципе, использовать binary, что тоже достаточно удобно.
Цитата:
Например, следующий код строит начальный опорный план классической транспортной задачи методом северо-западного угла
Пока что не строит.
Когда заработает правильно, я думаю, что можно будет пообсуждать идеи по оптимизации кода.
Ответить с цитированием
  (#3 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 15.10.2006, 20:21

Вот простой способ построить начальный опорный план методом северо-западного угла:
Код:
nwc():-
        programControl::repeat(),     
            B=programControl::getBackTrack(),
            retract(a(I,Ai)), 
            retract(b(J,Bj)),
            programControl::cutBackTrack(B),
            if Ai>Bj then assert(x(I,J,Bj)), asserta(a(I,Ai-Bj))
            else assert(x(I,J,Ai)), asserta(b(J,Bj-Ai)) 
            end if,
         not(a(_,_)), 
         !.
Суммарное количество товаров на складах здесь должно быть равно суммарным потребностям товаров в магазинах. Если это условие не выполняется, то лучше заранее добавить фиктивный склад или фиктивный магазин, т.е. соответствующий факт для a или для b.
Ответить с цитированием
  (#4 (permalink)) Старый
Passeriformes Passeriformes вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.10.2006
По умолчанию 16.10.2006, 01:01

Спасибо, Alison.

Ваше решение, как я понял, для VIP7. У меня, увы, только 6.3. Красивое решение:) До конца так и не понял пока.

Мой код работал у меня в голове и по крайней мере на одном примере в прологе. Честно говоря, не представляю, что там может быть не так. Хотя, все может быть, конечно, буду смотреть...
Ответить с цитированием
  (#5 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 16.10.2006, 12:12

Цитата:
Ваше решение, как я понял, для VIP7. У меня, увы, только 6.3.
Вот то же самое для VIP 6.3:
Код:
nwc():-
    repeat(),     
        B = getBackTrack(),
            retract(a(I,Ai)), 
            retract(b(J,Bj)),
        cutBackTrack(B),
        set(I,J,Ai,Bj),
    not(a(_,_)), 
    !.  
   
set(I,J,Ai,Bj):- Ai>Bj, !, assert(x(I,J,Bj)), asserta(a(I,Ai-Bj)).
set(I,J,Ai,Bj):- assert(x(I,J,Ai)), asserta(b(J,Bj-Ai)).
Ну и, как и раньше, в исходной БД записи для a и b должны идти по порядку номеров.

А что мешает скачать VIP7 PE? Возможностей в нем больше, чем в 6.3.
Цитата:
Мой код работал у меня в голове и по крайней мере на одном примере в прологе. Честно говоря, не представляю, что там может быть не так.
Не работает, например, для следующих исходных данных:
Код:
a(1, 3.0).
a(2, 2.0).
   
b(1, 1.0).
b(2, 2.0).
b(3, 2.0).
Ну и раз речь идет о современных версиях VIP.
Наверное, стоит использовать стиль ООП и создать кучу объектов-ячеек таблицы.
В каждой ячейке хранить:
  • индексы ячейки (номер склада и номер магазина);
    стоимость доставки единицы товара от этого склада к этому магазину;
    переменную с текущей величиной поставки (или неозначенную, если поставки нет).
Я думаю, что это удобно, тем более что в транспортной задаче все делается однозначно, по вполне определенному алгоритму.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
Passeriformes Passeriformes вне форума
Новичок
 
Сообщений: 10
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.10.2006
По умолчанию 16.10.2006, 16:30

Цитата:
Не работает, например, для следующих исходных данных:
Код:
a(1, 3.0).
a(2, 2.0).
   
b(1, 1.0).
b(2, 2.0).
b(3, 2.0).
Не понимаю. Работает, план такой:
x(1,1,1).
x(1,2,2).
x(2,2,0).
x(2,3,2).
Ответить с цитированием
  (#7 (permalink)) Старый
Alison Alison вне форума
Member
 
Сообщений: 4,771
Сказал(а) спасибо: 0
Поблагодарили 119 раз(а) в 116 сообщениях
Регистрация: 17.11.2004
По умолчанию 16.10.2006, 17:25

И вправду работает!
Видно, я сначала не туда посмотрела (на самом деле, с константами для n и m промахнулась).
Значит, теперь у Вас есть два варианта для метода С-З угла.
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
База содержит факты произвольного вида. Переместить часть фактов в другую базу данных alsu Prolog 0 19.05.2011 15:44
Ввести размерность матрицы m x n и элементы матрицы ket Assembler 0 03.01.2011 21:19
Массивы! opel6 Pascal 12 28.12.2010 13:38
Двумерные массивы (матрицы) Zevsnet Pascal 0 02.12.2010 14:08
Удалить дублирующиеся факты с выводом соответствующих сообщений. FireWingS Prolog 1 18.06.2010 09:30
Задание матрицы в виде диагональной матрицы svik_one Вопросы начинающих программистов 2 07.05.2008 12:33
Матрицы и массивы Виталёк Форум программистов 4 01.06.2007 15:53
Матрицы и массивы. Студент КАИ Visual Basic 1 24.01.2007 12:52
Выявленные факты о BlackBox не компилируется память S.Yu.Gubanov Oberon 4 24.01.2005 12:20
ActiveX и массивы как переделать массивы Daedmen Visual C++ 1 17.04.2004 17:31



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов