-5

わかった。この質問を投稿するのはこれが 2 回目です。最後に私の質問が数人の管理者によって閉じられたのは、「最初に解決するのに十分な努力をしなかった」と言うので、今では約 70% 解決しました。今回は、誰かが私のコードを完成させる答えをくれることを願っています。

この質問は、(Prolog 言語プログラミング) の課題として私に与えられました。

  1. 仕事の割り当て。N 個の異なるマシンを使用して N 個のジョブを実行します。マシン i を使用してジョブ j を実行するコストを次の表に示します。

                   1  2  3  4
                  ____________
                1| 6  5  3  6
                2| 5  6  8  12
                3| 8  6  8  9
                4| 3  6  5  8
    

\\ 上の ( 1 2 3 4 ) は (Jobs) カテゴリに属します

\\ 左側 ( 1 2 3 4 ) は ( Machines ) カテゴリに属します

総コストを最小限に抑えるために、どのジョブをどのマシンに割り当てる必要があるかを決定する宣言型の Prolog プログラムを作成します。

私が行った最初のステップは、(Jobs) の最初の垂直線から最も低い値の数字を選び、同じ行の残りのすべての数字 ( 3-8 ) 、 ( 3-6 ) 、 ( 3 - 5 ) でそれを減算することです) ... 残りの垂直線についても同様です。

これは私のコードです (まだ完成していないので、基本的には次の月曜日の朝 12 月 23 日までに完成できる人を探しています)。

 >> initial:- M1=[6,5,3,6],
          M2=[5,6,8,12],
          M3=[8,6,8,9],
          M4=[3,6,5,8],

          write('M1= ['),
          printlist(M1),
      write('M2= ['),
          printlist(M2),
      write('M3= ['),
          printlist(M3),
      write('M4= ['),
          printlist(M4),nl,nl,

      redrow(M1,L1),
      redrow(M2,L2),
      redrow(M3,L3),
      redrow(M4,L4),

      write('L1= ['),
          printlist(L1),
      write('L2= ['),
          printlist(L2),
      write('L3= ['),
          printlist(L3),
      write('L4= ['),
          printlist(L4),nl,nl,

      /*Lc1=[],
      Lc2=[],
      Lc3=[],
      Lc4=[],*/

      col1(L1,L2,L3,L4,Lc1),
      col2(L1,L2,L3,L4,Lc2),
      col3(L1,L2,L3,L4,Lc3),
      col4(L1,L2,L3,L4,Lc4),          

      write('Lc1= ['),
          printlist(Lc1),
      write('Lc2= ['),
          printlist(Lc2),
      write('Lc3= ['),
          printlist(Lc3),
      write('Lc4= ['),
          printlist(Lc4),nl,nl,

      redrow(Lc1,Lx1),
      redrow(Lc2,Lx2),
      redrow(Lc3,Lx3),
      redrow(Lc4,Lx4),

      write('Lx1= ['),
          printlist(Lx1),
      write('Lx2= ['),
          printlist(Lx2),
      write('Lx3= ['),
          printlist(Lx3),
      write('Lx4= ['),
          printlist(Lx4),nl,nl,

      col1(Lx1,Lx2,Lx3,Lx4,Ly1),
      col2(Lx1,Lx2,Lx3,Lx4,Ly2),
      col3(Lx1,Lx2,Lx3,Lx4,Ly3),
      col4(Lx1,Lx2,Lx3,Lx4,Ly4),

      write('Ly1= ['),
          printlist(Ly1),
      write('Ly2= ['),
          printlist(Ly2),
      write('Ly3= ['),
          printlist(Ly3),
      write('Ly4= ['),
          printlist(Ly4),nl,nl.

redrow(M1,L1):- minimo(M1,Min), redcopy(M1,L1,Min).

minimo([X], X) :- !.
minimo([X,Y|Tail], N):-
    ( X > Y ->
        minimo([Y|Tail], N)
    ;
        minimo([X|Tail], N)
    ).



