日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

C# 解决组合优化问题

發(fā)布時間:2024/1/3 综合教程 30 生活家
生活随笔 收集整理的這篇文章主要介紹了 C# 解决组合优化问题 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Google Optimization Tools介紹

Google Optimization Tools(OR-Tools)是一款專門快速而便攜地解決組合優(yōu)化問題的套件。它包含了:

約束編程求解器。

簡單而統(tǒng)一的接口,用于多種線性規(guī)劃和混合整數(shù)規(guī)劃求解,包括 CBC、CLP、GLOP、GLPK、Gurobi、CPLEX 和SCIP。

圖算法 (最短路徑、最小成本、最大流量、線性求和分配)。

經(jīng)典旅行推銷員問題和車輛路徑問題的算法。

經(jīng)典裝箱和背包算法。

Google使用C++開發(fā)了OR-Tools庫,但支持Python,C#,或Java語言調(diào)用。

安裝Google OR-Tools
Google OR-Tools的源碼在[Github] google/or-tools。其它開發(fā)環(huán)境下的安裝如下。

Linux or Mac下安裝

確認(rèn)使用了Python 2.7+,3.5+版本,以及pip 9.0.1+版本。

Mac OSX系統(tǒng)需要安裝命令行工具Xcode,在Terminal中執(zhí)行xcode-select --install。

Linux系統(tǒng)需要安裝g++,在Terminal中執(zhí)行sudo apt-get install g++ make。

如果使用C#請確認(rèn)安裝了Mono 4.2.0+的64位版本。

在Terminal中執(zhí)行pip install --upgrade ortools直接安裝Python版本的OR-Tools包。C++/Java/C#版本的鏈接為:Mac, Ubuntu 17.04, Ubuntu 16.04, Ubuntu 14.04, CentOS 7, Debian 9 ,下載到指定目錄后執(zhí)行make all。

Windows下安裝
Python版本的包的安裝和Linux一樣,可自行選用合適的開發(fā)工具。若是使用C++、C#,推薦使用64位版本的Windows10操作系統(tǒng),并且使用Microsoft Visual Studio 2015 或者 2017作為開發(fā)工具,相應(yīng)的庫文件下載地址為: Visual Studio 2017 the Visual Studio 2015。

C++使用lib/ortools.lib, 并且將or?tools/include添加到項(xiàng)目引用。
Java使用jar命令調(diào)用lib/com.google.ortools.lib的方式,并且將 ?Djava.library.path=PATH_TO_or?tools/lib添加到命令行。
C#添加bin/Google.OrTools.dll到項(xiàng)目依賴,或者使用NuGet搜索Google.OrTools進(jìn)行安裝。
Demo
以下是幾種支持語言的demo,運(yùn)行一下驗(yàn)證是否安裝正確。

C++ 代碼

復(fù)制代碼

include "ortools/linear_solver/linear_solver.h"

include "ortools/linear_solver/linear_solver.pb.h"

