我有以下問題想解決。如何在Prolog中找到最佳列表組合
我有2(或更多)矩陣; a和b。
每個矩陣都有列,行和值(利潤)。
我想使用prolog從2個不同的矩陣中找到2列的組合,這將給我最多的正面利潤。
I.E.矩陣A中的ColumnX +矩陣B中的ColumnY,然後計算結果列中具有正數的值的數量。 I.E.我添加在同一行上的值。
我把下面,到目前爲止,我已經嘗試的代碼(和一個鏈接),但我的功能count_profits(可樂,COLB,P)沒有返回預期的結果。以下查詢應返回P = 2,但它返回P = 1。
count_profits(66,65.5,P).
現在我正在提供每個矩陣使用的列索引。最終,我想要一個名爲best_profit(ColA,ColB)的函數,它應該給出矩陣A中的列和矩陣B中的列,從而在組合時產生大量積極結果。從我的測試數據來看,如果我是正確的,這應該導致ColA = 66和ColB = 65.5。
% Data sets
% a(Column, Row, Profit)
% b(Column, Row, Profit)
a(65, 66, -0.82).
a(65, 65.5, -1.32).
a(65, 65, -1.82).
a(65.5, 66, -1.07).
a(65.5, 65.5, -1.57).
a(65.5, 65, -1.57).
a(66, 66, -1.3).
a(66, 65.5, -1.3).
a(66, 65, -1.3).
b(65, 66, -1).
b(65, 65.5, -0.5).
b(65, 65, 1.72).
b(65.5, 66, -0.5).
b(65.5, 65.5, 1.48).
b(65.5, 65, 1.48).
b(66, 66, 1.25).
b(66, 65.5, 1.25).
b(66, 65, 1.25).
min_row(Row) :-
a(Col, Row, _),
\+ (a(_,Row2,_), Row2 < Row),!.
max_row(Row) :-
a(Col, Row, _),
\+ (a(_,Row2,_), Row2 > Row),!.
is_profit(ColA, ColB, Row, P) :-
a(ColA, Row, Profit1),
b(ColB, Row, Profit2),
Profit is Profit1 + Profit2,
(Profit > 0 -> P is 1 ; P is 0),!.
count_profits(ColA, ColB, Row1, P) :-
max_row(Row),
Row1 =:= Row,
is_profit(ColA, ColB, Row1, P).
count_profits(ColA, ColB, Row1, P) :-
a(ColA,Row2,_),
Row2 > Row1,
count_profits(ColA, ColB, Row2, P2),
is_profit(ColA, ColB, Row1, P1),
P is P1+P2.
count_profits(ColA, ColB, P) :-
min_row(Row1),
count_profits(ColA, ColB, Row1, P),!.
更新1:
下面是數據我想在我的樣本序言代碼工作的可視化表示:
我不知道我理解矩陣B的評論,* ... ColumnX矩陣A + ColumnY *。你在哪裏添加列A和B的值?這是有點不清楚你算法應該如何工作。 – lurker
* ...結合*時會產生大量積極結果。以什麼方式結合? – lurker
對不起,如果我不清楚。 在我的示例代碼中,A的第一個條目是[65,66,-0.82],B的第一個條目是b [65,66,-1]。因此,他們都是65列,66是行,-0..82和-1是A和B的利潤值,所以將它們結合起來應該可以獲得-1.82的利潤。 所以,當我將來自A的列'65'和來自A的列'65'結合起來時,它應該每行取一行(我的a和b函數中的第二個值),然後求和這些列表中的最後一個值。 – Quintonn