このページの翻訳は最新ではありません。ここをクリックして,英語の最新版を参照してください。
,0-1整数计画法によるオフィス割り当て:ソルバーベースを参照してください。
拉克什,马塞洛,彼得,汤姆,马约莉および玛丽安の6人を7つのオフィスに割り当てたいと思います。各オフィスに配置できるのは1人だけで,各人は正確に1つのオフィスにのみ割り当てられます。そのため,空きオフィスが1つになります。これらの人はオフィスを選ぶことができ,彼らの選好を考慮する際は年功が基準とされます。MathWorksでの勤続年数が長いほど年功が高くなります。窓のあるオフィスと窓のないオフィスがあり,また,1つの窓は他より小さくなっています。さらに,彼得と汤姆はよく一緒に働いているため,隣接するオフィスに配置する必要があります。马塞洛とRakeshもよく一緒に働いているため,隣接するオフィスに配置する必要があります。
オフィス1、2、3,および4は建物の内側にあり,窓がありません。オフィス5、6および7には窓がありますが,オフィス5の窓は他の2つのオフィスよりも小さいです。ここで,これらのオフィスの配置方法を示します。
officelist = {办公室1 ',《办公室2》,'办公室3','办公室4',办公室5 ',“办公室6”,“办公室7”};Printofficeassign(官方者)
この問題を数学的に定式化する必要があります。人がオフィスを占有しているかどうかを示す2値変数を作成します。人の名前のリストは,次のとおりです。
名称列表= {“玛丽安”,'marjorie','汤姆','彼得',“马塞洛”,'rakesh'};
オフィスオフィス号と名前インデックス付けされた2値函数をたた。
占领= optimvar ('占据', officelist名称列表...“类型”,'整数',下界的0,“Upperbound”,1);
MathWorksでの勤続年数が長いほど選好が重視されるように,年功に基づいて選好に重みを付けたいと思います。年功は以下のようになっています。玛丽安は9年,马约莉は10年,汤姆は5年,彼得は3年,马塞洛は1.5年,Rakeshは2年です。年功に基づいて,正規化された重みベクトルを作成します。
资历= [9 10 5 3 1.5 2];weightvector =资历/笔(工龄);
行がオフィスに対応し,列が人に対応するような選好行列を設定します。各社員の希望は数値で示されています。各人が各オフィスについて値を入れ,その選択の合計,つまり列の値の合計が100になるように依頼します。ここでは第一希望のオフィスの数値が最も大きくなります。各人の選好が列ベクトルにリストされます。
Maryann = [0,0,0,0,10,40,50];Marjorie = [0,0,0,0,20,40,40];Tom = [0,0,0,0,30,40,30];Peter = [1,3,3,3,10,40,40];Marcelo = [3,4,1,2,10,40,40];Rakesh = [10,10,10,10,20,20,20];
各人の選好ベクトルの我番目の要素は,その人物が我番目のオフィスをどの程度評価しているかを示しています。つまり,選好行列を組み合わせたものは次のようになります。
prefmatrix = [maryann; marjorie;汤姆;彼得;马塞洛; rakesh];
年功が列の基準となるように,重量矢量
を使用して選好行列に重みを付けます。
PM = DIAG(TReeVector)* prefmatrix;
目的は,年功によって重みが付けられた選好の満足度を最大限にすることです。これは線形目的関数sum (sum(占领。*点))
です。
最最化问题を作品成品,目的关节。
peopleprob = OptimProblem(“ObjectiveSense”,'最大化',“目标”总和(sum(占领。*点)));
最初の制約セットでは,各人が正確に1つのオフィスを得ることが求められます。つまり,各人について,該当する人に対応する占领
値値合肥が正式に1であることが求められます。
peopleprob.Constraints。Constr1 = sum(occupy,2) == 1;
第2の制約セットは不等式です。これらの制約により,各オフィスで1人を超えないように指定されます。
peopleprob.Constraints。Constr2 = sum(occupy,1) <= 1;
汤姆と彼得には,互いに隣接したオフィスを割り当てたいと思います。马塞洛とRakeshについても同様です。
汤姆と彼得のの番号が互いに1しか离れないないように制约ししますしします。
peopleprob.Constraints。constrpt1 =占领('汤姆',办公室1 ') +总和(占领('彼得',:)) - 占据('彼得',《办公室2》) < = 1;peopleprob.Constraints。constrpt2 =占领('汤姆',《办公室2》) +总和(占领('彼得',:)) - 占据('彼得',办公室1 ')...- 占据('彼得','办公室3')——占领('彼得',办公室5 ') < = 1;peopleprob.constraints.constrpt3 =占据('汤姆','办公室3') +总和(占领('彼得',:)) - 占据('彼得',《办公室2》)...- 占据('彼得','办公室4')——占领('彼得',“办公室6”) < = 1;peopleprob.Constraints。constrpt4 =占领('汤姆','办公室4') +总和(占领('彼得',:)) - 占据('彼得','办公室3')...- 占据('彼得',“办公室7”) < = 1;peopleprob.Constraints。constrpt5 =占领('汤姆',办公室5 ') +总和(占领('彼得',:)) - 占据('彼得',《办公室2》)...- 占据('彼得',“办公室6”) < = 1;peopleprob.Constraints。constrpt6 =占领('汤姆',“办公室6”) +总和(占领('彼得',:)) - 占据('彼得','办公室3')...- 占据('彼得',办公室5 ')——占领('彼得',“办公室7”) < = 1;peopleprob.Constraints。constrpt7 =占领('汤姆',“办公室7”) +总和(占领('彼得',:)) - 占据('彼得','办公室4')...- 占据('彼得',“办公室6”) < = 1;
拉克什のここで,马塞洛とオフィス番号が互いに1しか離れないようにする制約を作成します。
peopleprob.Constraints。constmr1 =占领(“马塞洛”,办公室1 ') +总和(占领('rakesh',:)) - 占据('rakesh',《办公室2》) < = 1;peopleprob.Constraints。constmr2 =占领(“马塞洛”,《办公室2》) +总和(占领('rakesh',:)) - 占据('rakesh',办公室1 ')...- 占据('rakesh','办公室3')——占领('rakesh',办公室5 ') < = 1;peopleprob.Constraints。constmr3 =占领(“马塞洛”,'办公室3') +总和(占领('rakesh',:)) - 占据('rakesh',《办公室2》)...- 占据('rakesh','办公室4')——占领('rakesh',“办公室6”) < = 1;peopleprob.Constraints。constmr4 =占领(“马塞洛”,'办公室4') +总和(占领('rakesh',:)) - 占据('rakesh','办公室3')...- 占据('rakesh',“办公室7”) < = 1;peopleprob.Constraints。constmr5 =占领(“马塞洛”,办公室5 ') +总和(占领('rakesh',:)) - 占据('rakesh',《办公室2》)...- 占据('rakesh',“办公室6”) < = 1;peopleprob.Constraints。constmr6 =占领(“马塞洛”,“办公室6”) +总和(占领('rakesh',:)) - 占据('rakesh','办公室3')...- 占据('rakesh',办公室5 ')——占领('rakesh',“办公室7”) < = 1;peopleprob.constraints.constmr7 =占据(“马塞洛”,“办公室7”) +总和(占领('rakesh',:)) - 占据('rakesh','办公室4')...- 占据('rakesh',“办公室6”) < = 1;
解决
をを呼び出してこのこの问题を解き解き
[Soln,FVAL,EXITFLAG,输出] =解决(人员);
LP:最优目标值为-33.836066。找到最优解。Intlinprog在根节点停止,因为客观值在最优值options的间隙公差范围内。AbsoluteGapTolerance = 0(默认值)。intcon变量是在公差选项内的整数。IntegerTolerance = 1e-05(默认值)。
numoffices =长度(官方主义);办公室= Cell(Numofoges,1);为i=1: numooffices office{i} = find(soln.occupy(:,i));%人指数在办公室结束whoinoffice = officelist;%分配为我= 1:numOffices如果isempty(办公室{i})whoinoffice {i} =“空”;其他的办公室whoinoffice{我}=学生名单({});结束结束printofficeassign (whoinoffice);标题(“办公室分配问题的解决方案”);
この問題の場合,年功による選好の満足度がfval
の値まで最大化されます。exitflag
の値は,解决
が最適解に収束したことを示します。出力構造体は,探索されたノードの数や分枝計算における下限と上限のギャップなど,解法プロセスに関する情報を提供します。この場合,分枝限定ノードは生成されませんでした。つまり,分枝限定ステップを経ずに問題が解かれました。ギャップの絶対値は0です。これは,解が最適であり,目的関数で内部計算された下限と上限の間に差がないことを意味します。
fval exitflag,输出
fval = 33.8361.
exitflag = 1
输出=结构与字段:相对介点:0 absolutegap:0 numfeaspoints:1 numnodes:0 constrviolation:0消息:'找到最佳解决方案.INGLINPROG在根节点停止,因为客观值在最佳值的间隙容忍度范围内,Options.absolutegaptolerance = 0(默认值)。Intcon变量是公差范围内的整数,options.integertolerance = 1E-05(默认值)。求解器:'Intlinprog'