非線形計画法と二次計画法を学ぶ

非線形計画法

非線形計画モデル (NP)

目的関数または制約に非線形関数が含まれる場合、この計画問題は非線形計画問題と呼ばれます。一般に、非線形計画問題を解くことは、線形計画問題を解くことよりもはるかに困難です。また、シンプレックス法と呼ばれる一般的な手法がある線形計画法とは異なり、非線形計画法には現時点ではさまざまな問題に適した汎用的なアルゴリズムが存在せず、それぞれの手法が独自の適用範囲を持っています。
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

非線形計画法の数学モデル

ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

リスト

次の非線形計画
ここに画像の説明を挿入
コードを見つけます。

%将以下代码分别复制到MATLAB® 路径上名为fun1.m和fun3.m 的文件中。
    % fun1.m内容
    % function f=fun1(x)
    % f=sum(x.^2)+8;
            % fun3.m内容
            % function [g,h]=fun3(x)
            % g=[-x(1)^2+x(2)-x(3)^2
            %     x(1)+x(2)^2+x(3)^3-20];
            % h=[-x(1)-x(2)^2+2
            %     x(2)+2*x(3)^2-3];

            
[x,y]=fmincon('fun1',rand(3,1),[],[],[],[],zeros(3,1),[],'fun3')%主代码仅仅只有这一行

実行結果:
ここに画像の説明を挿入
先生から与えられたコードは、すべての関数が同じスクリプト内に配置されていたため、最初は正常に実行されず、関数の定義と参照が失敗しました。上記のコードが実行できなかった場合、作成者は自分でコードを編集しまし
た。

fun=@(x)x(1)^2+x(2)^2+x(3)^2+8;
A=[];
b=[];
Aeq=[];
beq=[];
x0=rand(3,1);
nonlcon=@fun2;  %调用了路径为fun.2的函数
                %函数fun.2内容
                % function [c,ceq]=fun2(x)
                % c=[-x(1)^2+x(2)-x(3)^2
                %     x(1)+x(2)^2+x(3)^3-20];
                % ceq=[-x(1)-x(2)^2+2
                %     x(2)+2*x(3)^2-3];
x=fmincon(fun,x0,A,b,Aeq,beq,zeros(3,1),[],nonlcon)

実行結果:
ここに画像の説明を挿入
著者が作成したコードでも x の最適解を見つけることができますが、y の解を直接見つけることはできません。しかし、作成者がこのコードを書いたとき、関数 fun2 は正常に作成され、参照されました。これをきっかけに、作成者は最初のコードが実行に失敗した理由を考えるようになり、その後、最初のコードが修正されて正常に実行されました。

二次計画

ここに画像の説明を挿入
Matlab
で二次計画法を解くコマンドは
[x,fval]=quadprog(H,f,A,b,Aeq,beq,lb,ub,x0,options) です。戻り値 x は決定ベクトル x の値です
。 、戻り値 fval は x における目的関数の値です (詳細については、Matlab コマンド ウィンドウで helpquadprog を実行した後のヘルプを参照してください)。

ここに画像の説明を挿入

h=[4,-4;-4,8];
f=[-6;-3];
a=[1,1;4,1];
b=[3;9];
[x,value]=quadprog(h,f,a,b,[],[],zeros(2,1))

演算結果
ここに画像の説明を挿入

応用例:供給と設置場所の選択

ここに画像の説明を挿入

モデリング

ここに画像の説明を挿入

仮設資材置場の利用

ここに画像の説明を挿入

最初の質問
コードの解決策

a=[1.25 8.75 0.5 5.75 3 7.25];
b=[1.25 0.75 4.75 5 6.5 7.75];
d=[3 5 4 7 6 11];
x=[5 2];
y=[1 7];
e=[20 20];
for i=1:6
    for j=1:2
        aa(i,j)=sqrt((x(j)-a(i))^2+(y(j)-b(i))^2);
    end