min1(X,Y,X):- X<Y, write('in min1 X= '), write(X), nl.
min1(X,Y,Y):- X>Y,write('in min1 Y= '), write(Y), nl.
min1(X,Y,Y).

redcopy(L,R,V) :- accCp(L,R,V).
accCp([],[],_).
accCp([H|T1],[M|T2],V) :- M is H-V, accCp(T1,T2,V).

col1([H1|T1],[H2|T2],[H3|T3],[H4|T4],[H1,H2,H3,H4]).
col2([H11,H12|T1],[H21,H22|T2],[H31,H32|T3],[H41,H42|T4],[H12,H22,H32,H42]).
col3([H11,H12,H13|T1],[H21,H22,H23|T2],[H31,H32,H33|T3],[H41,H42,H43|T4],[H13,H23,H33,H43]).
col4([H11,H12,H13,H14|T1],[H21,H22,H23,H24|T2],[H31,H32,H33,H34|T3],[H41,H42,H43,H44|T4],[H14,H24,H34,H44]).

/*redcopy([],[],_).
redcopy(Ls,Ld,R):- Ls=[X|Lst],Ld=[X-R|Ld], redcopy(Lst,Ld,R).*/

printlist([]):- write(']'),nl.
printlist(L):- L=[X|Lt], write(X), write(' , '), printlist(Lt).

そして最後に、コンピューターにどのような質問をして、 ( はい 、 いいえ ) の出力を与えるかを知る必要があります。前もって感謝します 。

注: 私のコードや質問が明確でない場合 (私にそれを明確にするように依頼してください)、私の質問を閉じないでください。既に回答を得ている人がいる可能性があるからです。

4

1 に答える 1

3

これはおそらくあなたが必要とする答えではないでしょう. 本当に、そのような大胆な発言がどのように行われたかを説明できれば

私はそれの約70%を解決しました..

評価することができれば、私たち全員があなたの課題から何かを学ぶことができます。しかし、残念ながら、あなたのコードは「宣言型」ソリューションとはほど遠いようです。問題を解決する方法をどこで宣言しますか?

高レベルの説明から始めましょう。

総コストを最小限に抑えるために、どのジョブをどのマシンに割り当てる必要があるかを決定する

次に、再利用可能なソリューションをスケッチできます。

assign_jobs_min_cost :-
    MJC =  % machines,jobs,cost
    [[6, 5, 3, 6 ],
     [5, 6, 8, 12],
     [8, 6, 8, 9 ],
     [3, 6, 5, 8 ]],
    assign_jobs_min_cost(MJC, Jobs, Cost),
    writeln(Jobs:Cost).

ジョブの割り当ては、単にインデックスの順列と見なすことができます (問題データの分かりやすい表示のおかげで)。

assign_jobs_min_cost(MJC, Jobs, Cost) :-
    aggregate_all(min(C, P),
              (permutation([1, 2, 3, 4], P),
               cost_assign(MJC, P, C)),
              min(Cost, Jobs)).

Prolog には、他の言語と同様に、問題を解決する慣用的な方法を定義するライブラリが付属しています。ライブラリの使い方を学ぶことは、多くの場合、語学実習の最大の部分です。

ここでは、SWI-Prolog ライブラリ ( aggregate ) と順列/2 を使用します。プロローグ (および試験官の要件)によってはそのような呼び出しを独自の定義に置き換えてみることができます。

あとはcost_assign(MJC, Jobs, Cost)計算するだけです。再びライブラリ構造を使用すると、「単一のステートメント」になります。

cost_assign(MJC, Jobs, Cost) :-
    aggregate_all(
        sum(C),
        (between(1, 4, Mac),
         nth1(Mac, MJC, RowC),
         nth1(Mac, Jobs, J),
         nth1(J, RowC, C)
        ), Cost)
    % uncomment  below to see all assignments
    %,writeln(Jobs:Cost).
    .

しかし、自分で書くことでさらに多くのことを学ぶことができます...

于 2012-12-21T08:59:48.213 に答える