namespace operations_research {
void RunTest(
MPSolver::OptimizationProblemType optimization_problem_type) {
MPSolver solver("Glop", optimization_problem_type);
MPVariable* const x = solver.MakeNumVar(0.0, 1, "x");
MPVariable* const y = solver.MakeNumVar(0.0, 2, "y");
MPObjective* const objective = solver.MutableObjective();
objective->SetCoefficient(x, 1);
objective->SetCoefficient(y, 1);
objective->SetMaximization();
solver.Solve();
printf("
Solution:");
printf("
x = %.1f", x->solution_value());
printf("
y = %.1f", y->solution_value());
}

void RunExample() {
RunTest(MPSolver::GLOP_LINEAR_PROGRAMMING);
}
}

int main(int argc, char** argv) {
operations_research::RunExample();
return 0;
}
復(fù)制代碼

C# 代碼

復(fù)制代碼
using System;
using Google.OrTools.LinearSolver;

public class my_program
{
private static void RunLinearProgrammingExample(String solverType)
{
Solver solver = Solver.CreateSolver("IntegerProgramming", solverType);
Variable x = solver.MakeNumVar(0.0, 1.0, "x");
Variable y = solver.MakeNumVar(0.0, 2.0, "y");
Objective objective = solver.Objective();
objective.SetCoefficient(x, 1);
objective.SetCoefficient(y, 1);
objective.SetMaximization();
solver.Solve();
Console.WriteLine("Solution:");
Console.WriteLine("x = " + x.SolutionValue());
Console.WriteLine("y = " + y.SolutionValue());
}

static void Main()
{
RunLinearProgrammingExample("GLOP_LINEAR_PROGRAMMING");
}
}
復(fù)制代碼

Python 代碼

復(fù)制代碼
from future import print_function
from ortools.linear_solver import pywraplp

def main():
solver = pywraplp.Solver('SolveSimpleSystem',
pywraplp.Solver.GLOP_LINEAR_PROGRAMMING)
x = solver.NumVar(0, 1, 'x')
y = solver.NumVar(0, 2, 'y')
objective = solver.Objective()
objective.SetCoefficient(x, 1)
objective.SetCoefficient(y, 1)
objective.SetMaximization()
solver.Solve()
print('Solution:')
print('x = ', x.solution_value())
print('y = ', y.solution_value())

if name == 'main':
main()
復(fù)制代碼

Java 代碼

復(fù)制代碼
import com.google.ortools.linearsolver.MPConstraint;
import com.google.ortools.linearsolver.MPObjective;
import com.google.ortools.linearsolver.MPSolver;
import com.google.ortools.linearsolver.MPVariable;

public class my_program {
static { System.loadLibrary("jniortools"); }

private static MPSolver createSolver (String solverType) {
return new MPSolver("my_program",
MPSolver.OptimizationProblemType.valueOf(solverType));
}

private static void runmy_program(String solverType,
boolean printModel) {
MPSolver solver = createSolver(solverType);
MPVariable x = solver.makeNumVar(0.0, 1.0, "x");
MPVariable y = solver.makeNumVar(0.0, 2.0, "y");
MPObjective objective = solver.objective();
objective.setCoefficient(y, 1);
objective.setMaximization();
solver.solve();
System.out.println("Solution:");
System.out.println("x = " + x.solutionValue());
System.out.println("y = " + y.solutionValue());
}

public static void main(String[] args) throws Exception {
runmy_program("GLOP_LINEAR_PROGRAMMING", false);
}
}
復(fù)制代碼

執(zhí)行結(jié)果如圖:

使用.Net Core與Google Optimization Tools實(shí)現(xiàn)員工排班計劃Scheduling

讓大家初步了解了Google Optimization Tools是一款約束求解(CP)的高效套件。那么我們用.Net Core與Google Optimization Tools來實(shí)現(xiàn)一個有關(guān)員工排班計劃的場景感受一下。

眾所周知,現(xiàn)實(shí)生活中有些工作是7X24工作制的,如呼叫中心或醫(yī)院護(hù)士,最常見的問題就是如何安排多名員工進(jìn)行倒班,制定好日程時間表,使每班配備足夠的人員來維持運(yùn)營。時間表有各種不同的約束要求,例如:員工不允許連續(xù)兩次輪班之類。接下來我們介紹類似問題的一個示例,叫護(hù)士調(diào)度問題,并展示了如何使用.Net Core與Google Optimization Tools實(shí)現(xiàn)排班計劃。

護(hù)士調(diào)度問題
在本例中,醫(yī)院主管需要為四名護(hù)士創(chuàng)建一個周時間表,具體情況如下:

每天分為早、中、晚三班輪班。
在每一天,所有護(hù)士都被分配到不同的班次,除了有一名護(hù)士可以休息。
每位護(hù)士每周工作五到六天。
每個班次不會有超過兩名護(hù)士在工作。
如果一名護(hù)士某一天的班次是中班或晚班,她也必須在前一日或次日安排相同的班次。
有兩種方式來描述我們需要解決的問題:

指派護(hù)士輪班
將班次分配給護(hù)士
事實(shí)證明,解決問題的最好方法是結(jié)合兩種方式來求解。

指派護(hù)士輪班
下表顯示了指派護(hù)士輪班視角的排班情況,這些護(hù)士被標(biāo)記為A,B,C,D,換班,編號為0 - 3(其中0表示護(hù)士當(dāng)天不工作)。

星期日

星期一 星期二 星期三 星期四 星期五 星期六
班次1
A
B
A
A
A
A
A
班次2
C
C
C
B
B
B
B
班次3
D
D
D
D
C
C
D
將班次分配給護(hù)士
下表顯示了將班次分配給護(hù)士視角的排班情況。

星期日	星期一	星期二	星期三	星期四	星期五	星期六

護(hù)士A 1 0 1 1 1 1 1
護(hù)士B 0 1 0 2 2 2 2
護(hù)士C 2 2 2 0 3 3 0
護(hù)士D 3 3 3 3 0 0 3

.Net Core解決方案
首先使用VS017創(chuàng)建一個.Net Core的控制臺項(xiàng)目。

由于Google Optimization Tools對.Net Core的支持還不友好,需要通過NuGet引用一個第三方專門為Core編譯好的程序集以及相關(guān)依賴,Google.OrTools.Core和CrossPlatformLibraryLoader。

準(zhǔn)備完成后,我們逐一介紹編碼的過程。首先介紹幾個基本概念:

IntVar是約束求解中使用最多的變量形式,一般約束問題中變化的對象都應(yīng)該定義為一個類似在一定范圍內(nèi)整形數(shù)值的變量。
solver.MakeIntVar是創(chuàng)建約束求解中變量的方法,約束求解一定會定義一些可變化的對象,一般都需要轉(zhuǎn)化成數(shù)值類型。
solver.Add是添加若干約束條件的方法。
solver.MakePhase定義了求解的目標(biāo)以及求解的取值策略。
solver.Solve進(jìn)行求解,并對指定的集合賦值。
solver.MakeAllSolutionCollector表示獲取解的集合對象。
定義約束求解器和相關(guān)變量
我們用shift和nurse分別來表示班次和護(hù)士 。

復(fù)制代碼
// 創(chuàng)建約束求解器.
var solver = new Solver("schedule_shifts");
var num_nurses = 4;
var num_shifts = 4; // 班次數(shù)定為4,這樣序號為0的班次表示是休息的班。
var num_days = 7;

    // [START]
    // 創(chuàng)建班次變量
    var shifts = new Dictionary<(int, int), IntVar>();

    foreach (var j in Enumerable.Range(0, num_nurses))
    {
        foreach (var i in Enumerable.Range(0, num_days))
        {
            // shifts[(j, i)]表示護(hù)士j在第i天的班次,可能的班次的編號范圍是:[0, num_shifts)
            shifts[(j, i)] = solver.MakeIntVar(0, num_shifts - 1, string.Format("shifts({0},{1})", j, i));
        }
    }

    // 將變量集合轉(zhuǎn)成扁平化數(shù)組
    var shifts_flat = (from j in Enumerable.Range(0, num_nurses)
                       from i in Enumerable.Range(0, num_days)
                       select shifts[(j, i)]).ToArray();

    // 創(chuàng)建護(hù)士變量
    var nurses = new Dictionary<(int, int), IntVar>();

    foreach (var j in Enumerable.Range(0, num_shifts))
    {
        foreach (var i in Enumerable.Range(0, num_days))
        {
            // nurses[(j, i)]表示班次j在第i天的當(dāng)班護(hù)士,可能的護(hù)士的編號范圍是:[0, num_nurses)
            nurses[(j, i)] = solver.MakeIntVar(0, num_nurses - 1, string.Format("shift{0} day{1}", j, i));
        }
    }

復(fù)制代碼
shifts和nurses兩個對象含義如下:

shifts[(j, i)]表示護(hù)士j在第i天的班次,可能的班次的編號范圍是:[0, num_shifts)。
nurses[(j, i)]表示班次j在第i天的當(dāng)班護(hù)士,可能的護(hù)士的編號范圍是:[0, num_nurses)。
shifts_flat是將shifts的Values簡單地處理成扁平化,后面直接用于當(dāng)參數(shù)傳給約束求解器solver以指定需要求解的變量。

定義shifts和nurses的對應(yīng)關(guān)系
將每一天的nurses單獨(dú)列出來,按照編號順序扁平化成一個數(shù)組對象,s.IndexOf(nurses_for_day)是一種OR-Tools要求的特定用法,相當(dāng)于nurses_for_day[s]求值。這里利用了s的值恰好是在nurses_for_day中對應(yīng)nurse的編號。注意這里的兩層foreach循環(huán),v外層不能互換,必須是現(xiàn)在這樣,內(nèi)層循環(huán)的主體對象與shifts_flat一致。

復(fù)制代碼
// 定義shifts和nurses之前的關(guān)聯(lián)關(guān)系
foreach (var day in Enumerable.Range(0, num_days))
{
var nurses_for_day = (from j in Enumerable.Range(0, num_shifts)
select nurses[(j, day)]).ToArray();
foreach (var j in Enumerable.Range(0, num_nurses))
{
var s = shifts[(j, day)];
// s.IndexOf(nurses_for_day)相當(dāng)于nurses_for_day[s]
// 這里利用了s的值恰好是在nurses_for_day中對應(yīng)nurse的編號
solver.Add(s.IndexOf(nurses_for_day) == j);
}
}
復(fù)制代碼

定義護(hù)士在不同的班次當(dāng)班約束
AllDifferent方法是OR-Tools定義約束的方法之一,表示指定的IntVar數(shù)組在進(jìn)行計算時受唯一性制約。滿足每一天的當(dāng)班護(hù)士不重復(fù),即每一天的班次不會出現(xiàn)重復(fù)的護(hù)士的約束條件,同樣每一個護(hù)士每天不可能同時輪值不同的班次。

復(fù)制代碼
// 滿足每一天的當(dāng)班護(hù)士不重復(fù),每一天的班次不會出現(xiàn)重復(fù)的護(hù)士的約束條件
// 同樣每一個護(hù)士每天不可能同時輪值不同的班次
foreach (var i in Enumerable.Range(0, num_days))
{
solver.Add((from j in Enumerable.Range(0, num_nurses)
select shifts[(j, i)]).ToArray().AllDifferent());
solver.Add((from j in Enumerable.Range(0, num_shifts)
select nurses[(j, i)]).ToArray().AllDifferent());
}
復(fù)制代碼

定義護(hù)士每周當(dāng)班次數(shù)的約束
Sum方法是OR-Tools定義運(yùn)算的方法之一。注意shifts[(j, i)] > 0運(yùn)算被重載過,其返回類型是WrappedConstraint而不是默認(rèn)的bool。滿足每個護(hù)士在一周范圍內(nèi)只出現(xiàn)[5, 6]次。

復(fù)制代碼
// 滿足每個護(hù)士在一周范圍內(nèi)只出現(xiàn)[5, 6]次
foreach (var j in Enumerable.Range(0, num_nurses))
{
solver.Add((from i in Enumerable.Range(0, num_days)
select shifts[(j, i)] > 0).ToArray().Sum() >= 5);
solver.Add((from i in Enumerable.Range(0, num_days)
select shifts[(j, i)] > 0).ToArray().Sum() <= 6);
}
復(fù)制代碼

定義每個班次在一周內(nèi)當(dāng)班護(hù)士人數(shù)的約束
Max方法是OR-Tools定義運(yùn)算的方法之一,表示對指定的IntVar數(shù)組求最大值。注意MakeBoolVar方法返回類型是IntVar而不是默認(rèn)的bool,works_shift[(i, j)]為True表示護(hù)士i在班次j一周內(nèi)至少要有1次,BoolVar類型的變量最終取值是0或1,同樣也表示了False或True。滿足每個班次一周內(nèi)不會有超過兩名護(hù)士當(dāng)班工作。

復(fù)制代碼
// 創(chuàng)建一個工作的變量,works_shift[(i, j)]為True表示護(hù)士i在班次j一周內(nèi)至少要有1次
// BoolVar類型的變量最終取值是0或1,同樣也表示了False或True
var works_shift = new Dictionary<(int, int), IntVar>();

    foreach (var i in Enumerable.Range(0, num_nurses))
    {
        foreach (var j in Enumerable.Range(0, num_shifts))
        {
            works_shift[(i, j)] = solver.MakeBoolVar(string.Format("nurse%d shift%d", i, j));
        }
    }

    foreach (var i in Enumerable.Range(0, num_nurses))
    {
        foreach (var j in Enumerable.Range(0, num_shifts))
        {
            // 建立works_shift與shifts的關(guān)聯(lián)關(guān)系
            // 一周內(nèi)的值要么為0要么為1,所以Max定義的約束是最大值,恰好也是0或1,1表示至少在每周輪班一天
            solver.Add(works_shift[(i, j)] == (from k in Enumerable.Range(0, num_days)
                                               select shifts[(i, k)].IsEqual(j)).ToArray().Max());
        }
    }

    // 對于每個編號不為0的shift, 滿足至少每周最多同一個班次2個護(hù)士當(dāng)班
    foreach (var j in Enumerable.Range(1, num_shifts - 1))
    {
        solver.Add((from i in Enumerable.Range(0, num_nurses)
                    select works_shift[(i, j)]).ToArray().Sum() <= 2);
    }

復(fù)制代碼

定義護(hù)士在中班和晚班的連班約束
復(fù)制代碼
// 滿足中班或晚班的護(hù)士前一天或后一天也是相同的班次
// 用nurses的key中Tuple類型第1個item的值表示shift為2或3
// shift為1表示早班班次,shift為0表示休息的班次
solver.Add(solver.MakeMax(nurses[(2, 0)] == nurses[(2, 1)], nurses[(2, 1)] == nurses[(2, 2)]) == 1);
solver.Add(solver.MakeMax(nurses[(2, 1)] == nurses[(2, 2)], nurses[(2, 2)] == nurses[(2, 3)]) == 1);
solver.Add(solver.MakeMax(nurses[(2, 2)] == nurses[(2, 3)], nurses[(2, 3)] == nurses[(2, 4)]) == 1);
solver.Add(solver.MakeMax(nurses[(2, 3)] == nurses[(2, 4)], nurses[(2, 4)] == nurses[(2, 5)]) == 1);
solver.Add(solver.MakeMax(nurses[(2, 4)] == nurses[(2, 5)], nurses[(2, 5)] == nurses[(2, 6)]) == 1);
solver.Add(solver.MakeMax(nurses[(2, 5)] == nurses[(2, 6)], nurses[(2, 6)] == nurses[(2, 0)]) == 1);
solver.Add(solver.MakeMax(nurses[(2, 6)] == nurses[(2, 0)], nurses[(2, 0)] == nurses[(2, 1)]) == 1);

    solver.Add(solver.MakeMax(nurses[(3, 0)] == nurses[(3, 1)], nurses[(3, 1)] == nurses[(3, 2)]) == 1);
    solver.Add(solver.MakeMax(nurses[(3, 1)] == nurses[(3, 2)], nurses[(3, 2)] == nurses[(3, 3)]) == 1);
    solver.Add(solver.MakeMax(nurses[(3, 2)] == nurses[(3, 3)], nurses[(3, 3)] == nurses[(3, 4)]) == 1);
    solver.Add(solver.MakeMax(nurses[(3, 3)] == nurses[(3, 4)], nurses[(3, 4)] == nurses[(3, 5)]) == 1);
    solver.Add(solver.MakeMax(nurses[(3, 4)] == nurses[(3, 5)], nurses[(3, 5)] == nurses[(3, 6)]) == 1);
    solver.Add(solver.MakeMax(nurses[(3, 5)] == nurses[(3, 6)], nurses[(3, 6)] == nurses[(3, 0)]) == 1);
    solver.Add(solver.MakeMax(nurses[(3, 6)] == nurses[(3, 0)], nurses[(3, 0)] == nurses[(3, 1)]) == 1);

復(fù)制代碼

定義約束求解器的使用
復(fù)制代碼
// 將變量集合設(shè)置為求解的目標(biāo),Solver有一系列的枚舉值,可以指定求解的選擇策略。
var db = solver.MakePhase(shifts_flat, Solver.CHOOSE_FIRST_UNBOUND, Solver.ASSIGN_MIN_VALUE);

    // 創(chuàng)建求解的對象
    var solution = solver.MakeAssignment();
    solution.Add(shifts_flat);
    var collector = solver.MakeAllSolutionCollector(solution);

復(fù)制代碼

執(zhí)行求解計算并顯示結(jié)果
復(fù)制代碼
solver.Solve(db, new[] { collector });
Console.WriteLine("Solutions found: {0}", collector.SolutionCount());
Console.WriteLine("Time: {0}ms", solver.WallTime());
Console.WriteLine();

    // 顯示一些隨機(jī)的結(jié)果
    var a_few_solutions = new[] { 340, 2672, 7054 };

    foreach (var sol in a_few_solutions)
    {
        Console.WriteLine("Solution number {0}", sol);

        foreach (var i in Enumerable.Range(0, num_days))
        {
            Console.WriteLine("Day {0}", i);
            foreach (var j in Enumerable.Range(0, num_nurses))
            {
                Console.WriteLine("Nurse {0} assigned to task {1}", j, collector.Value(sol, shifts[(j, i)]));
            }
            Console.WriteLine();
        }
    }

復(fù)制代碼
運(yùn)行結(jié)果如下:

最后,放出完整的代碼如下

復(fù)制代碼
using Google.OrTools.ConstraintSolver;
using System;
using System.Collections.Generic;
using System.Linq;

public class ConsoleApp1
{
static void Main()
{
// 創(chuàng)建約束求解器.
var solver = new Solver("schedule_shifts");
var num_nurses = 4;
var num_shifts = 4; // 班次數(shù)定為4,這樣序號為0的班次表示是休息的班。
var num_days = 7;

    // [START]
    // 創(chuàng)建班次變量
    var shifts = new Dictionary<(int, int), IntVar>();

    foreach (var j in Enumerable.Range(0, num_nurses))
    {
        foreach (var i in Enumerable.Range(0, num_days))
        {
            // shifts[(j, i)]表示護(hù)士j在第i天的班次,可能的班次的編號范圍是:[0, num_shifts)
            shifts[(j, i)] = solver.MakeIntVar(0, num_shifts - 1, string.Format("shifts({0},{1})", j, i));
        }
    }

    // 將變量集合轉(zhuǎn)成扁平化數(shù)組
    var shifts_flat = (from j in Enumerable.Range(0, num_nurses)
                       from i in Enumerable.Range(0, num_days)
                       select shifts[(j, i)]).ToArray();

    // 創(chuàng)建護(hù)士變量
    var nurses = new Dictionary<(int, int), IntVar>();

    foreach (var j in Enumerable.Range(0, num_shifts))
    {
        foreach (var i in Enumerable.Range(0, num_days))
        {
            // nurses[(j, i)]表示班次j在第i天的當(dāng)班護(hù)士,可能的護(hù)士的編號范圍是:[0, num_nurses)
            nurses[(j, i)] = solver.MakeIntVar(0, num_nurses - 1, string.Format("shift{0} day{1}", j, i));
        }
    }

    // 定義shifts和nurses之前的關(guān)聯(lián)關(guān)系
    foreach (var day in Enumerable.Range(0, num_days))
    {
        var nurses_for_day = (from j in Enumerable.Range(0, num_shifts)
                              select nurses[(j, day)]).ToArray();
        foreach (var j in Enumerable.Range(0, num_nurses))
        {
            var s = shifts[(j, day)];
            // s.IndexOf(nurses_for_day)相當(dāng)于nurses_for_day[s]
            // 這里利用了s的值恰好是在nurses_for_day中對應(yīng)nurse的編號
            solver.Add(s.IndexOf(nurses_for_day) == j);
        }
    }

    // 滿足每一天的當(dāng)班護(hù)士不重復(fù),每一天的班次不會出現(xiàn)重復(fù)的護(hù)士的約束條件
    // 同樣每一個護(hù)士每天不可能同時輪值不同的班次
    foreach (var i in Enumerable.Range(0, num_days))
    {
        solver.Add((from j in Enumerable.Range(0, num_nurses)
                    select shifts[(j, i)]).ToArray().AllDifferent());
        solver.Add((from j in Enumerable.Range(0, num_shifts)
                    select nurses[(j, i)]).ToArray().AllDifferent());
    }

    // 滿足每個護(hù)士在一周范圍內(nèi)只出現(xiàn)[5, 6]次
    foreach (var j in Enumerable.Range(0, num_nurses))
    {
        solver.Add((from i in Enumerable.Range(0, num_days)
                    select shifts[(j, i)] > 0).ToArray().Sum() >= 5);
        solver.Add((from i in Enumerable.Range(0, num_days)
                    select shifts[(j, i)] > 0).ToArray().Sum() <= 6);
    }

    // 創(chuàng)建一個工作的變量,works_shift[(i, j)]為True表示護(hù)士i在班次j一周內(nèi)至少要有1次
    // BoolVar類型的變量最終取值是0或1,同樣也表示了False或True
    var works_shift = new Dictionary<(int, int), IntVar>();

    foreach (var i in Enumerable.Range(0, num_nurses))
    {
        foreach (var j in Enumerable.Range(0, num_shifts))
        {
            works_shift[(i, j)] = solver.MakeBoolVar(string.Format("nurse%d shift%d", i, j));
        }
    }

    foreach (var i in Enumerable.Range(0, num_nurses))
    {
        foreach (var j in Enumerable.Range(0, num_shifts))
        {
            // 建立works_shift與shifts的關(guān)聯(lián)關(guān)系
            // 一周內(nèi)的值要么為0要么為1,所以Max定義的約束是最大值,恰好也是0或1,1表示至少在每周輪班一天
            solver.Add(works_shift[(i, j)] == (from k in Enumerable.Range(0, num_days)
                                               select shifts[(i, k)].IsEqual(j)).ToArray().Max());
        }
    }

    // 對于每個編號不為0的shift, 滿足至少每周最多同一個班次2個護(hù)士當(dāng)班
    foreach (var j in Enumerable.Range(1, num_shifts - 1))
    {
        solver.Add((from i in Enumerable.Range(0, num_nurses)
                    select works_shift[(i, j)]).ToArray().Sum() <= 2);
    }

    // 滿足中班或晚班的護(hù)士前一天或后一天也是相同的班次
    // 用nurses的key中Tuple類型第1個item的值表示shift為2或3
    // shift為1表示早班班次,shift為0表示休息的班次
    solver.Add(solver.MakeMax(nurses[(2, 0)] == nurses[(2, 1)], nurses[(2, 1)] == nurses[(2, 2)]) == 1);
    solver.Add(solver.MakeMax(nurses[(2, 1)] == nurses[(2, 2)], nurses[(2, 2)] == nurses[(2, 3)]) == 1);
    solver.Add(solver.MakeMax(nurses[(2, 2)] == nurses[(2, 3)], nurses[(2, 3)] == nurses[(2, 4)]) == 1);
    solver.Add(solver.MakeMax(nurses[(2, 3)] == nurses[(2, 4)], nurses[(2, 4)] == nurses[(2, 5)]) == 1);
    solver.Add(solver.MakeMax(nurses[(2, 4)] == nurses[(2, 5)], nurses[(2, 5)] == nurses[(2, 6)]) == 1);
    solver.Add(solver.MakeMax(nurses[(2, 5)] == nurses[(2, 6)], nurses[(2, 6)] == nurses[(2, 0)]) == 1);
    solver.Add(solver.MakeMax(nurses[(2, 6)] == nurses[(2, 0)], nurses[(2, 0)] == nurses[(2, 1)]) == 1);

    solver.Add(solver.MakeMax(nurses[(3, 0)] == nurses[(3, 1)], nurses[(3, 1)] == nurses[(3, 2)]) == 1);
    solver.Add(solver.MakeMax(nurses[(3, 1)] == nurses[(3, 2)], nurses[(3, 2)] == nurses[(3, 3)]) == 1);
    solver.Add(solver.MakeMax(nurses[(3, 2)] == nurses[(3, 3)], nurses[(3, 3)] == nurses[(3, 4)]) == 1);
    solver.Add(solver.MakeMax(nurses[(3, 3)] == nurses[(3, 4)], nurses[(3, 4)] == nurses[(3, 5)]) == 1);
    solver.Add(solver.MakeMax(nurses[(3, 4)] == nurses[(3, 5)], nurses[(3, 5)] == nurses[(3, 6)]) == 1);
    solver.Add(solver.MakeMax(nurses[(3, 5)] == nurses[(3, 6)], nurses[(3, 6)] == nurses[(3, 0)]) == 1);
    solver.Add(solver.MakeMax(nurses[(3, 6)] == nurses[(3, 0)], nurses[(3, 0)] == nurses[(3, 1)]) == 1);

    // 將變量集合設(shè)置為求解的目標(biāo),Solver有一系列的枚舉值,可以指定求解的選擇策略。
    var db = solver.MakePhase(shifts_flat, Solver.CHOOSE_FIRST_UNBOUND, Solver.ASSIGN_MIN_VALUE);


    // 創(chuàng)建求解的對象
    var solution = solver.MakeAssignment();
    solution.Add(shifts_flat);
    var collector = solver.MakeAllSolutionCollector(solution);

    solver.Solve(db, new[] { collector });
    Console.WriteLine("Solutions found: {0}", collector.SolutionCount());
    Console.WriteLine("Time: {0}ms", solver.WallTime());
    Console.WriteLine();

    // 顯示一些隨機(jī)的結(jié)果
    var a_few_solutions = new[] { 340, 2672, 7054 };

    foreach (var sol in a_few_solutions)
    {
        Console.WriteLine("Solution number {0}", sol);

        foreach (var i in Enumerable.Range(0, num_days))
        {
            Console.WriteLine("Day {0}", i);
            foreach (var j in Enumerable.Range(0, num_nurses))
            {
                Console.WriteLine("Nurse {0} assigned to task {1}", j, collector.Value(sol, shifts[(j, i)]));
            }
            Console.WriteLine();
        }
    }
}

}
復(fù)制代碼

http://www.cnblogs.com/BeanHsiang/p/8663625.html

總結(jié)

以上是生活随笔為你收集整理的C# 解决组合优化问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

欧美一区二区三区不卡 | 欧美激情精品久久久久久免费 | 久久国产视屏 | 国产专区免费 | 亚洲一区二区高潮无套美女 | 最近能播放的中文字幕 | 亚洲精品www久久久 www国产精品com | 天天干天天上 | 久久久亚洲国产精品麻豆综合天堂 | 欧美日韩国产一区二区三区 | 国产涩涩在线观看 | 国产色拍| 91天堂在线观看 | 久草在线视频中文 | 亚洲影院一区 | 欧美日韩国产欧美 | 国产成人精品一区二区三区福利 | 亚洲精品免费观看 | 色噜噜日韩精品欧美一区二区 | 国产麻豆成人传媒免费观看 | 在线免费精品视频 | 91福利在线导航 | 欧美日韩亚洲在线 | 黄色毛片视频免费观看中文 | 成人a级免费视频 | av线上免费观看 | 亚洲一区网站 | 午夜神马福利 | 色欧美88888久久久久久影院 | 色停停五月天 | 中文字幕免费观看全部电影 | 中文一区在线 | 97超在线视频 | 日韩欧美91 | 国产91精品高清一区二区三区 | 丰满少妇久久久 | 亚洲经典视频在线观看 | 成人一级视频在线观看 | 国产精品美女www爽爽爽视频 | 国产免费观看久久 | 欧美网站黄色 | 欧洲精品视频一区 | 手机成人av在线 | 国产91小视频 | 日韩二区三区在线 | 99热精品国产 | 日韩网站视频 | 一区二区三区 中文字幕 | 丝袜制服天堂 | 日韩在线电影观看 | 亚洲精品播放 | 天天操天天爱天天干 | 91麻豆精品国产91久久久久久久久 | 91精品一区二区三区蜜臀 | 精品视频9999 | 天天精品视频 | 狠狠色丁香婷婷综合最新地址 | av中文字幕第一页 | 中文在线中文a | 超碰97人人射妻 | 在线视频欧美日韩 | 日韩国产精品久久久久久亚洲 | .国产精品成人自产拍在线观看6 | 久热免费在线观看 | 香蕉网站在线观看 | 99精品免费久久久久久久久 | 成人在线观看av | 97麻豆视频 | 日韩中文字幕一区 | 成人免费网站在线观看 | 国产一区视频在线 | 日日骑 | 国产在线观看二区 | 五月婷婷香蕉 | 日本h视频在线观看 | 黄色免费在线看 | 国产日产高清dvd碟片 | 国产精品麻豆91 | 色婷婷天天干 | 99久热在线精品视频观看 | 国产91aaa| 国产黄色免费电影 | 射射射综合网 | 成人在线免费小视频 | 日本一区二区高清不卡 | 免费不卡中文字幕视频 | 在线电影 你懂得 | 日韩午夜在线观看 | 精品女同一区二区三区在线观看 | 狠狠狠狠狠狠天天爱 | 久久精品这里都是精品 | 免费99视频 | a级国产乱理伦片在线播放 久久久久国产精品一区 | 特级西西444www高清大视频 | 国语精品免费视频 | 91久草视频 | 麻豆一二三精选视频 | 久久这里有 | 丁香婷婷综合激情五月色 | 亚洲另类视频 | 免费的国产精品 | 香蕉影院在线观看 | 久久国产经典 | 欧美日韩18 | 在线导航福利 | 久久免费视频3 | av午夜电影 | 国产精品视频地址 | 日韩一级精品 | 日日夜日日干 | 午夜成人影视 | 中文字幕人成乱码在线观看 | 免费a视频在线观看 | 毛片无卡免费无播放器 | www.亚洲激情.com | 中文字幕在线观看一区二区三区 | 国产精品精品国产色婷婷 | 波多野结衣动态图 | 日韩欧美在线一区 | 色老板在线 | 久久激情综合网 | 五月婷婷开心中文字幕 | 亚洲人在线7777777精品 | 久久手机免费观看 | 超碰最新网址 | 久久精品黄色 | 黄色一级在线视频 | 五月婷婷视频在线 | 在线国产能看的 | 99爱国产精品 | 黄色片视频在线观看 | 91超碰在线播放 | 色视频在线免费 | 国产在线一区二区三区播放 | 国产视频2| av福利网址导航 | 国产91在线播放 | 色综合久久久久综合99 | 亚洲激情中文 | 精品在线视频一区二区三区 | 久久6精品 | 色久av| 国产一区在线观看视频 | av九九九 | 欧美日韩在线视频免费 | 久久亚洲私人国产精品va | 丁香五月网久久综合 | 久久高清| 最新真实国产在线视频 | 中文一区二区三区在线观看 | 69久久夜色精品国产69 | 国产午夜精品一区二区三区嫩草 | 亚洲在线观看av | 人人爽人人香蕉 | www黄免费| 日本高清xxxx | 狠狠干干 | 五月激情丁香婷婷 | 国产精品久久二区 | 日韩黄色免费 | 日韩av在线免费看 | 精品国产伦一区二区三区观看说明 | 一区二区三高清 | 国内丰满少妇猛烈精品播放 | 日韩久久精品一区二区三区 | 国产一区二区三区高清播放 | 婷婷综合影院 | 91在线看视频免费 | 97免费在线观看视频 | 欧美精品999| 日本性高潮视频 | 天天干,天天插 | 亚洲最新av在线网址 | 亚洲视频第一页 | 欧美肥妇free | 精品电影一区 | 毛片视频网址 | 婷婷色在线 | 五月婷婷综 | 国产精品高清在线 | 在线日韩亚洲 | 91亚洲欧美激情 | av电影免费在线看 | 韩日视频在线 | 午夜久久福利影院 | 激情婷婷亚洲 | 中文在线a在线 | 欧美一级久久 | 成人精品国产免费网站 | 免费av一级电影 | 国产精品热 | 五月婷婷久久综合 | 日韩高清一二区 | 亚洲国产大片 | 欧美激情精品久久久久久变态 | 91视频高清免费 | 久久精品99国产精品亚洲最刺激 | 亚洲一区 av | 亚洲精品男人的天堂 | 97**国产露脸精品国产 | 国产精品久久久毛片 | 高清美女视频 | 国产大片免费久久 | 999视频在线播放 | 免费的黄色av | 欧美性生活久久 | 亚洲 欧美 变态 国产 另类 | 久久国产经典视频 | 在线观看精品一区 | 99热精品在线 | 天天激情综合 | 婷婷深爱网 | 97在线看片 | 亚洲精品小视频 | 日本黄区免费视频观看 | 久草香蕉在线 | 九草视频在线观看 | 波多野结衣综合网 | 国产成人精品999在线观看 | 久久久穴 | 天天插日日射 | 天天综合网 天天综合色 | 久久a v视频 | 中文字幕刺激在线 | 亚洲一区天堂 | 欧美日韩aaaa| 成人免费在线观看电影 | 亚洲a成人v | 91激情在线视频 | 国产免费一区二区三区最新 | 亚洲精品久久久蜜臀下载官网 | 狠狠躁天天躁 | 中文字幕亚洲综合久久五月天色无吗'' | 九九热.com | 日韩欧美在线观看一区 | 国产精品 视频 | 亚洲三级性片 | 日韩精品一区在线播放 | 亚州性色 | 日韩视频1区 | 午夜精品一区二区三区在线观看 | 日韩av不卡播放 | 最近中文字幕免费观看 | 四虎永久网站 | 一级片色播影院 | 成人a免费看 | 欧美淫视频 | 999男人的天堂 | 久久久久久久久久久影院 | av电影免费在线播放 | 嫩草伊人久久精品少妇av | 婷婷色站 | 午夜精品久久久久久久久久久久 | 在线免费黄色av | 99久久电影 | 日本成人a | 国产欧美日韩精品一区二区免费 | www.夜夜操 | 久草在线高清 | 91传媒在线 | 国产在线永久 | 久久久久国产视频 | 天天操操操操操操 | 91av九色 | 成人黄色免费观看 | 国产一区精品在线 | 免费看国产一级片 | 欧美久久久一区二区三区 | 人人要人人澡人人爽人人dvd | 8x成人在线 | 国产不卡一二三区 | 国产中文在线播放 | 中文字幕亚洲欧美 | 六月丁香激情综合色啪小说 | 国产高清av在线播放 | 国产精品视频永久免费播放 | 日本高清免费中文字幕 | 最新av电影网址 | 免费电影一区二区三区 | 精品无人国产偷自产在线 | 欧美激情综合五月色丁香 | 久草久热| 中文字幕免费国产精品 | 91av资源在线| 国产免费又黄又爽 | 天天插天天操天天干 | 亚洲精品小视频 | 99热在线观看免费 | 久久精品国亚洲 | 久久精品电影 | 91成人免费看片 | 国产精品9999久久久久仙踪林 | 亚洲理论电影 | 18性欧美xxxⅹ性满足 | 久久激情网站 | 91九色蝌蚪视频在线 | 欧美日韩另类在线观看 | 日日草夜夜操 | 日韩亚洲欧美中文字幕 | 96国产精品视频 | 色婷婷综合成人av | 伊人婷婷在线 | 欧美性脚交 | 亚洲精品麻豆视频 | 日韩欧美高清视频在线观看 | 国产理论一区二区三区 | 久草在线视频网站 | 日韩在线短视频 | 色偷偷网站视频 | 麻豆免费看片 | 久久伊人热 | 免费国产黄线在线观看视频 | 久久精品一区二区三区中文字幕 | 99久久这里有精品 | 欧美一级免费黄色片 | 韩国av电影网 | 亚洲 精品在线视频 | 久草在线视频网站 | 国产小视频在线观看免费 | 欧美一级在线 | 91超碰免费在线 | 91中文字幕在线观看 | 九七视频在线 | 81国产精品久久久久久久久久 | 天天天干天天天操 | 黄污视频大全 | 国产成人精品一区二区在线观看 | 日韩精品在线观看av | 在线观看91精品视频 | 久久无码精品一区二区三区 | 激情久久网 | 嫩草伊人久久精品少妇av | 97在线资源| 在线观看av片 | 婷婷伊人五月 | 91亚色免费视频 | 五月婷丁香 | 国产亚洲精品久久久久久网站 | 免费国产黄线在线观看视频 | 亚洲韩国一区二区三区 | 天天干天天搞天天射 | 欧美永久视频 | 91爱爱免费观看 | 欧美成人精品三级在线观看播放 | 韩日av在线 | 色99在线| 国产精品久久久久久久久久久免费 | 五月婷婷一级片 | 96国产在线| 四虎国产精品成人免费影视 | 国产精品一级在线 | 国产亚洲成人精品 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 在线观看 国产 | 久久午夜网| 播五月综合 | 在线观看视频亚洲 | 三级黄色大片在线观看 | 国产精品日韩欧美 | 麻豆果冻剧传媒在线播放 | 在线观看免费黄视频 | 成人av资源网站 | 欧美一级片免费观看 | 亚洲国产精久久久久久久 | 在线视频久 | 欧美色精品天天在线观看视频 | av在线官网 | 国产精品视频资源 | 久草久草视频 | 国内精品久久久久久久久久 | 日日弄天天弄美女bbbb | 久久久久综合精品福利啪啪 | 午夜天天操 | 91色在线观看 | 91av免费观看 | 国产精品毛片久久久 | 国产明星视频三级a三级点| 久久免费视频一区 | 精品国产一区二区三区久久久蜜臀 | 激情在线网址 | 国产亚洲久一区二区 | 97人人看 | 97超碰人人看 | 久久99久久精品 | 9999国产| 极品嫩模被强到高潮呻吟91 | 伊人五月 | 十八岁免进欧美 | 韩国一区二区三区在线观看 | 欧美视频不卡 | 久久久精品综合 | 97在线观看 | 日本久久久精品视频 | 4438全国亚洲精品观看视频 | 91久久偷偷做嫩草影院 | 亚洲在线视频观看 | 久久99精品热在线观看 | 国产精品乱码一区二区视频 | 色综合久久久久久久 | 久久精品中文字幕一区二区三区 | 在线视频手机国产 | 国产91精品久久久久 | 国产精品毛片一区视频播 | 蜜臀av性久久久久蜜臀av | 国产黑丝一区二区三区 | 成人黄色免费在线观看 | 亚洲黄色大片 | 激情综合五月天 | 极品美女被弄高潮视频网站 | 24小时日本在线www免费的 | 在线观看黄色免费视频 | 婷婷综合五月天 | 日韩影视在线观看 | 91在线视频在线观看 | 日韩免费电影网 | 国产麻豆精品95视频 | 亚洲国产精品99久久久久久久久 | 中文字幕在线观看亚洲 | 欧美专区亚洲专区 | 91精品国产99久久久久久久 | 国产精品影音先锋 | 国产视频综合在线 | 欧美大荫蒂xxx | 久久久国产精品视频 | 国产九九热 | 岛国av在线不卡 | 精品国产理论片 | 国产精品久久片 | 亚洲精品乱码久久久久久 | 久久精品亚洲精品国产欧美 | 国产福利一区在线观看 | 人人干天天干 | 91成人在线视频观看 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 中文字幕av电影下载 | 五月综合网站 | 国产在线观看一区 | 中文字幕在线视频精品 | 狠狠色噜噜狠狠 | 亚洲精品国产区 | 日本久久成人中文字幕电影 | 中文字幕影片免费在线观看 | 四虎影视国产精品免费久久 | 一本一本久久a久久精品综合小说 | 91精品国产综合久久婷婷香蕉 | 人人草人人草 | 又湿又紧又大又爽a视频国产 | 91日韩在线专区 | 久久热首页 | 午夜精品久久久久久久久久 | 久草电影免费在线观看 | 国产高清一区二区 | 色综合久久久久久久久五月 | 99热最新网址| 国产无限资源在线观看 | 久久久久久久久综合 | 亚洲婷婷综合色高清在线 | 成人影片免费 | 国产亚洲婷婷 | 九九九九热精品免费视频点播观看 | 久久久久久高潮国产精品视 | 国产一区影院 | 久久久久高清 | 精品国产一二三四区 | 777视频在线观看 | 五月网婷婷 | 在线观看免费黄色 | 91成版人在线观看入口 | 国产1级毛片 | 一区二区精品在线观看 | 国产va精品免费观看 | 色资源中文字幕 | 午夜久久福利影院 | 午夜精品久久久久久 | 色综合久久五月天 | 日韩av中文字幕在线免费观看 | 日韩精品网址 | 青草视频网 | 黄色小说18 | 欧美成人播放 | 久久久久久久久久亚洲精品 | 亚洲精品久久久蜜桃直播 | 亚洲欧洲一区二区在线观看 | 超碰公开在线观看 | 黄色激情网址 | 婷婷六月天综合 | 日韩免费高清在线观看 | 国产精品网红直播 | 亚洲成人免费观看 | 久久呀 | 久久男人免费视频 | 婷婷六月天天 | 免费a v在线| 青青河边草免费视频 | 国产精品免费视频久久久 | 深爱激情五月综合 | av观看免费在线 | 综合久久综合久久 | 成人在线视频你懂的 | 久久精品这里精品 | 色婷婷成人 | 天天干天天插 | 奇米影音四色 | 99久久综合狠狠综合久久 | 国产字幕在线播放 | 综合av在线| 成人三级视频 | 日韩素人在线观看 | www.综合网.com | 97人人模人人爽人人喊网 | 99久久精品久久久久久动态片 | 91免费高清 | 激情喷水 | 日韩欧美在线观看一区二区 | 狠狠色丁香婷婷综合久小说久 | 91av电影在线观看 | 91精品秘密在线观看 | 国产中文字幕在线看 | 久章操 | 欧美性色综合 | 在线视频电影 | 亚洲精品在线视频播放 | 日韩精品免费一线在线观看 | 在线v片免费观看视频 | 米奇影视7777 | 久久久久国产成人免费精品免费 | 黄色天堂在线观看 | 日本中文在线播放 | 久久久精品免费观看 | av在线进入| 夜夜操夜夜干 | 操操综合 | 欧美淫视频 | 久久综合之合合综合久久 | 久久只精品99品免费久23小说 | 亚洲在线高清 | 操操操干干干 | av久久在线 | 久久夜色精品国产欧美一区麻豆 | 九九久久久久久久久激情 | 国产精品久久99综合免费观看尤物 | 国产又粗又长又硬免费视频 | 久久久96| 色综合色综合久久综合频道88 | 91在线观看高清 | 国产精品高潮呻吟久久久久 | 久久精品视频免费观看 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 久久中文欧美 | 激情丁香在线 | 98涩涩国产露脸精品国产网 | 99热只有精品在线观看 | 天天干天天操天天拍 | 天天天综合 | 成人毛片网 | 91九色成人蝌蚪首页 | 国产黄色大片 | 日韩av电影一区 | 欧美日韩后 | 福利网在线 | 日韩一区精品 | 99久久精品免费看 | 大荫蒂欧美视频另类xxxx | 国产色综合天天综合网 | 久久99热久久99精品 | 五月天亚洲婷婷 | 国产精品久久久久婷婷 | 91久久精品一区二区三区 | 午夜三级大片 | 超碰国产在线播放 | 国产网红在线观看 | 欧美a√在线 | 91精品国自产拍天天拍 | 91av小视频| 久久精品视频在线观看 | 亚洲精品自拍 | 午夜av在线播放 | 成年人免费看的视频 | 中文字幕有码在线 | 九九免费在线观看视频 | 国产日产精品一区二区三区四区 | 国产精品久久久久毛片大屁完整版 | 欧美色黄| 亚洲精品久久久蜜臀下载官网 | 久久久国产一区二区三区四区小说 | 欧美做受xxx | 国产精品视频99 | 色妞色视频一区二区三区四区 | 91看片在线看片 | 日韩精品一区二区在线观看 | 黄网站色欧美视频 | 精品国产1区 | 天天射综合网视频 | 亚洲精品影视在线观看 | 热99久久精品 | 国产国产人免费人成免费视频 | 日一日干一干 | 91久久精品一区二区二区 | 黄色免费视频在线观看 | 日韩av电影国产 | 天天射天天干天天操 | 婷婷av综合 | 成人黄色一级视频 | 久久精品影视 | 波多野结衣精品视频 | 国产精品99在线观看 | 91av社区| 亚洲视频观看 | 97超碰人人澡 | 97超级碰碰碰视频在线观看 | 婷婷丁香狠狠爱 | 亚洲国产大片 | 久久91网 | 激情综合色综合久久 | h动漫中文字幕 | 亚洲a资源 | 91精品伦理| 久久精品8 | 婷婷国产v亚洲v欧美久久 | 最近中文字幕完整视频高清1 | a成人v在线 | 午夜精品福利影院 | 日韩精品视频一二三 | 国产伦理久久精品久久久久_ | 亚洲精品一区二区精华 | 国产97av| 欧美日韩高清一区 | 久久国产精品一区二区三区 | 手机在线日韩视频 | 国产一区二区在线影院 | 亚洲伊人成综合网 | 色噜噜日韩精品一区二区三区视频 | 欧美国产日韩中文 | 色狠狠婷婷 | 亚洲一区日韩 | 在线一级片 | 欧美日韩精品综合 | 国产精品黑丝在线观看 | 91成人精品一区在线播放69 | 天天射日| 免费h视频| 国产精品6999成人免费视频 | 91社区国产高清 | 成人黄色一级视频 | 日韩一区二区三区免费视频 | 亚洲欧美国内爽妇网 | 午夜私人影院久久久久 | 玖玖综合网 | 97超碰成人 | 国产精品一区二区av日韩在线 | 日本中文字幕在线一区 | 精品一区电影 | 国内成人精品视频 | 久久五月天综合 | 97超碰中文字幕 | 最近高清中文字幕在线国语5 | 色婷婷国产精品一区在线观看 | 99视频+国产日韩欧美 | 亚洲精品日韩一区二区电影 | 啪啪小视频网站 | 狠狠狠色丁香婷婷综合久久88 | 成人黄色片免费 | 综合网婷婷 | 丰满少妇在线 | 成人9ⅰ免费影视网站 | 在线观看深夜福利 | 国产又粗又硬又爽视频 | 6080yy午夜一二三区久久 | 日韩色高清 | 精品国产区 | 丰满少妇一级片 | 天天爱天天操天天爽 | 国产一区二区不卡在线 | 免费男女羞羞的视频网站中文字幕 | 欧美视频在线观看免费网址 | 国产破处在线播放 | 亚洲精品456在线播放第一页 | 精品在线播放视频 | 久草干 | 午夜精品99久久免费 | 黄色三级在线看 | 国产亚洲激情视频在线 | 精品久久五月天 | 日韩在线视频一区 | 亚洲精区二区三区四区麻豆 | 国产69精品久久久久99 | 91精品对白一区国产伦 | 在线三级av | 人人澡人人爽欧一区 | 亚洲免费在线视频 | 涩涩网站在线播放 | 中文字幕资源站 | 在线观看av的网站 | 91亚洲精品久久久久图片蜜桃 | 国产福利小视频在线 | 婷婷在线视频 | 国产精品va在线播放 | 伊人成人激情 | 天天爱天天射天天干天天 | 日韩午夜电影网 | 久久综合一本 | 亚洲一区日韩在线 | 中文字幕在线观看一区二区三区 | 免费中文字幕在线观看 | 久久精品国产美女 | 久久久久在线视频 | 日韩视频专区 | 九九久 | 国产九色在线播放九色 | 免费成人在线视频网站 | 久久综合五月天婷婷伊人 | 欧美色黄 | 亚州精品在线视频 | 久久激情精品 | 天天天天综合 | 久久视频国产 | 国产精品免费小视频 | 日韩高清无线码2023 | 香蕉色综合 | 国产精品99久久久久的智能播放 | 婷婷视频导航 | 欧美不卡视频在线 | 色婷婷电影 | 国产一区二区精品久久 | 日韩激情在线视频 | 人人狠狠综合久久亚洲婷 | 毛片网站免费在线观看 | 麻豆传媒在线免费看 | 亚洲在线视频网站 | 最近日本mv字幕免费观看 | www.av免费 | 国产成人精品久久久 | 亚洲精品视频免费看 | 国产精品久久一区二区三区, | 日本久久久久久久久久 | 国产人在线成免费视频 | 欧美在线观看视频一区二区三区 | 成人综合免费 | 夜夜躁天天躁很躁波 | 国产一级免费播放 | 免费在线观看成年人视频 | 日本黄色大片儿 | 黄色a视频 | 91九色porn在线资源 | 久久久一本精品99久久精品 | 少妇bbw揉bbb欧美 | 四虎在线免费观看视频 | 亚洲在线视频播放 | 亚洲国产精品500在线观看 | 欧美另类tv | 99视频在线精品国自产拍免费观看 | 日韩羞羞 | 青草视频在线免费 | www.久久免费 | 国产午夜一级毛片 | 欧美日韩视频免费 | 中文网丁香综合网 | 久久99精品国产91久久来源 | 国产精品一区专区欧美日韩 | 国产网站在线免费观看 | 亚洲不卡123 | 中文字幕网站 | 国产在线观看免费 | 麻豆影音先锋 | 天天精品视频 | 欧美日韩综合在线观看 | 激情综合亚洲 | 综合天天网| 日韩理论电影在线观看 | 日本天天操 | 99精品久久久久久久久久综合 | 国产一及片 | 99精品热视频只有精品10 | 亚洲影院天堂 | 亚洲视频分类 | www.黄色| 欧美国产大片 | 天天操天天是 | 亚洲高清在线精品 | 亚洲国产经典视频 | 香蕉网址 | 欧美日韩精品在线观看 | 国产超碰在线观看 | 国产中文字幕网 | 粉嫩一区二区三区粉嫩91 | 在线免费看黄色 | 成人一级片在线观看 | 手机色在线 | 热久久精品在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久99国产精品二区护士 | 日韩一区二区免费在线观看 | 99热日本| 欧美精品一区二区三区四区在线 | 香蕉久草 | 最近中文字幕在线中文高清版 | 91av蜜桃| 在线观看国产福利片 | 超碰97网站 | 国产午夜精品免费一区二区三区视频 | 麻豆国产精品va在线观看不卡 | 国产正在播放 | 天天要夜夜操 | 欧美经典久久 | 日韩精品一区二区在线视频 | 国产午夜免费视频 | 国产一级在线看 | 日本特黄一级片 | 国产亚洲成人网 | 天天爱天天干天天爽 | 色婷婷狠狠| 最新超碰在线 | 日韩欧美视频免费看 | 狠狠色婷婷丁香六月 | www.亚洲视频.com | av免费线看| 999男人的天堂 | 久久久久久久综合色一本 | 中文在线a∨在线 | 国产人在线成免费视频 | 99视频久久 | 亚洲综合情 | 天堂在线一区二区三区 | 久久婷婷一区 | 九草在线视频 | 天天干天天摸天天操 | 亚洲国产精品传媒在线观看 | 91视频免费网站 | 欧洲精品二区 | 欧美性粗大hdvideo | 欧美日韩精品在线免费观看 | www激情com| 国产亚洲人成网站在线观看 | 97天天干 | av 一区 二区 久久 | 久精品在线观看 | 激情五月在线观看 | 91丨九色丨国产丨porny精品 | av久久久久久 | 日日夜夜人人精品 | 狠狠干2018 | 日本最新一区二区三区 | 久久精品第一页 | 国产一区欧美日韩 | 久久久久久久久久久高潮一区二区 | 91视频88av | 国产亚洲精品中文字幕 | 九九色网| 免费av在线播放 | 亚洲精品在线一区二区 | 日本丶国产丶欧美色综合 | 在线观看aaa| 国产精品美女免费看 | 日韩免费av在线 | 天天干.com | 黄色精品一区二区 | 2021国产在线视频 | 亚州中文av | 日韩欧美精品在线观看 | 日韩高清一区二区 | 免费视频久久久久久久 | 免费日p视频 | 在线中文字幕电影 | 日韩www在线| 亚洲精品乱码久久久久久蜜桃欧美 | 性色av一区二区三区在线观看 | 最新免费av在线 | 精品免费久久久久久 | 亚洲日本中文字幕在线观看 | 黄色软件在线观看 | 成人久久18免费网站 | 日韩18p| 日韩av手机在线观看 | 国产精品不卡 | 国产资源中文字幕 | 免费在线观看污网站 | av日韩在线网站 | 久国产在线播放 | 91精品国产综合久久婷婷香蕉 | 五月天中文字幕mv在线 | 免费亚洲婷婷 | 2024国产精品视频 | 五月婷在线观看 | 国产日韩精品一区二区三区在线 | 综合中文字幕 | 国产在线91在线电影 | 久久久精品国产免费观看一区二区 | 中文字幕专区高清在线观看 | 在线观看国产高清视频 | 99久久精品国产系列 | 成人欧美一区二区三区在线观看 | www黄色av| 亚洲精品xxxx| 色人久久 | 日韩av成人免费看 | 日韩免费av在线 | av蜜桃在线| 亚洲精品国 | 亚洲精品国精品久久99热一 | 国产在线v | 亚洲一区二区三区毛片 | 国产一级黄色av | 国产精品嫩草55av | 久久久天天操 | 国产美女视频免费观看的网站 | 手机看片99 | 黄色a大片| 射九九| 欧美在线不卡一区 | 天天操天天草 | 亚洲天堂网视频在线观看 | 99热99| 欧美激情综合五月色丁香小说 | 久久99偷拍视频 | 国产精品九九热 | 麻豆国产精品视频 | 五月天婷婷视频 | 亚洲影视九九影院在线观看 | 天天操天天操一操 | 欧美色图东方 | 激情欧美国产 | 麻豆播放| 精品超碰 | 久久久久高清 | 在线日韩中文 | 成人免费在线视频 | 亚洲va欧美va人人爽 | 成年人网站免费观看 | 国产原厂视频在线观看 | 亚洲精品欧美成人 | 精品一二三四在线 | 中文字幕最新精品 | 久色小说 | 激情综合交 | 国产精品久久久久久久久久不蜜月 | 日本激情视频中文字幕 | 夜夜婷婷 | 麻豆传媒视频在线 | 日日碰狠狠躁久久躁综合网 | 日韩欧美在线高清 | 久久国产精品99精国产 | 精品国产乱码久久久久久久 | 国产亚洲精品日韩在线tv黄 | 在线观看黄色免费视频 | 亚洲国产成人精品在线 | 国产麻豆精品免费视频 | 国内视频在线 | 国产精品久久久久三级 | 国产精品青草综合久久久久99 | 日韩欧美在线观看 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久久久久久久久免费 | 精品色999| 日韩电影一区二区三区 | 欧美影片 | 福利在线看片 | 成人一级免费电影 | 天天插天天狠天天透 | 爱爱av在线| 激情综合交| 国精产品999国精产品视频 | 在线黄频 | 波多野结衣在线观看一区 | 东方av在线免费观看 | 国产精品免费视频网站 | 午夜av免费看 | 久久草草影视免费网 | 黄色特级片 | 久久九九免费视频 | 国产精品黄色在线观看 | 国产日韩在线看 | 亚洲综合在线观看视频 | 欧美伦理一区 | 99久久99视频 | 成人在线播放av | 一区二区三区四区在线免费观看 | 天天拍天天操 | 国产精品久久久久久99 | 91成人午夜 | 99re久久精品国产 | 中文字幕无吗 | 天天射射天天 | 中文字幕在线观看视频网站 | 日韩欧美在线中文字幕 | 亚洲天堂va | av中文资源在线 | 91视频午夜| 91久久国产露脸精品国产闺蜜 | 亚洲午夜精品一区二区三区电影院 | 人人爽久久久噜噜噜电影 | 精品国产伦一区二区三区观看体验 | 亚洲人成在线观看 | 99久久精品久久久久久动态片 | 午夜久久美女 | 亚洲欧美日韩国产精品一区午夜 | 久久99国产综合精品 | 91在线免费视频观看 | 91在线91拍拍在线91 |