end  %计算每个料场到每个工地的距离
CC=[aa(:,1);aa(:,2)]';%将两个料场到每个工地的距离以12维列向量的形式存放
A=[1 1 1 1 1 1 0 0 0 0 0 0;0 0 0 0 0 0 1 1 1 1 1 1];
B=[20;20];%每个料场提供的水泥小于20吨
Aeq=[1 0 0 0 0 0 1 0 0 0 0 0;
    0 1 0 0 0 0 0 1 0 0 0 0;
    0 0 1 0 0 0 0 0 1 0 0 0;
    0 0 0 1 0 0 0 0 0 1 0 0;
    0 0 0 0 1 0 0 0 0 0 1 0;
    0 0 0 0 0 1 0 0 0 0 0 1];
beq=[d(1);d(2);d(3);d(4);d(5);d(6)];%两个料场向同一工厂提供的水泥等于该工厂日用量
VLB=[0 0 0 0 0 0 0 0 0 0 0 0];%下限
VUB=[];%上限
x0=[1 2 3 0 1 0 0 1 0 1 0 1];%初始值
[xx,fval]=linprog(CC,A,B,Aeq,beq,VLB,VUB,x0)%返回目标函数在解 xx处的值:fval = f'*x

操作結果
ここに画像の説明を挿入
と 2 番目の質問の解決策

2つの資材ヤードの新設状況

ここに画像の説明を挿入
ここに画像の説明を挿入
ここにはまだ 2 つの手順が必要です。
まず m ファイル liaochang.m を作成して目的関数を定義します。
初期値 x0 を取得し、メイン プログラムを編集します
。初期値の選択が異なると、最終的な収束結果も異なります。通常、初期値はランダムに生成され、実行して結果を生成し、その結果を初期値として使用してコードを再コンパイルして実行します。より良い結果が得られる場合は、上記の手順を繰り返します。より良い結果が得られなかった場合、デフォルトの結果が最良の結果になります

            %将以下代码分别复制到MATLAB® 路径上名为liaochang.m 的文件中
            % function f=liaochang(x)
            % a=[1.25 8.75 0.5 5.75 3 7.25];
            % b=[1.25 0.75 4.75 5 6.5 7.75];
            % d=[3 5 4 7 6 11];
            % e=[20 20];
            % f1=0;
            % for i=1:6
            %     s(i)=sqrt((x(13)-a(i))^2+(x(14)-b(i))^2);
            %     f1=s(i)*x(i)+f1;
            % end
            % f2=0;
            % for i=7:12
            %     s(i)=sqrt((x(15)-a(i-6))^2+(x(16)-b(i-6))^2);
            %     f2=s(i)*x(i)+f2;
            % end
            % f=f1+f2;
%主代码
x0=[3 5 0 7 0 1 0 0 4 0 6 10 5 1 2 7]';
A=[1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 
    0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0];
B=[20;20];
Aeq=[1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
    0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0
    0 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0
    0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 0
    0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0
    0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0];
beq=[3;5;4;7;6;11];
vlb=[zeros(12,1);-inf;-inf;-inf;-inf];
vub=[];
[x,fval,exitflag]=fmincon('liaochang',x0,A,B,Aeq,beq,vlb,vub)

非線形問題を解決するには、やはり目的関数の作成と参照が必要です。
result
ここに画像の説明を挿入
[x, fval, exitflag, Output] = fmincon(___) を実行すると、 fmincon の終了条件を説明する値 exitflag と、 fmincon に関する情報を提供する構造体出力も返されます。最適化プロセス。
追加の出力チェックを使用してソリューションの品質を簡単にチェックするには、exitflag と出力を要求します。
exitflag 値 1 は、解が極小値であることを示します。
出力構造は、解決プロセスに関するいくつかの統計を報告します。具体的には、output.iterations で反復回数、output.funcCount で関数評価の数、output.constrviolation で実現可能性を示します。

おすすめ

転載: blog.csdn.net/Luohuasheng_/article/details/128513495